diff --git a/src/main.c b/src/main.c index 55deee6..86cce72 100644 --- a/src/main.c +++ b/src/main.c @@ -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 #include #include @@ -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() diff --git a/src/sprites/sprites.c b/src/sprites/sprites.c index b6acd58..6f6b91d 100644 --- a/src/sprites/sprites.c +++ b/src/sprites/sprites.c @@ -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); } \ No newline at end of file diff --git a/src/sprites/sprites.h b/src/sprites/sprites.h index 5cf5e9d..df0d2a0 100644 --- a/src/sprites/sprites.h +++ b/src/sprites/sprites.h @@ -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 diff --git a/src/system/timing.h b/src/system/timing.h index 44a42a1..5b34f6c 100644 --- a/src/system/timing.h +++ b/src/system/timing.h @@ -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 \ No newline at end of file