[ADD] simple and complex enemies

This commit is contained in:
SemvdH
2021-08-24 23:26:30 +02:00
parent 616e1db466
commit 1f4265875c
4 changed files with 92 additions and 27 deletions

View File

@@ -1,3 +1,14 @@
/*
Cybershot ps vita main.c
Made by Sem van der Hoeven
*/
//TODO tweak values
//TODO create start screen
//TODO make old school windows style interface / buttons etc
//TODO create ship color select ?
//TODO game over screen
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -13,13 +24,12 @@
#include "system/timing.h"
#include "system/control_input.h"
// 14 april 2021: 11:00-15:00
#define printf psvDebugScreenPrintf
#define SCREEN_HEIGTH 544
#define SCREEN_WIDTH 940
#define SIMPLE_ENEMY_MAX_AMOUNT 20
#define ENEMY_MAX_AMOUNT 40
#define BULLET_MARGIN 5.0 // extra hitbox space to make sure bullets hit
#define MENU_SWITCH_DELAY 50 // delay in ms for when a menu screen is switched.
@@ -52,9 +62,10 @@ SceKernelSysClock sysclock;
timing_timer bullet_timer = {0, 250, 0}; // 0 as starting time, 250 ms timeout, not elapsed
timing_timer menu_switch_input_delay_timer = {0, 200, 0}; // 0 as starting time, 100 ms timeout, not elapsed
timing_timer score_timer = {0, 100, 0}; // timer to update score
timing_timer enemy_spawn_timer = {0, 500, 0}; // timer to spawn a new enemy
timing_timer simple_enemy_spawn_timer = {0, 500, 0}; // timer to spawn a new simple enemy
timing_timer complex_enemy_spawn_timer = {0, 2000, 0}; // timer to spawn a new complex enemy
ENEMY_SPRITE enemies[SIMPLE_ENEMY_MAX_AMOUNT];
ENEMY_SPRITE enemies[ENEMY_MAX_AMOUNT];
uint32_t enemy_count;
int score;
@@ -115,7 +126,13 @@ void init_sprites()
// add simple enemies
for (i = 0; i < SIMPLE_ENEMY_MAX_AMOUNT; i++)
{
ENEMY_SPRITE e = {NONACTIVE, SIMPLE, 0,0, SIMPLE_ENEMY_COLOR, SIMPLE_ENEMY_MOVEMENT_SPEED};
ENEMY_SPRITE e = {NONACTIVE, SIMPLE, 0, 0, SIMPLE_ENEMY_COLOR, SIMPLE_ENEMY_MOVEMENT_SPEED, SIMPLE_ENEMY_SCORE};
enemies[i] = e;
enemy_count++;
}
for (i = SIMPLE_ENEMY_MAX_AMOUNT; i < ENEMY_MAX_AMOUNT; i++)
{
ENEMY_SPRITE e = {NONACTIVE, COMPLEX, 0, 0, COMPLEX_ENEMY_COLOR, COMPLEX_ENEMY_MOVEMENT_SPEED, COMPLEX_ENEMY_SCORE};
enemies[i] = e;
enemy_count++;
}
@@ -149,6 +166,17 @@ void generate_smoke_particle()
current_smoke_particle = (current_smoke_particle + 1) % 254;
}
/**
* @brief generates an enemy
*
* @param enemy the enemy to generate
*/
void generate_enemy(ENEMY_SPRITE *enemy)
{
enemy->active = ACTIVE;
enemy->x = toolbox_random_float(0, SCREEN_WIDTH - 1);
enemy->y = 0;
}
/**
* @brief generates a simple enemy
*
@@ -159,9 +187,23 @@ void generate_simple_enemy()
{
if (enemies[i].active == NONACTIVE)
{
enemies[i].active = ACTIVE;
enemies[i].x = toolbox_random_float(0, SCREEN_WIDTH - 1);
enemies[i].y = 0;
generate_enemy(&enemies[i]);
break;
}
}
}
/**
* @brief generates a complex enemy
*
*/
void generate_complex_enemy()
{
for (int i = SIMPLE_ENEMY_MAX_AMOUNT; i < ENEMY_MAX_AMOUNT; i++)
{
if (enemies[i].active == NONACTIVE)
{
generate_enemy(&enemies[i]);
break;
}
}
@@ -235,19 +277,16 @@ void check_bullet_collisions()
{
if (enemies[e].active == ACTIVE)
{
if (enemies[e].enemy_type == SIMPLE)
for (int b = 0; b < 255; b++)
{
for (int b = 0; b < 255; b++)
if (bullets[b].active == ACTIVE)
{
if (bullets[b].active == ACTIVE)
if (bullet_hit_enemy(&bullets[b], &enemies[e]))
{
if (bullet_hit_enemy(&bullets[b], &enemies[e]))
{
bullets[b].active = NONACTIVE;
enemies[e].active = NONACTIVE;
score += 100;
break;
}
bullets[b].active = NONACTIVE;
enemies[e].active = NONACTIVE;
score += enemies[e].score;
break;
}
}
}
@@ -333,8 +372,10 @@ void update_game()
timing_check_timer_elapsed(&bullet_timer);
timing_update_timer(&score_timer, deltaTime);
timing_check_timer_elapsed(&score_timer);
timing_update_timer(&enemy_spawn_timer, deltaTime);
timing_check_timer_elapsed(&enemy_spawn_timer);
timing_update_timer(&simple_enemy_spawn_timer, deltaTime);
timing_check_timer_elapsed(&simple_enemy_spawn_timer);
timing_update_timer(&complex_enemy_spawn_timer, deltaTime);
timing_check_timer_elapsed(&complex_enemy_spawn_timer);
if (cross_pressed)
{
@@ -390,18 +431,24 @@ void update_game()
smoke_particles[i].active = 0;
}
if (enemy_spawn_timer.elapsed)
if (simple_enemy_spawn_timer.elapsed)
{
generate_simple_enemy();
enemy_spawn_timer.elapsed = 0;
simple_enemy_spawn_timer.elapsed = 0;
}
for (int i = 0; i < SIMPLE_ENEMY_MAX_AMOUNT; i++)
if (complex_enemy_spawn_timer.elapsed)
{
generate_complex_enemy();
complex_enemy_spawn_timer.elapsed = 0;
}
for (int i = 0; i < ENEMY_MAX_AMOUNT; i++)
{
if (enemies[i].active == ACTIVE)
{
enemies[i].y += enemies[i].movement_speed;
if (enemies[i].y >= SCREEN_HEIGTH + SIMPLE_ENEMY_SIZE)
if (enemies[i].y >= SCREEN_HEIGTH + COMPLEX_ENEMY_SIZE) // complex enemy is biggest
{
enemies[i].active = NONACTIVE;
}
@@ -508,6 +555,11 @@ void draw_game()
char score_text[40];
sprintf(score_text, "score: %07d", score);
vita2d_pvf_draw_text(pvf, 700, 100, RGBA8(0, 255, 0, 255), 1.0f, score_text);
for (int i = 0; i < 10; i++)
{
vita2d_draw_rectangle(i, i, SCREEN_WIDTH - 2*i, SCREEN_HEIGTH - 2*i,RGBA8(98, 124, 158,255));
}
}
void draw_gameover()

View File

@@ -2,7 +2,7 @@
#define printf psvDebugScreenPrintf
void (*enemy_draw_functions[2])(ENEMY_SPRITE *enemy_sprite) = {sprites_draw_simple_enemy, sprites_draw_complex_enemy};
void (*enemy_draw_functions[2])(ENEMY_SPRITE *enemy_sprite) = {sprites_draw_simple_enemy, sprites_draw_complex_enemy}; // function pointers to enemy draw functions
void sprites_draw_bullet(BULLET *bullet)
{
@@ -47,6 +47,7 @@ void sprites_draw_enemy(ENEMY_SPRITE *enemy)
{
(*enemy_draw_functions[enemy->enemy_type])(enemy);
}
}
void sprites_draw_simple_enemy(ENEMY_SPRITE *enemy)
@@ -59,4 +60,8 @@ void sprites_draw_simple_enemy(ENEMY_SPRITE *enemy)
void sprites_draw_complex_enemy(ENEMY_SPRITE *enemy)
{
// vita2d_draw_fill_circle(enemy->x, enemy->y, 5, COMPLEX_ENEMY_SECONDARY_COLOR);
vita2d_draw_line(enemy->x - 8, enemy->y - 6, enemy->x + 8, enemy->y - 6, COMPLEX_ENEMY_COLOR);
vita2d_draw_line(enemy->x + 8, enemy->y - 6, enemy->x, enemy->y + 8, COMPLEX_ENEMY_COLOR);
vita2d_draw_line(enemy->x, enemy->y + 8, enemy->x - 8, enemy->y - 6, COMPLEX_ENEMY_COLOR);
}

View File

@@ -25,9 +25,15 @@
#define PLAYER_Y_OFFSET (PLAYER_HEIGTH / 2) // the center y of the player is in the middle
#define SIMPLE_ENEMY_SIZE 9.0
#define SIMPLE_ENEMY_MOVEMENT_SPEED 1.5
#define SIMPLE_ENEMY_MOVEMENT_SPEED 3.0
#define SIMPLE_ENEMY_COLOR (RGBA8(245, 90, 66, 255))
#define COMPLEX_ENEMY_SIZE 9.0
#define SIMPLE_ENEMY_SCORE 100
#define COMPLEX_ENEMY_SIZE 12.0
#define COMPLEX_ENEMY_MOVEMENT_SPEED 5.0
#define COMPLEX_ENEMY_COLOR (RGBA8(177, 235, 52,220))
#define COMPLEX_ENEMY_SECONDARY_COLOR (RGBA8(152, 83, 181, 255))
#define COMPLEX_ENEMY_SCORE 500
#define SMOKE_START_RADIUS 8.0
#define SMOKE_MAX_RADIUS 10.0
@@ -66,6 +72,7 @@ typedef struct enemy_sprite_t
float y; // the center y position
unsigned int color; // color of the sprite
float movement_speed; // speed of the sprite (how much it should move each frame)
int score; // score you get when you kill an enemy
} ENEMY_SPRITE;
typedef struct smoke_particle_t

View File

@@ -43,4 +43,5 @@ void timing_update_timer(timing_timer* timer, SceUInt64 dt);
* @return uint8_t 0 if false, nonzero if true
*/
uint8_t timing_check_timer_elapsed(timing_timer* timer);
#endif