summaryrefslogtreecommitdiffhomepage
path: root/templates/advance_game/advance_game.c
diff options
context:
space:
mode:
Diffstat (limited to 'templates/advance_game/advance_game.c')
-rw-r--r--templates/advance_game/advance_game.c325
1 files changed, 195 insertions, 130 deletions
diff --git a/templates/advance_game/advance_game.c b/templates/advance_game/advance_game.c
index 2c6aee3a..5c9442a5 100644
--- a/templates/advance_game/advance_game.c
+++ b/templates/advance_game/advance_game.c
@@ -8,7 +8,7 @@
* This game has been created using raylib (www.raylib.com)
* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
*
-* Copyright (c) 2014 Ramon Santamaria (@raysan5)
+* Copyright (c) 2014-2017 Ramon Santamaria (@raysan5)
*
********************************************************************************************/
@@ -19,23 +19,36 @@
#include "android_native_app_glue.h"
#endif
+#if defined(PLATFORM_WEB)
+ #include <emscripten/emscripten.h>
+#endif
+
//----------------------------------------------------------------------------------
// Global Variables Definition (local to this module)
//----------------------------------------------------------------------------------
+const int screenWidth = 800;
+const int screenHeight = 450;
// Required variables to manage screen transitions (fade-in, fade-out)
-float transAlpha = 0;
-bool onTransition = false;
-bool transFadeOut = false;
-int transFromScreen = -1;
-int transToScreen = -1;
+static float transAlpha = 0.0f;
+static bool onTransition = false;
+static bool transFadeOut = false;
+static int transFromScreen = -1;
+static int transToScreen = -1;
+
+// NOTE: Some global variables that require to be visible for all screens,
+// are defined in screens.h (i.e. currentScreen)
//----------------------------------------------------------------------------------
// Local Functions Declaration
//----------------------------------------------------------------------------------
-void TransitionToScreen(int screen);
-void UpdateTransition(void);
-void DrawTransition(void);
+static void ChangeToScreen(int screen); // No transition effect
+
+static void TransitionToScreen(int screen);
+static void UpdateTransition(void);
+static void DrawTransition(void);
+
+static void UpdateDrawFrame(void); // Update and Draw one frame
//----------------------------------------------------------------------------------
// Main entry point
@@ -46,133 +59,122 @@ void android_main(struct android_app *app)
int main(void)
#endif
{
- // Initialization
- //---------------------------------------------------------
- const int screenWidth = 800;
- const int screenHeight = 450;
-
+ // Initialization
+ //---------------------------------------------------------
#if defined(PLATFORM_ANDROID)
InitWindow(screenWidth, screenHeight, app);
#else
- InitWindow(screenWidth, screenHeight, "raylib template - standard game");
+ InitWindow(screenWidth, screenHeight, "raylib template - advance game");
#endif
- // TODO: Load global data here (assets that must be available in all screens, i.e. fonts)
+
+ // Global data loading (assets that must be available in all screens, i.e. fonts)
+ InitAudioDevice();
+
+ font = LoadSpriteFont("resources/mecha.png");
+ music = LoadMusicStream("resources/ambient.ogg");
+ fxCoin = LoadSound("resources/coin.wav");
+ SetMusicVolume(music, 1.0f);
+ PlayMusicStream(music);
+
// Setup and Init first screen
currentScreen = LOGO;
InitLogoScreen();
-
- SetTargetFPS(60);
- //----------------------------------------------------------
+
+#if defined(PLATFORM_WEB)
+ emscripten_set_main_loop(UpdateDrawFrame, 0, 1);
+#else
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
// Main game loop
while (!WindowShouldClose()) // Detect window close button or ESC key
{
- // Update
- //----------------------------------------------------------------------------------
- if (!onTransition)
- {
- switch(currentScreen)
- {
- case LOGO:
- {
- UpdateLogoScreen();
-
- if (FinishLogoScreen()) TransitionToScreen(TITLE);
-
- } break;
- case TITLE:
- {
- UpdateTitleScreen();
-
- if (FinishTitleScreen() == 1) TransitionToScreen(OPTIONS);
- else if (FinishTitleScreen() == 2) TransitionToScreen(GAMEPLAY);
-
- } break;
- case OPTIONS:
- {
- UpdateOptionsScreen();
-
- if (FinishOptionsScreen()) TransitionToScreen(TITLE);
-
- } break;
- case GAMEPLAY:
- {
- UpdateGameplayScreen();
-
- if (FinishGameplayScreen()) TransitionToScreen(ENDING);
-
- } break;
- case ENDING:
- {
- UpdateEndingScreen();
-
- if (FinishEndingScreen()) TransitionToScreen(TITLE);
-
- } break;
- default: break;
- }
- }
- else
- {
- // Update transition (fade-in, fade-out)
- UpdateTransition();
- }
- //----------------------------------------------------------------------------------
-
- // Draw
- //----------------------------------------------------------------------------------
- BeginDrawing();
-
- ClearBackground(RAYWHITE);
-
- switch(currentScreen)
- {
- case LOGO: DrawLogoScreen(); break;
- case TITLE: DrawTitleScreen(); break;
- case OPTIONS: DrawOptionsScreen(); break;
- case GAMEPLAY: DrawGameplayScreen(); break;
- case ENDING: DrawEndingScreen(); break;
- default: break;
- }
-
- if (onTransition) DrawTransition();
-
- //DrawFPS(10, 10);
-
- EndDrawing();
- //----------------------------------------------------------------------------------
+ UpdateDrawFrame();
}
+#endif
// De-Initialization
//--------------------------------------------------------------------------------------
- // TODO: Unload all global loaded data (i.e. fonts) here!
+ // Unload current screen data before closing
+ switch (currentScreen)
+ {
+ case LOGO: UnloadLogoScreen(); break;
+ case TITLE: UnloadTitleScreen(); break;
+ case GAMEPLAY: UnloadGameplayScreen(); break;
+ case ENDING: UnloadEndingScreen(); break;
+ default: break;
+ }
+
+ // Unload all global loaded data (i.e. fonts) here!
+ UnloadSpriteFont(font);
+ UnloadMusicStream(music);
+ UnloadSound(fxCoin);
+
+ CloseAudioDevice(); // Close audio context
- CloseWindow(); // Close window and OpenGL context
+ CloseWindow(); // Close window and OpenGL context
//--------------------------------------------------------------------------------------
#if !defined(PLATFORM_ANDROID)
return 0;
#endif
}
-void TransitionToScreen(int screen)
+//----------------------------------------------------------------------------------
+// Module specific Functions Definition
+//----------------------------------------------------------------------------------
+
+// Change to next screen, no transition
+static void ChangeToScreen(int screen)
+{
+ // Unload current screen
+ switch (currentScreen)
+ {
+ case LOGO: UnloadLogoScreen(); break;
+ case TITLE: UnloadTitleScreen(); break;
+ case GAMEPLAY: UnloadGameplayScreen(); break;
+ case ENDING: UnloadEndingScreen(); break;
+ default: break;
+ }
+
+ // Init next screen
+ switch (screen)
+ {
+ case LOGO: InitLogoScreen(); break;
+ case TITLE: InitTitleScreen(); break;
+ case GAMEPLAY: InitGameplayScreen(); break;
+ case ENDING: InitEndingScreen(); break;
+ default: break;
+ }
+
+ currentScreen = screen;
+}
+
+// Define transition to next screen
+static void TransitionToScreen(int screen)
{
onTransition = true;
+ transFadeOut = false;
transFromScreen = currentScreen;
transToScreen = screen;
+ transAlpha = 0.0f;
}
-void UpdateTransition(void)
+// Update transition effect
+static void UpdateTransition(void)
{
if (!transFadeOut)
{
- transAlpha += 0.01;
-
- if (transAlpha >= 1.0)
+ transAlpha += 0.02f;
+
+ // NOTE: Due to float internal representation, condition jumps on 1.0f instead of 1.05f
+ // For that reason we compare against 1.01f, to avoid last frame loading stop
+ if (transAlpha > 1.01f)
{
- transAlpha = 1.0;
+ transAlpha = 1.0f;
+ // Unload current screen
switch (transFromScreen)
{
case LOGO: UnloadLogoScreen(); break;
@@ -183,46 +185,29 @@ void UpdateTransition(void)
default: break;
}
+ // Load next screen
switch (transToScreen)
{
- case LOGO:
- {
- InitLogoScreen();
- currentScreen = LOGO;
- } break;
- case TITLE:
- {
- InitTitleScreen();
- currentScreen = TITLE;
- } break;
- case OPTIONS:
- {
- InitOptionsScreen();
- currentScreen = OPTIONS;
- } break;
- case GAMEPLAY:
- {
- InitGameplayScreen();
- currentScreen = GAMEPLAY;
- } break;
- case ENDING:
- {
- InitEndingScreen();
- currentScreen = ENDING;
- } break;
+ case LOGO: InitLogoScreen(); break;
+ case TITLE: InitTitleScreen(); break;
+ case GAMEPLAY: InitGameplayScreen(); break;
+ case ENDING: InitEndingScreen(); break;
default: break;
}
+ currentScreen = transToScreen;
+
+ // Activate fade out effect to next loaded screen
transFadeOut = true;
}
}
else // Transition fade out logic
{
- transAlpha -= 0.01f;
+ transAlpha -= 0.02f;
- if (transAlpha <= 0)
+ if (transAlpha < -0.01f)
{
- transAlpha = 0;
+ transAlpha = 0.0f;
transFadeOut = false;
onTransition = false;
transFromScreen = -1;
@@ -231,7 +216,87 @@ void UpdateTransition(void)
}
}
-void DrawTransition(void)
+// Draw transition effect (full-screen rectangle)
+static void DrawTransition(void)
{
DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(BLACK, transAlpha));
+}
+
+// Update and draw game frame
+static void UpdateDrawFrame(void)
+{
+ // Update
+ //----------------------------------------------------------------------------------
+ UpdateMusicStream(music); // NOTE: Music keeps playing between screens
+
+ if (!onTransition)
+ {
+ switch(currentScreen)
+ {
+ case LOGO:
+ {
+ UpdateLogoScreen();
+
+ if (FinishLogoScreen()) TransitionToScreen(TITLE);
+
+ } break;
+ case TITLE:
+ {
+ UpdateTitleScreen();
+
+ if (FinishTitleScreen() == 1) TransitionToScreen(OPTIONS);
+ else if (FinishTitleScreen() == 2) TransitionToScreen(GAMEPLAY);
+
+ } break;
+ case OPTIONS:
+ {
+ UpdateOptionsScreen();
+
+ if (FinishOptionsScreen()) TransitionToScreen(TITLE);
+
+ } break;
+ case GAMEPLAY:
+ {
+ UpdateGameplayScreen();
+
+ if (FinishGameplayScreen() == 1) TransitionToScreen(ENDING);
+ //else if (FinishGameplayScreen() == 2) TransitionToScreen(TITLE);
+
+ } break;
+ case ENDING:
+ {
+ UpdateEndingScreen();
+
+ if (FinishEndingScreen() == 1) TransitionToScreen(TITLE);
+
+ } break;
+ default: break;
+ }
+ }
+ else UpdateTransition(); // Update transition (fade-in, fade-out)
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ switch(currentScreen)
+ {
+ case LOGO: DrawLogoScreen(); break;
+ case TITLE: DrawTitleScreen(); break;
+ case OPTIONS: DrawOptionsScreen(); break;
+ case GAMEPLAY: DrawGameplayScreen(); break;
+ case ENDING: DrawEndingScreen(); break;
+ default: break;
+ }
+
+ // Draw full screen rectangle in front of everything
+ if (onTransition) DrawTransition();
+
+ //DrawFPS(10, 10);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
} \ No newline at end of file