feat: add wake, rose, terrain, pathfinding, gameover, clouds, enemy shooting, variable bird speed refactor: some things
This commit is contained in:
+100
-56
@@ -1,15 +1,18 @@
|
||||
#include <time.h>
|
||||
|
||||
#include "app.h"
|
||||
#include "enginePostfx.h"
|
||||
#include "game.h"
|
||||
#include "raylib.h"
|
||||
|
||||
const ShaderAsset shaderAssets[SHADER_COUNT] = {{"shaders/postfx.fs"}};
|
||||
const SoundtrackAsset soundtrackAssets[SOUNDTRACK_COUNT] = {
|
||||
{"assets/gameplay_theme.mp3"}, {"assets/sea.wav"}};
|
||||
const SoundtrackAsset soundtrackAssets[SOUNDTRACK_COUNT] = {{"assets/gameplay_theme.mp3"},
|
||||
{"assets/sea.wav"}};
|
||||
|
||||
void InitGame(App *app) {
|
||||
|
||||
SetRandomSeed(1234);
|
||||
SetRandomSeed(GetRandomValue(0, 10000000));
|
||||
GameState *g = &app->game;
|
||||
g->assets = (Assets){.shaderAssets = shaderAssets,
|
||||
.soundtrackAssets = soundtrackAssets};
|
||||
g->assets = (Assets){.shaderAssets = shaderAssets, .soundtrackAssets = soundtrackAssets};
|
||||
|
||||
for (int i = 0; i < SHADER_COUNT; i++) {
|
||||
g->postFX[i] = CreatePostFX(g->assets.shaderAssets[i].path);
|
||||
@@ -20,68 +23,116 @@ void InitGame(App *app) {
|
||||
}
|
||||
|
||||
g->target = LoadRenderTexture(app->window.width, app->window.height);
|
||||
g->postFXTarget = LoadRenderTexture(app->window.width, app->window.height);
|
||||
|
||||
CreatePlayer();
|
||||
Player *player = GetPlayer();
|
||||
CreateCamera(player->physics.position, 10.0f);
|
||||
g->birds = CreateBirds();
|
||||
g->enemies = CreateEnemies();
|
||||
g->islands = CreateIslands();
|
||||
g->camera = CreateCamera((Vector2){0.0f, 0.0f}, 10.0f);
|
||||
g->terrain = CreateTerrain(&g->camera);
|
||||
g->player = CreatePlayer(&g->terrain);
|
||||
g->camera.target = g->player.physics.position;
|
||||
g->birds = CreateBirds(&g->camera);
|
||||
g->enemies = CreateEnemies(&g->camera, &g->terrain);
|
||||
g->floor = CreateFloor();
|
||||
g->clouds = CreateClouds();
|
||||
g->wake = CreateWake();
|
||||
g->projectiles = CreateProjectiles();
|
||||
g->overlay = CreateOverlay();
|
||||
|
||||
Texture2D mouseTexture = LoadTexture("assets/mouse.png");
|
||||
Texture2D mouseTexture = LoadTextureCached("assets/mouse.png");
|
||||
g->mouse = CreateMouse(0.10f, 5.0f, 10.0f, &mouseTexture);
|
||||
}
|
||||
|
||||
void StartGame(App *app) {
|
||||
if (!app->state.gameStarted) {
|
||||
app->state.gameStarted = true;
|
||||
}
|
||||
static void StartGame(App *app) {
|
||||
app->state.gameStarted = true;
|
||||
}
|
||||
|
||||
void UpdateGame(App *app) {
|
||||
GameState *g = &app->game;
|
||||
if (app->flags.limitFPS) {
|
||||
SetTargetFPS(60);
|
||||
} else {
|
||||
SetTargetFPS(0);
|
||||
}
|
||||
SetTargetFPS(app->flags.limitFPS ? 60 : 0);
|
||||
|
||||
StartGame(app);
|
||||
|
||||
OnEscapeChangeView(app, MENU);
|
||||
OnWindowClosedStoppApp(app);
|
||||
OnBoolChangeView(g->player.health <= 0, app, GAMEOVER);
|
||||
|
||||
for (int i = 0; i < SHADER_COUNT; i++) {
|
||||
UpdatePostFX(&g->postFX[i]);
|
||||
}
|
||||
|
||||
UpdateMouse(&g->mouse);
|
||||
|
||||
Player *player = GetPlayer();
|
||||
UpdateCamera2D(&player->physics.position, &g->mouse);
|
||||
UpdateFloor(&g->floor);
|
||||
UpdatePlayer();
|
||||
UpdateBirds(&g->birds);
|
||||
UpdateEnemies(&g->enemies);
|
||||
UpdateIslands(&g->islands);
|
||||
UpdateShaders(g->postFX, SHADER_COUNT);
|
||||
UpdateMouse(&g->mouse, &g->camera);
|
||||
UpdateCamera2D(&g->camera, &g->player.physics.position, &g->mouse);
|
||||
UpdateFloor(&g->floor, &g->camera);
|
||||
UpdateClouds(&g->clouds, GetFrameTime());
|
||||
UpdateWake(&g->wake, GetFrameTime());
|
||||
UpdatePlayer(&g->player);
|
||||
UpdateBirds(&g->birds, &g->camera);
|
||||
UpdateTerrain(&g->terrain, &g->camera);
|
||||
UpdateEnemies(&g->enemies, &g->camera, &g->projectiles, &g->player, &g->terrain);
|
||||
UpdateSoundtrack(&g->soundtracks[AMBIENT], app->flags.soundtrackOn);
|
||||
UpdateProjectiles(&g->projectiles, &g->enemies);
|
||||
CheckPlayerCollisions(GetPlayer(), &app->game.enemies);
|
||||
CheckEnemyCollisions(&app->game.enemies);
|
||||
CheckProjectileCollisions(&app->game.projectiles, &app->game.enemies,
|
||||
GetPlayer());
|
||||
UpdateProjectiles(&g->projectiles, &g->player);
|
||||
|
||||
UpdateOverlay(&g->overlay, &g->player);
|
||||
|
||||
CheckPlayerCollisions(&g->player, &g->enemies);
|
||||
CheckEnemyCollisions(&g->enemies);
|
||||
CheckProjectileCollisions(&g->projectiles, &g->enemies, &g->player);
|
||||
CheckTerrainCollisions(&g->player, &g->enemies, &g->terrain);
|
||||
}
|
||||
|
||||
void ResetGame(App *app) {
|
||||
GameState *g = &app->game;
|
||||
SetRandomSeed(GetRandomValue(0, 10000000));
|
||||
ResetPlayer(&g->player, &g->terrain);
|
||||
g->camera = CreateCamera(g->player.physics.position, 10.0f);
|
||||
g->enemies = CreateEnemies(&g->camera, &g->terrain);
|
||||
ResetProjectiles(&g->projectiles);
|
||||
}
|
||||
|
||||
static void RenderShipWakes(App *app) {
|
||||
GameState *g = &app->game;
|
||||
RenderShipWake(&g->wake, &g->player.wakeTrail, GetActualSpeed(&g->player.physics));
|
||||
for (int i = 0; i < g->enemies.count; i++) {
|
||||
if (!g->enemies.alive[i])
|
||||
continue;
|
||||
RenderShipWake(&g->wake, &g->enemies.wakeTrail[i], GetActualSpeed(&g->enemies.physics[i]));
|
||||
}
|
||||
}
|
||||
|
||||
void RenderComponents(App *app) {
|
||||
GameState *g = &app->game;
|
||||
RenderFloor(&g->floor);
|
||||
RenderPlayer();
|
||||
RenderTerrain(&g->terrain);
|
||||
RenderCloudShadows(&g->clouds, &g->camera);
|
||||
RenderShipWakes(app);
|
||||
RenderPlayer(&g->player);
|
||||
RenderEnemies(&g->enemies);
|
||||
RenderBirds(&g->birds);
|
||||
RenderIslands(&g->islands);
|
||||
RenderProjectiles(&g->projectiles);
|
||||
RenderClouds(&g->clouds, &g->camera);
|
||||
}
|
||||
|
||||
static void RenderPostFXChain(App *app, RenderTexture2D *sceneTarget) {
|
||||
GameState *g = &app->game;
|
||||
RenderTexture2D *buffers[2] = {sceneTarget, &g->postFXTarget};
|
||||
int srcIndex = 0;
|
||||
|
||||
for (int i = 0; i < SHADER_COUNT; i++) {
|
||||
bool isLast = (i == SHADER_COUNT - 1);
|
||||
RenderTexture2D *source = buffers[srcIndex];
|
||||
int dstIndex = 1 - srcIndex;
|
||||
|
||||
if (isLast) {
|
||||
BeginDrawing();
|
||||
ClearBackground(BLACK);
|
||||
RenderPostFX(&g->postFX[i], source);
|
||||
if (app->flags.showFPS) {
|
||||
DrawFPS(10, 10);
|
||||
}
|
||||
EndDrawing();
|
||||
} else {
|
||||
BeginTextureMode(*buffers[dstIndex]);
|
||||
RenderPostFX(&g->postFX[i], source);
|
||||
EndTextureMode();
|
||||
srcIndex = dstIndex;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void RenderGame(App *app) {
|
||||
@@ -89,24 +140,13 @@ void RenderGame(App *app) {
|
||||
|
||||
BeginTextureMode(g->target);
|
||||
ClearBackground(BLACK);
|
||||
Camera2D *camera = GetCamera();
|
||||
BeginMode2D(*camera);
|
||||
BeginMode2D(g->camera);
|
||||
RenderComponents(app);
|
||||
EndMode2D();
|
||||
RenderOverlay(&g->mouse);
|
||||
RenderOverlay(&g->mouse, &g->player, &g->overlay.rose);
|
||||
EndTextureMode();
|
||||
|
||||
BeginDrawing();
|
||||
ClearBackground(BLACK);
|
||||
for (int i = 0; i < SHADER_COUNT; i++) {
|
||||
RenderPostFX(&g->postFX[i], &g->target);
|
||||
}
|
||||
|
||||
if (app->flags.showFPS) {
|
||||
DrawFPS(10, 10);
|
||||
}
|
||||
|
||||
EndDrawing();
|
||||
RenderPostFXChain(app, &g->target);
|
||||
}
|
||||
|
||||
void CleanupGame(App *app) {
|
||||
@@ -117,5 +157,9 @@ void CleanupGame(App *app) {
|
||||
for (int i = 0; i < SOUNDTRACK_COUNT; i++) {
|
||||
UnloadMusicStream(g->soundtracks[i].music);
|
||||
}
|
||||
UnloadTerrain(&g->terrain);
|
||||
UnloadClouds(&g->clouds);
|
||||
UnloadWake(&g->wake);
|
||||
UnloadRenderTexture(g->target);
|
||||
UnloadRenderTexture(g->postFXTarget);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user