1 | /******************************************************************************************* |
2 | * |
3 | * WAVE COLLECTOR [GLOBAL GAME JAM 2017] |
4 | * |
5 | * The ultimate wave particles collector is here! |
6 | * You must follow the wave and collect all the particles |
7 | * The level is actually the wave and the wave is the level! |
8 | * Be fast! Be smart! Be the best wave collector! |
9 | * |
10 | * This game has been created using raylib v1.7 (www.raylib.com) |
11 | * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) |
12 | * |
13 | * Copyright (c) 2017 Ramon Santamaria (@raysan5) |
14 | * |
15 | ********************************************************************************************/ |
16 | |
17 | #include "raylib.h" |
18 | #include "screens/screens.h" // NOTE: Defines global variable: currentScreen |
19 | |
20 | #include <stdlib.h> |
21 | |
22 | #include <stdio.h> // Required for: printf() |
23 | #include <string.h> // Required for: strcpy() |
24 | |
25 | #if defined(PLATFORM_WEB) |
26 | #include <emscripten/emscripten.h> |
27 | #endif |
28 | |
29 | //---------------------------------------------------------------------------------- |
30 | // Global Variables Definition (local to this module) |
31 | //---------------------------------------------------------------------------------- |
32 | const int screenWidth = 1280; |
33 | const int screenHeight = 720; |
34 | |
35 | // Required variables to manage screen transitions (fade-in, fade-out) |
36 | static float transAlpha = 0.0f; |
37 | static bool onTransition = false; |
38 | static bool transFadeOut = false; |
39 | static int transFromScreen = -1; |
40 | static int transToScreen = -1; |
41 | |
42 | // NOTE: Some global variables that require to be visible for all screens, |
43 | // are defined in screens.h (i.e. currentScreen) |
44 | |
45 | //---------------------------------------------------------------------------------- |
46 | // Local Functions Declaration |
47 | //---------------------------------------------------------------------------------- |
48 | static void ChangeToScreen(int screen); // No transition effect |
49 | |
50 | static void TransitionToScreen(int screen); |
51 | static void UpdateTransition(void); |
52 | static void DrawTransition(void); |
53 | |
54 | static void UpdateDrawFrame(void); // Update and Draw one frame |
55 | |
56 | //---------------------------------------------------------------------------------- |
57 | // Main entry point |
58 | //---------------------------------------------------------------------------------- |
59 | int main(int argc, char *argv[]) |
60 | { |
61 | // Initialization |
62 | //--------------------------------------------------------- |
63 | #if defined(PLATFORM_DESKTOP) |
64 | // TODO: Support for dropped files on the exe |
65 | |
66 | // Support command line argument for custom music file |
67 | if (argc > 1) |
68 | { |
69 | // Just supporting an input argument parameter!!! o__O |
70 | |
71 | if ((IsFileExtension(argv[1], ".ogg" )) || |
72 | (IsFileExtension(argv[1], ".wav" ))) |
73 | { |
74 | if (sampleFilename != NULL) free(sampleFilename); |
75 | |
76 | sampleFilename = (char *)malloc(256); |
77 | strcpy(sampleFilename, argv[1]); |
78 | |
79 | printf("Custom audio file: %s" , sampleFilename); |
80 | } |
81 | } |
82 | #endif |
83 | |
84 | #ifndef PLATFORM_ANDROID |
85 | SetConfigFlags(FLAG_MSAA_4X_HINT); |
86 | #endif |
87 | // Note windowTitle is unused on Android |
88 | InitWindow(screenWidth, screenHeight, "WAVE COLLECTOR [GGJ17]" ); |
89 | |
90 | // Global data loading (assets that must be available in all screens, i.e. fonts) |
91 | InitAudioDevice(); |
92 | |
93 | font = LoadFont("resources/font.fnt" ); |
94 | music = LoadMusicStream("resources/audio/wave.ogg" ); |
95 | |
96 | SetMusicVolume(music, 1.0f); |
97 | |
98 | // Setup and Init first screen |
99 | currentScreen = LOGO; |
100 | InitLogoScreen(); |
101 | //InitTitleScreen(); |
102 | //InitGameplayScreen(); |
103 | //InitEndingScreen(); |
104 | |
105 | #if defined(PLATFORM_WEB) |
106 | emscripten_set_main_loop(UpdateDrawFrame, 0, 1); |
107 | #else |
108 | SetTargetFPS(60); // Set our game to run at 60 frames-per-second |
109 | //-------------------------------------------------------------------------------------- |
110 | |
111 | // Main game loop |
112 | while (!WindowShouldClose()) // Detect window close button or ESC key |
113 | { |
114 | UpdateDrawFrame(); |
115 | } |
116 | #endif |
117 | |
118 | // De-Initialization |
119 | //-------------------------------------------------------------------------------------- |
120 | switch (currentScreen) |
121 | { |
122 | case LOGO: UnloadLogoScreen(); break; |
123 | case TITLE: UnloadTitleScreen(); break; |
124 | case GAMEPLAY: UnloadGameplayScreen(); break; |
125 | case ENDING: UnloadEndingScreen(); break; |
126 | default: break; |
127 | } |
128 | |
129 | // Unload all global loaded data (i.e. fonts) here! |
130 | UnloadFont(font); |
131 | UnloadMusicStream(music); |
132 | |
133 | CloseAudioDevice(); // Close audio context |
134 | |
135 | CloseWindow(); // Close window and OpenGL context |
136 | //-------------------------------------------------------------------------------------- |
137 | |
138 | return 0; |
139 | } |
140 | |
141 | //---------------------------------------------------------------------------------- |
142 | // Module specific Functions Definition |
143 | //---------------------------------------------------------------------------------- |
144 | |
145 | // Change to next screen, no transition |
146 | static void ChangeToScreen(int screen) |
147 | { |
148 | // Unload current screen |
149 | switch (currentScreen) |
150 | { |
151 | case LOGO: UnloadLogoScreen(); break; |
152 | case TITLE: UnloadTitleScreen(); break; |
153 | case GAMEPLAY: UnloadGameplayScreen(); break; |
154 | case ENDING: UnloadEndingScreen(); break; |
155 | default: break; |
156 | } |
157 | |
158 | // Init next screen |
159 | switch (screen) |
160 | { |
161 | case LOGO: InitLogoScreen(); break; |
162 | case TITLE: InitTitleScreen(); break; |
163 | case GAMEPLAY: InitGameplayScreen(); break; |
164 | case ENDING: InitEndingScreen(); break; |
165 | default: break; |
166 | } |
167 | |
168 | currentScreen = screen; |
169 | } |
170 | |
171 | // Define transition to next screen |
172 | static void TransitionToScreen(int screen) |
173 | { |
174 | onTransition = true; |
175 | transFadeOut = false; |
176 | transFromScreen = currentScreen; |
177 | transToScreen = screen; |
178 | transAlpha = 0.0f; |
179 | } |
180 | |
181 | // Update transition effect |
182 | static void UpdateTransition(void) |
183 | { |
184 | if (!transFadeOut) |
185 | { |
186 | transAlpha += 0.05f; |
187 | |
188 | // NOTE: Due to float internal representation, condition jumps on 1.0f instead of 1.05f |
189 | // For that reason we compare against 1.01f, to avoid last frame loading stop |
190 | if ((int)transAlpha >= 1) |
191 | { |
192 | transAlpha = 1.0f; |
193 | |
194 | // Unload current screen |
195 | switch (transFromScreen) |
196 | { |
197 | case LOGO: UnloadLogoScreen(); break; |
198 | case TITLE: UnloadTitleScreen(); break; |
199 | case GAMEPLAY: UnloadGameplayScreen(); break; |
200 | case ENDING: UnloadEndingScreen(); break; |
201 | default: break; |
202 | } |
203 | |
204 | // Load next screen |
205 | switch (transToScreen) |
206 | { |
207 | case LOGO: InitLogoScreen(); break; |
208 | case TITLE: InitTitleScreen(); break; |
209 | case GAMEPLAY: InitGameplayScreen(); break; |
210 | case ENDING: InitEndingScreen(); break; |
211 | default: break; |
212 | } |
213 | |
214 | currentScreen = transToScreen; |
215 | |
216 | // Activate fade out effect to next loaded screen |
217 | transFadeOut = true; |
218 | } |
219 | } |
220 | else // Transition fade out logic |
221 | { |
222 | transAlpha -= 0.05f; |
223 | |
224 | if ((int)transAlpha <= 0) |
225 | { |
226 | transAlpha = 0.0f; |
227 | transFadeOut = false; |
228 | onTransition = false; |
229 | transFromScreen = -1; |
230 | transToScreen = -1; |
231 | } |
232 | } |
233 | } |
234 | |
235 | // Draw transition effect (full-screen rectangle) |
236 | static void DrawTransition(void) |
237 | { |
238 | DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(RAYWHITE, transAlpha)); |
239 | } |
240 | |
241 | // Update and draw game frame |
242 | static void UpdateDrawFrame(void) |
243 | { |
244 | // Update |
245 | //---------------------------------------------------------------------------------- |
246 | if (!onTransition) |
247 | { |
248 | switch(currentScreen) |
249 | { |
250 | case LOGO: |
251 | { |
252 | UpdateLogoScreen(); |
253 | |
254 | if (FinishLogoScreen()) TransitionToScreen(TITLE); |
255 | |
256 | } break; |
257 | case TITLE: |
258 | { |
259 | UpdateTitleScreen(); |
260 | |
261 | if (FinishTitleScreen() == 1) TransitionToScreen(GAMEPLAY); |
262 | |
263 | } break; |
264 | case GAMEPLAY: |
265 | { |
266 | UpdateGameplayScreen(); |
267 | |
268 | if (FinishGameplayScreen() == 1) TransitionToScreen(ENDING); |
269 | //else if (FinishGameplayScreen() == 2) TransitionToScreen(TITLE); |
270 | |
271 | } break; |
272 | case ENDING: |
273 | { |
274 | UpdateEndingScreen(); |
275 | |
276 | if (FinishEndingScreen() == 1) TransitionToScreen(TITLE); |
277 | |
278 | } break; |
279 | default: break; |
280 | } |
281 | } |
282 | else UpdateTransition(); // Update transition (fade-in, fade-out) |
283 | |
284 | // TODO: Review! It breaks the game... issues with audio buffering... |
285 | if (currentScreen != ENDING) UpdateMusicStream(music); |
286 | //---------------------------------------------------------------------------------- |
287 | |
288 | // Draw |
289 | //---------------------------------------------------------------------------------- |
290 | BeginDrawing(); |
291 | |
292 | ClearBackground(RAYWHITE); |
293 | |
294 | switch(currentScreen) |
295 | { |
296 | case LOGO: DrawLogoScreen(); break; |
297 | case TITLE: DrawTitleScreen(); break; |
298 | case GAMEPLAY: DrawGameplayScreen(); break; |
299 | case ENDING: DrawEndingScreen(); break; |
300 | default: break; |
301 | } |
302 | |
303 | // Draw full screen rectangle in front of everything |
304 | if (onTransition) DrawTransition(); |
305 | |
306 | EndDrawing(); |
307 | //---------------------------------------------------------------------------------- |
308 | } |
309 | |