[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 <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()
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user