[ADD] simple and complex enemies
This commit is contained in:
100
src/main.c
100
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 <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -13,13 +24,12 @@
|
|||||||
#include "system/timing.h"
|
#include "system/timing.h"
|
||||||
#include "system/control_input.h"
|
#include "system/control_input.h"
|
||||||
|
|
||||||
// 14 april 2021: 11:00-15:00
|
|
||||||
|
|
||||||
#define printf psvDebugScreenPrintf
|
#define printf psvDebugScreenPrintf
|
||||||
|
|
||||||
#define SCREEN_HEIGTH 544
|
#define SCREEN_HEIGTH 544
|
||||||
#define SCREEN_WIDTH 940
|
#define SCREEN_WIDTH 940
|
||||||
#define SIMPLE_ENEMY_MAX_AMOUNT 20
|
#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 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.
|
#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 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 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 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;
|
uint32_t enemy_count;
|
||||||
|
|
||||||
int score;
|
int score;
|
||||||
@@ -115,7 +126,13 @@ void init_sprites()
|
|||||||
// add simple enemies
|
// add simple enemies
|
||||||
for (i = 0; i < SIMPLE_ENEMY_MAX_AMOUNT; i++)
|
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;
|
enemies[i] = e;
|
||||||
enemy_count++;
|
enemy_count++;
|
||||||
}
|
}
|
||||||
@@ -149,6 +166,17 @@ void generate_smoke_particle()
|
|||||||
current_smoke_particle = (current_smoke_particle + 1) % 254;
|
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
|
* @brief generates a simple enemy
|
||||||
*
|
*
|
||||||
@@ -159,9 +187,23 @@ void generate_simple_enemy()
|
|||||||
{
|
{
|
||||||
if (enemies[i].active == NONACTIVE)
|
if (enemies[i].active == NONACTIVE)
|
||||||
{
|
{
|
||||||
enemies[i].active = ACTIVE;
|
generate_enemy(&enemies[i]);
|
||||||
enemies[i].x = toolbox_random_float(0, SCREEN_WIDTH - 1);
|
break;
|
||||||
enemies[i].y = 0;
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -235,19 +277,16 @@ void check_bullet_collisions()
|
|||||||
{
|
{
|
||||||
if (enemies[e].active == ACTIVE)
|
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;
|
||||||
bullets[b].active = NONACTIVE;
|
score += enemies[e].score;
|
||||||
enemies[e].active = NONACTIVE;
|
break;
|
||||||
score += 100;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -333,8 +372,10 @@ void update_game()
|
|||||||
timing_check_timer_elapsed(&bullet_timer);
|
timing_check_timer_elapsed(&bullet_timer);
|
||||||
timing_update_timer(&score_timer, deltaTime);
|
timing_update_timer(&score_timer, deltaTime);
|
||||||
timing_check_timer_elapsed(&score_timer);
|
timing_check_timer_elapsed(&score_timer);
|
||||||
timing_update_timer(&enemy_spawn_timer, deltaTime);
|
timing_update_timer(&simple_enemy_spawn_timer, deltaTime);
|
||||||
timing_check_timer_elapsed(&enemy_spawn_timer);
|
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)
|
if (cross_pressed)
|
||||||
{
|
{
|
||||||
@@ -390,18 +431,24 @@ void update_game()
|
|||||||
smoke_particles[i].active = 0;
|
smoke_particles[i].active = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (enemy_spawn_timer.elapsed)
|
if (simple_enemy_spawn_timer.elapsed)
|
||||||
{
|
{
|
||||||
generate_simple_enemy();
|
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)
|
if (enemies[i].active == ACTIVE)
|
||||||
{
|
{
|
||||||
enemies[i].y += enemies[i].movement_speed;
|
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;
|
enemies[i].active = NONACTIVE;
|
||||||
}
|
}
|
||||||
@@ -508,6 +555,11 @@ void draw_game()
|
|||||||
char score_text[40];
|
char score_text[40];
|
||||||
sprintf(score_text, "score: %07d", score);
|
sprintf(score_text, "score: %07d", score);
|
||||||
vita2d_pvf_draw_text(pvf, 700, 100, RGBA8(0, 255, 0, 255), 1.0f, score_text);
|
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()
|
void draw_gameover()
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#define printf psvDebugScreenPrintf
|
#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)
|
void sprites_draw_bullet(BULLET *bullet)
|
||||||
{
|
{
|
||||||
@@ -47,6 +47,7 @@ void sprites_draw_enemy(ENEMY_SPRITE *enemy)
|
|||||||
{
|
{
|
||||||
(*enemy_draw_functions[enemy->enemy_type])(enemy);
|
(*enemy_draw_functions[enemy->enemy_type])(enemy);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void sprites_draw_simple_enemy(ENEMY_SPRITE *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)
|
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);
|
||||||
}
|
}
|
||||||
@@ -25,9 +25,15 @@
|
|||||||
#define PLAYER_Y_OFFSET (PLAYER_HEIGTH / 2) // the center y of the player is in the middle
|
#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_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 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_START_RADIUS 8.0
|
||||||
#define SMOKE_MAX_RADIUS 10.0
|
#define SMOKE_MAX_RADIUS 10.0
|
||||||
@@ -66,6 +72,7 @@ typedef struct enemy_sprite_t
|
|||||||
float y; // the center y position
|
float y; // the center y position
|
||||||
unsigned int color; // color of the sprite
|
unsigned int color; // color of the sprite
|
||||||
float movement_speed; // speed of the sprite (how much it should move each frame)
|
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;
|
} ENEMY_SPRITE;
|
||||||
|
|
||||||
typedef struct smoke_particle_t
|
typedef struct smoke_particle_t
|
||||||
|
|||||||
@@ -43,4 +43,5 @@ void timing_update_timer(timing_timer* timer, SceUInt64 dt);
|
|||||||
* @return uint8_t 0 if false, nonzero if true
|
* @return uint8_t 0 if false, nonzero if true
|
||||||
*/
|
*/
|
||||||
uint8_t timing_check_timer_elapsed(timing_timer* timer);
|
uint8_t timing_check_timer_elapsed(timing_timer* timer);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
Reference in New Issue
Block a user