|
|
- /*******************************************************************************************
- *
- * WAVE COLLECTOR [GLOBAL GAME JAM 2017]
- *
- * The ultimate wave particles collector is here!
- * You must follow the wave and collect all the particles
- * The level is actually the wave and the wave is the level!
- * Be fast! Be smart! Be the best wave collector!
- *
- * This game has been created using raylib v1.7 (www.raylib.com)
- * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
- *
- * Copyright (c) 2017 Ramon Santamaria (@raysan5)
- *
- ********************************************************************************************/
-
- #include "raylib.h"
- #include "screens/screens.h" // NOTE: Defines global variable: currentScreen
-
- #include <stdlib.h>
-
- #include <stdio.h> // Required for: printf()
- #include <string.h> // Required for: strcpy()
-
- #if defined(PLATFORM_WEB)
- #include <emscripten/emscripten.h>
- #endif
-
- //----------------------------------------------------------------------------------
- // Global Variables Definition (local to this module)
- //----------------------------------------------------------------------------------
- const int screenWidth = 1280;
- const int screenHeight = 720;
-
- // Required variables to manage screen transitions (fade-in, fade-out)
- 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
- //----------------------------------------------------------------------------------
- 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
- //----------------------------------------------------------------------------------
- int main(int argc, char *argv[])
- {
- // Initialization
- //---------------------------------------------------------
- #if defined(PLATFORM_DESKTOP)
- // TODO: Support for dropped files on the exe
-
- // Support command line argument for custom music file
- if (argc > 1)
- {
- // Just supporting an input argument parameter!!! o__O
-
- if ((IsFileExtension(argv[1], ".ogg")) ||
- (IsFileExtension(argv[1], ".wav")))
- {
- if (sampleFilename != NULL) free(sampleFilename);
-
- sampleFilename = (char *)malloc(256);
- strcpy(sampleFilename, argv[1]);
-
- printf("Custom audio file: %s", sampleFilename);
- }
- }
- #endif
-
- #ifndef PLATFORM_ANDROID
- SetConfigFlags(FLAG_MSAA_4X_HINT);
- #endif
- // Note windowTitle is unused on Android
- InitWindow(screenWidth, screenHeight, "WAVE COLLECTOR [GGJ17]");
-
- // Global data loading (assets that must be available in all screens, i.e. fonts)
- InitAudioDevice();
-
- font = LoadFont("resources/font.fnt");
- music = LoadMusicStream("resources/audio/wave.ogg");
-
- SetMusicVolume(music, 1.0f);
-
- // Setup and Init first screen
- currentScreen = LOGO;
- InitLogoScreen();
- //InitTitleScreen();
- //InitGameplayScreen();
- //InitEndingScreen();
-
- #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
- {
- UpdateDrawFrame();
- }
- #endif
-
- // De-Initialization
- //--------------------------------------------------------------------------------------
- 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!
- UnloadFont(font);
- UnloadMusicStream(music);
-
- CloseAudioDevice(); // Close audio context
-
- CloseWindow(); // Close window and OpenGL context
- //--------------------------------------------------------------------------------------
-
- return 0;
- }
-
- //----------------------------------------------------------------------------------
- // 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;
- }
-
- // Update transition effect
- static void UpdateTransition(void)
- {
- if (!transFadeOut)
- {
- transAlpha += 0.05f;
-
- // 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 ((int)transAlpha >= 1)
- {
- transAlpha = 1.0f;
-
- // Unload current screen
- switch (transFromScreen)
- {
- case LOGO: UnloadLogoScreen(); break;
- case TITLE: UnloadTitleScreen(); break;
- case GAMEPLAY: UnloadGameplayScreen(); break;
- case ENDING: UnloadEndingScreen(); break;
- default: break;
- }
-
- // Load next screen
- switch (transToScreen)
- {
- 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.05f;
-
- if ((int)transAlpha <= 0)
- {
- transAlpha = 0.0f;
- transFadeOut = false;
- onTransition = false;
- transFromScreen = -1;
- transToScreen = -1;
- }
- }
- }
-
- // Draw transition effect (full-screen rectangle)
- static void DrawTransition(void)
- {
- DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(RAYWHITE, transAlpha));
- }
-
- // Update and draw game frame
- static void UpdateDrawFrame(void)
- {
- // Update
- //----------------------------------------------------------------------------------
- if (!onTransition)
- {
- switch(currentScreen)
- {
- case LOGO:
- {
- UpdateLogoScreen();
-
- if (FinishLogoScreen()) TransitionToScreen(TITLE);
-
- } break;
- case TITLE:
- {
- UpdateTitleScreen();
-
- if (FinishTitleScreen() == 1) TransitionToScreen(GAMEPLAY);
-
- } 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)
-
- // TODO: Review! It breaks the game... issues with audio buffering...
- if (currentScreen != ENDING) UpdateMusicStream(music);
- //----------------------------------------------------------------------------------
-
- // Draw
- //----------------------------------------------------------------------------------
- BeginDrawing();
-
- ClearBackground(RAYWHITE);
-
- switch(currentScreen)
- {
- case LOGO: DrawLogoScreen(); break;
- case TITLE: DrawTitleScreen(); break;
- case GAMEPLAY: DrawGameplayScreen(); break;
- case ENDING: DrawEndingScreen(); break;
- default: break;
- }
-
- // Draw full screen rectangle in front of everything
- if (onTransition) DrawTransition();
-
- EndDrawing();
- //----------------------------------------------------------------------------------
- }
|