added attacks and the feather system
This commit is contained in:
parent
5635f5df55
commit
21915fc0df
10 changed files with 142 additions and 36 deletions
|
@ -2,8 +2,10 @@
|
|||
A dumb raylib test which you can play [here](https://canneddonuts.itch.io/avoid-the-game)
|
||||
|
||||
## To-do
|
||||
- build guide/better Makefile
|
||||
- fix the dumb bug when the ball gets stuck
|
||||
- a build guide
|
||||
- multiple stages
|
||||
- an options menu
|
||||
- a tutorial
|
||||
|
||||
## Preview
|
||||
![Alt Text](./doc-assets/preview.gif)
|
||||
![Alt Text](./doc-assets/preview.png)
|
||||
|
|
BIN
assets/sfx/boom.wav
Normal file
BIN
assets/sfx/boom.wav
Normal file
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 1.6 MiB |
BIN
doc-assets/preview.png
Normal file
BIN
doc-assets/preview.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.9 KiB |
|
@ -13,6 +13,7 @@
|
|||
#define INPUT_DOWN_PRESSED IsKeyPressed(KEY_DOWN) || IsGamepadButtonPressed(0, GAMEPAD_BUTTON_LEFT_FACE_DOWN)
|
||||
|
||||
#define INPUT_OPTION_PRESSED IsKeyPressed(KEY_ENTER) || IsGamepadButtonPressed(0, GAMEPAD_BUTTON_MIDDLE_RIGHT)
|
||||
#define INPUT_FIRE_PRESSED IsKeyPressed(KEY_Z) || IsGamepadButtonPressed(0, GAMEPAD_BUTTON_RIGHT_FACE_DOWN)
|
||||
|
||||
#define INPUT_LEFT_DOWN IsKeyDown(KEY_LEFT) || IsGamepadButtonDown(0, GAMEPAD_BUTTON_LEFT_FACE_LEFT)
|
||||
#define INPUT_RIGHT_DOWN IsKeyDown(KEY_RIGHT) || IsGamepadButtonDown(0, GAMEPAD_BUTTON_LEFT_FACE_RIGHT)
|
||||
|
|
148
src/Gameplay.c
148
src/Gameplay.c
|
@ -34,7 +34,7 @@ void InitGameplayScreen(void)
|
|||
};
|
||||
player.hitbox = (Rectangle) {
|
||||
0,
|
||||
50,
|
||||
100,
|
||||
(float) player_sprite.width/3,
|
||||
(float) player_sprite.height/2 + 5
|
||||
};
|
||||
|
@ -57,19 +57,20 @@ void InitGameplayScreen(void)
|
|||
|
||||
fxfeather = LoadSound("assets/sfx/feather.wav");
|
||||
feather_sprite = LoadTexture("assets/gfx/feather.png");
|
||||
heart.hitbox = (Rectangle) {
|
||||
feather.hitbox = (Rectangle) {
|
||||
GetRandomValue(0, GetScreenWidth() - feather_sprite.width),
|
||||
GetRandomValue(0, GetScreenHeight() - feather_sprite.height),
|
||||
(float) feather_sprite.width,
|
||||
(float) feather_sprite.height
|
||||
};
|
||||
heart.active = true;
|
||||
feather.active = true;
|
||||
feather.power = 0;
|
||||
|
||||
|
||||
firework_sprite = LoadTexture("assets/gfx/firework.png");
|
||||
for (int i = 0; i < MAX_FIREWORKS; i++) {
|
||||
fireworks[i].currentframe = 0;
|
||||
fireworks[i].speed = 300.0f;
|
||||
fireworks[i].hp = 0;
|
||||
fireworks[i].speed.x = 300.0f;
|
||||
fireworks[i].active = 0;
|
||||
fireworks[i].hitbox = (Rectangle) {
|
||||
630,
|
||||
GetRandomValue(0, GetScreenHeight()),
|
||||
|
@ -79,6 +80,22 @@ void InitGameplayScreen(void)
|
|||
fireworks[i].color = RAYWHITE;
|
||||
}
|
||||
|
||||
attack_sprite = LoadTexture("assets/gfx/attack.png");
|
||||
fxboom = LoadSound("assets/sfx/boom.wav");
|
||||
for (int i = 0; i < MAX_SHOOTS; i++) {
|
||||
shoot[i].hitbox = (Rectangle) {
|
||||
player.hitbox.x,
|
||||
player.hitbox.y,
|
||||
(float) attack_sprite.width,
|
||||
(float) attack_sprite.height
|
||||
};
|
||||
shoot[i].speed.x = 7;
|
||||
shoot[i].speed.y = 0;
|
||||
shoot[i].active = false;
|
||||
shoot[i].color = RED;
|
||||
}
|
||||
ammo = 0;
|
||||
|
||||
pause = 0;
|
||||
mute = false;
|
||||
DebugMode = 0;
|
||||
|
@ -93,7 +110,7 @@ void ResetGameplayScreen(void)
|
|||
player.hp = PLAYER_HP;
|
||||
player.hitbox = (Rectangle) {
|
||||
0,
|
||||
50,
|
||||
100,
|
||||
(float) player_sprite.width/3,
|
||||
(float) player_sprite.height/2 + 5
|
||||
};
|
||||
|
@ -112,18 +129,18 @@ void ResetGameplayScreen(void)
|
|||
(float) enemy_sprite.height
|
||||
};
|
||||
|
||||
heart.hitbox = (Rectangle) {
|
||||
feather.hitbox = (Rectangle) {
|
||||
GetRandomValue(0, GetScreenWidth() - feather_sprite.width),
|
||||
GetRandomValue(0, GetScreenHeight() - feather_sprite.height),
|
||||
(float) feather_sprite.width,
|
||||
(float) feather_sprite.height
|
||||
};
|
||||
heart.active = true;
|
||||
feather.active = true;
|
||||
feather.power = 0;
|
||||
|
||||
for (int i = 0; i < MAX_FIREWORKS; i++) {
|
||||
fireworks[i].currentframe = 0;
|
||||
fireworks[i].speed = 300.0f;
|
||||
fireworks[i].hp = 0;
|
||||
fireworks[i].speed.x = 300.0f;
|
||||
fireworks[i].active = 0;
|
||||
fireworks[i].hitbox = (Rectangle) {
|
||||
630,
|
||||
GetRandomValue(0, GetScreenHeight()),
|
||||
|
@ -132,8 +149,21 @@ void ResetGameplayScreen(void)
|
|||
};
|
||||
}
|
||||
|
||||
DebugMode = 0;
|
||||
for (int i = 0; i < MAX_SHOOTS; i++) {
|
||||
shoot[i].hitbox = (Rectangle) {
|
||||
player.hitbox.x,
|
||||
player.hitbox.y,
|
||||
(float) attack_sprite.width,
|
||||
(float) attack_sprite.height
|
||||
};
|
||||
shoot[i].speed.x = 7;
|
||||
shoot[i].speed.y = 0;
|
||||
shoot[i].active = false;
|
||||
shoot[i].color = RED;
|
||||
}
|
||||
ammo = 0;
|
||||
|
||||
DebugMode = 0;
|
||||
pauseTimer = 0;
|
||||
score = 0;
|
||||
}
|
||||
|
@ -178,11 +208,24 @@ void UpdateGameplayScreen(void)
|
|||
player.speed = 600.0f;
|
||||
if (player.currentframe != 1) player.currentframe = 2;
|
||||
} else player.speed = 300.0f;
|
||||
if (INPUT_FIRE_PRESSED) {
|
||||
if (ammo > 0) {
|
||||
for (int i = 0; i < MAX_SHOOTS; i++) {
|
||||
if (!shoot[i].active) {
|
||||
ammo--;
|
||||
shoot[i].hitbox.x = player.hitbox.x;
|
||||
shoot[i].hitbox.y = player.hitbox.y + player.hitbox.height/4;
|
||||
shoot[i].active = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
player.sprite_pos = (Vector2){ player.hitbox.x, player.hitbox.y };
|
||||
player.frameRec.x = (float)player.currentframe*(float)player_sprite.width/3;
|
||||
|
||||
heart.sprite_pos = (Vector2){ heart.hitbox.x, heart.hitbox.y };
|
||||
feather.sprite_pos = (Vector2){ feather.hitbox.x, feather.hitbox.y };
|
||||
enemy.sprite_pos = (Vector2){ enemy.hitbox.x, enemy.hitbox.y };
|
||||
|
||||
player_flashtimer++;
|
||||
|
@ -191,7 +234,12 @@ void UpdateGameplayScreen(void)
|
|||
fireworks[i].sprite_pos = (Vector2){ fireworks[i].hitbox.x, fireworks[i].hitbox.y };
|
||||
}
|
||||
|
||||
if (score % 1000 == 0) heart.active = true;
|
||||
for (int i = 0; i < MAX_SHOOTS; i++) {
|
||||
shoot[i].sprite_pos = (Vector2){ shoot[i].hitbox.x, shoot[i].hitbox.y };
|
||||
}
|
||||
|
||||
|
||||
if (score % 1000 == 0) feather.active = true;
|
||||
|
||||
// Player to da wallz collies
|
||||
if ((player.hitbox.x + player.hitbox.width) >= GetScreenWidth()) player.hitbox.x = GetScreenWidth() - player.hitbox.width;
|
||||
|
@ -203,6 +251,8 @@ void UpdateGameplayScreen(void)
|
|||
UpdateiFrameTimer();
|
||||
|
||||
if (IsKeyPressed(KEY_D)) DebugMode = !DebugMode;
|
||||
if (IsKeyPressed(KEY_NINE)) ammo = 99;
|
||||
if (IsKeyPressed(KEY_ZERO)) ammo = 0;
|
||||
|
||||
if (IsKeyPressed(KEY_R)) {
|
||||
gameReset();
|
||||
|
@ -214,13 +264,37 @@ void UpdateGameplayScreen(void)
|
|||
currentScreen = GAMEOVER;
|
||||
}
|
||||
|
||||
if (heart.active) {
|
||||
if (CheckCollisionRecs(player.hitbox, heart.hitbox)) {
|
||||
player.hp++;
|
||||
for (int i = 0; i < MAX_SHOOTS; i++) {
|
||||
if (shoot[i].active) {
|
||||
shoot[i].hitbox.x += shoot[i].speed.x;
|
||||
}
|
||||
|
||||
if (CheckCollisionRecs(shoot[i].hitbox, enemy.hitbox) && shoot[i].active) {
|
||||
// enemy.hp--;
|
||||
score += 300;
|
||||
if (!mute) PlaySoundMulti(fxboom);
|
||||
shoot[i].active = false;
|
||||
}
|
||||
|
||||
if (shoot[i].hitbox.x + shoot[i].hitbox.width >= GetScreenWidth() + attack_sprite.width) {
|
||||
shoot[i].active = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (feather.active) {
|
||||
switch (feather.power) {
|
||||
case 0: feather.color = GREEN; break;
|
||||
case 1: feather.color = RED; break;
|
||||
}
|
||||
if (CheckCollisionRecs(player.hitbox, feather.hitbox)) {
|
||||
switch (feather.power) {
|
||||
case 0: player.hp++; feather.power = 1; break;
|
||||
case 1: ammo++; feather.power = 0; break;
|
||||
}
|
||||
if (!mute) PlaySoundMulti(fxfeather);
|
||||
heart.hitbox.x = GetRandomValue(0, GetScreenWidth() - feather_sprite.width);
|
||||
heart.hitbox.y = GetRandomValue(0, GetScreenHeight() - feather_sprite.height);
|
||||
heart.active = false;
|
||||
feather.hitbox.x = GetRandomValue(0, GetScreenWidth() - feather_sprite.width);
|
||||
feather.hitbox.y = GetRandomValue(0, GetScreenHeight() - feather_sprite.height);
|
||||
feather.active = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -240,23 +314,23 @@ void UpdateGameplayScreen(void)
|
|||
for (int i = 0; i < MAX_FIREWORKS; i++) {
|
||||
if (CheckCollisionRecs(player.hitbox, fireworks[i].hitbox)) {
|
||||
DamagePlayer();
|
||||
fireworks[i].hp = 0;
|
||||
fireworks[i].active = 0;
|
||||
}
|
||||
|
||||
switch (fireworks[i].hp) {
|
||||
switch (fireworks[i].active) {
|
||||
case 0:
|
||||
fireworks[i].hitbox.x = enemy.hitbox.x - 20;
|
||||
fireworks[i].hitbox.y = enemy.hitbox.y - 20;
|
||||
|
||||
if (GetRandomValue(0, 50) == 50) {
|
||||
fireworks[i].hp = 1;
|
||||
fireworks[i].active = 1;
|
||||
fireworks[i].hitbox.y += enemy.hitbox.height/2;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
fireworks[i].hitbox.x += GetFrameTime() * -fireworks[i].speed;
|
||||
fireworks[i].hitbox.x += GetFrameTime() * -fireworks[i].speed.x;
|
||||
if (((fireworks[i].hitbox.x + -firework_sprite.width) > GetScreenWidth()
|
||||
|| (fireworks[i].hitbox.x <= -firework_sprite.width))) fireworks[i].hp = 0;
|
||||
|| (fireworks[i].hitbox.x <= -firework_sprite.width))) fireworks[i].active = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -271,26 +345,36 @@ void DrawGameplayScreen(void)
|
|||
DrawFPS(10, 430);
|
||||
if (DebugMode) {
|
||||
DrawRectangleRec(player.hitbox, BLUE);
|
||||
DrawRectangleRec(heart.hitbox, WHITE);
|
||||
DrawRectangleRec(feather.hitbox, WHITE);
|
||||
DrawText(TextFormat("enemy.hitbox.y: %f", enemy.hitbox.y), 10, 200, 20, GREEN);
|
||||
DrawText(TextFormat("player.hitbox.y: %f", player.hitbox.y), 10, 230, 20, GREEN);
|
||||
DrawRectangleRec(enemy.hitbox, BLACK);
|
||||
DrawText(TextFormat("firework_sprite.width: %d", firework_sprite.width), 10, 270, 20, GREEN);
|
||||
for (int i = 0; i < MAX_FIREWORKS; i++) {
|
||||
DrawText(TextFormat("fireworks[i].hp: %d", fireworks[i].hp), 10, 250, 20, GREEN);
|
||||
DrawRectangleRec(fireworks[i].hitbox, BLACK);
|
||||
}
|
||||
for (int i = 0; i < MAX_SHOOTS; i++) {
|
||||
DrawRectangleRec(shoot[i].hitbox, GREEN);
|
||||
DrawText(TextFormat("ammo: %d", ammo), 10, 340, 20, GREEN);
|
||||
}
|
||||
DrawText(TextFormat("player_iframeTimer: %d", player_iframeTimer), 10, 300, 20, GREEN);
|
||||
DrawText(TextFormat("player_in: %d", player_in), 10, 320, 20, GREEN);
|
||||
}
|
||||
if (heart.active) DrawTexture(feather_sprite, heart.sprite_pos.x, heart.sprite_pos.y, GREEN);
|
||||
if (feather.active) DrawTexture(feather_sprite, feather.sprite_pos.x, feather.sprite_pos.y, feather.color);
|
||||
DrawTexture(enemy_sprite, enemy.sprite_pos.x, enemy.sprite_pos.y, enemy.color);
|
||||
for (int i = 0; i < MAX_FIREWORKS; i++) {
|
||||
DrawTexture(firework_sprite, fireworks[i].sprite_pos.x, fireworks[i].sprite_pos.y, fireworks[i].color);
|
||||
}
|
||||
for (int i = 0; i < MAX_SHOOTS; i++) {
|
||||
if (shoot[i].active) DrawTexture(attack_sprite, shoot[i].sprite_pos.x, shoot[i].sprite_pos.y, shoot[i].color);
|
||||
}
|
||||
DrawTextureRec(player_sprite, player.frameRec, player.sprite_pos, player.color);
|
||||
DrawText(TextFormat("HP: %i", player.hp), 10, 10, 20, RED);
|
||||
DrawText(TextFormat("SCORE: %i", score), 10, 30, 20, BLUE);
|
||||
DrawTexture(feather_sprite, 0, 0, GREEN);
|
||||
DrawText(TextFormat("= %i", player.hp), 30, 30, 20, GREEN);
|
||||
DrawTexture(feather_sprite, 70, 0, RED);
|
||||
DrawText(TextFormat("= %i", ammo), 100, 30, 20, RED);
|
||||
// DrawText(TextFormat("ENEMY HP: %i", enemy.hp), GetScreenWidth() - 150, 10, 20, RED);
|
||||
DrawText(TextFormat("SCORE: %i", score), 10, 65, 20, BLUE);
|
||||
if (pause && ((pauseTimer/30)%2)) DrawText("PAUSED", 330, 190, 30, WHITE);
|
||||
}
|
||||
|
||||
|
@ -298,10 +382,12 @@ void UnloadGameplayScreen()
|
|||
{
|
||||
UnloadSound(fxhit);
|
||||
UnloadSound(fxfeather);
|
||||
UnloadSound(fxboom);
|
||||
UnloadTexture(player_sprite);
|
||||
UnloadTexture(feather_sprite);
|
||||
UnloadTexture(enemy_sprite);
|
||||
UnloadTexture(firework_sprite);
|
||||
UnloadTexture(attack_sprite);
|
||||
}
|
||||
|
||||
void gameReset(void)
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
|
||||
#define MAX_FIREWORKS 10
|
||||
#define PLAYER_HP 3
|
||||
#define MAX_SHOOTS 3
|
||||
|
||||
struct Actor {
|
||||
float speed;
|
||||
|
@ -26,17 +27,30 @@ struct Item {
|
|||
Vector2 sprite_pos;
|
||||
Rectangle hitbox;
|
||||
bool active;
|
||||
Color color;
|
||||
int power;
|
||||
};
|
||||
|
||||
struct Attack {
|
||||
Vector2 sprite_pos;
|
||||
Rectangle hitbox;
|
||||
Vector2 speed;
|
||||
int active;
|
||||
Color color;
|
||||
};
|
||||
|
||||
struct Actor player = { 0 };
|
||||
struct Actor enemy = { 0 };
|
||||
struct Actor fireworks[MAX_FIREWORKS] = { 0 };
|
||||
struct Item heart = { 0 };
|
||||
struct Attack fireworks[MAX_FIREWORKS] = { 0 };
|
||||
struct Item feather = { 0 };
|
||||
struct Attack shoot[MAX_SHOOTS] = { 0 };
|
||||
Sound fxhit = { 0 };
|
||||
Sound fxfeather = { 0 };
|
||||
Sound fxboom = { 0 };
|
||||
bool pause;
|
||||
bool mute;
|
||||
bool player_in;
|
||||
int ammo = 0;
|
||||
|
||||
bool DebugMode;
|
||||
|
||||
|
|
|
@ -25,6 +25,7 @@ Texture2D player_sprite;
|
|||
Texture2D feather_sprite;
|
||||
Texture2D enemy_sprite;
|
||||
Texture2D firework_sprite;
|
||||
Texture2D attack_sprite;
|
||||
|
||||
// Game functions
|
||||
static void gameSetup(void);
|
||||
|
|
|
@ -14,5 +14,6 @@ extern Texture2D player_sprite;
|
|||
extern Texture2D feather_sprite;
|
||||
extern Texture2D enemy_sprite;
|
||||
extern Texture2D firework_sprite;
|
||||
extern Texture2D attack_sprite;
|
||||
|
||||
#endif
|
||||
|
|
|
@ -55,6 +55,7 @@ void DrawTitleScreen(void)
|
|||
DrawText("Press 'Left-ALT' + 'F' for full screen", 10, 100, 10, WHITE);
|
||||
DrawText("Press 'R' to restart", 10, 120, 10, WHITE);
|
||||
DrawText("Press 'ENTER' or 'START' to select an option", 10, 140, 10, WHITE);
|
||||
DrawText("Press 'X' or 'A' on a gamepad to shoot", 10, 160, 10, WHITE);
|
||||
DrawText("Avoid", 330, 20, 50, BLUE);
|
||||
if (titleSelected == 0) DrawText("PLAY", 360, 220, 20, WHITE);
|
||||
else DrawText("PLAY", 360, 220, 20, BLUE);
|
||||
|
|
Loading…
Reference in a new issue