| @ -0,0 +1,223 @@ | |||
| #************************************************************************************************** | |||
| # | |||
| # raylib - Koala Seasons | |||
| # | |||
| # raylib makefile for desktop platforms, Raspberry Pi and HTML5 (emscripten) | |||
| # | |||
| # Copyright (c) 2013-2016 Ramon Santamaria (@raysan5) | |||
| # | |||
| # This software is provided "as-is", without any express or implied warranty. In no event | |||
| # will the authors be held liable for any damages arising from the use of this software. | |||
| # | |||
| # Permission is granted to anyone to use this software for any purpose, including commercial | |||
| # applications, and to alter it and redistribute it freely, subject to the following restrictions: | |||
| # | |||
| # 1. The origin of this software must not be misrepresented; you must not claim that you | |||
| # wrote the original software. If you use this software in a product, an acknowledgment | |||
| # in the product documentation would be appreciated but is not required. | |||
| # | |||
| # 2. Altered source versions must be plainly marked as such, and must not be misrepresented | |||
| # as being the original software. | |||
| # | |||
| # 3. This notice may not be removed or altered from any source distribution. | |||
| # | |||
| #************************************************************************************************** | |||
| # define raylib platform to compile for | |||
| # possible platforms: PLATFORM_DESKTOP PLATFORM_RPI PLATFORM_WEB | |||
| # WARNING: To compile to HTML5, code must be redesigned to use emscripten.h and emscripten_set_main_loop() | |||
| PLATFORM ?= PLATFORM_DESKTOP | |||
| # determine PLATFORM_OS in case PLATFORM_DESKTOP selected | |||
| ifeq ($(PLATFORM),PLATFORM_DESKTOP) | |||
| # No uname.exe on MinGW!, but OS=Windows_NT on Windows! ifeq ($(UNAME),Msys) -> Windows | |||
| ifeq ($(OS),Windows_NT) | |||
| PLATFORM_OS=WINDOWS | |||
| LIBPATH=win32 | |||
| else | |||
| UNAMEOS:=$(shell uname) | |||
| ifeq ($(UNAMEOS),Linux) | |||
| PLATFORM_OS=LINUX | |||
| LIBPATH=linux | |||
| else | |||
| ifeq ($(UNAMEOS),Darwin) | |||
| PLATFORM_OS=OSX | |||
| LIBPATH=osx | |||
| endif | |||
| endif | |||
| endif | |||
| endif | |||
| # define compiler: gcc for C program, define as g++ for C++ | |||
| ifeq ($(PLATFORM),PLATFORM_WEB) | |||
| # define emscripten compiler | |||
| CC = emcc | |||
| else | |||
| ifeq ($(PLATFORM_OS),OSX) | |||
| # define llvm compiler for mac | |||
| CC = clang | |||
| else | |||
| # define default gcc compiler | |||
| CC = gcc | |||
| endif | |||
| endif | |||
| # define compiler flags: | |||
| # -O2 defines optimization level | |||
| # -Wall turns on most, but not all, compiler warnings | |||
| # -std=c99 use standard C from 1999 revision | |||
| ifeq ($(PLATFORM),PLATFORM_RPI) | |||
| CFLAGS = -O2 -Wall -std=gnu99 -fgnu89-inline | |||
| else | |||
| CFLAGS = -O2 -Wall -std=c99 | |||
| endif | |||
| ifeq ($(PLATFORM),PLATFORM_WEB) | |||
| CFLAGS = -O1 -Wall -std=c99 -s USE_GLFW=3 --preload-file resources -s ALLOW_MEMORY_GROWTH=1 | |||
| #-s ASSERTIONS=1 --preload-file resources | |||
| #-s ALLOW_MEMORY_GROWTH=1 # to allow memory resizing | |||
| #-s TOTAL_MEMORY=16777216 # to specify heap memory size (default = 16MB) | |||
| endif | |||
| #CFLAGSEXTRA = -Wextra -Wmissing-prototypes -Wstrict-prototypes | |||
| # define any directories containing required header files | |||
| INCLUDES = -I. -I../src -I../src/external | |||
| ifeq ($(PLATFORM),PLATFORM_RPI) | |||
| INCLUDES += -I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads | |||
| endif | |||
| ifeq ($(PLATFORM),PLATFORM_DESKTOP) | |||
| # add standard directories for GNU/Linux | |||
| ifeq ($(PLATFORM_OS),LINUX) | |||
| INCLUDES += -I/usr/local/include/raylib/ | |||
| else ifeq ($(PLATFORM_OS),WINDOWS) | |||
| # external libraries headers | |||
| # GLFW3 | |||
| INCLUDES += -I../src/external/glfw3/include | |||
| # OpenAL Soft | |||
| INCLUDES += -I../src/external/openal_soft/include | |||
| endif | |||
| endif | |||
| # define library paths containing required libs | |||
| LFLAGS = -L. -L../src -L$(RAYLIB_PATH) | |||
| ifeq ($(PLATFORM),PLATFORM_RPI) | |||
| LFLAGS += -L/opt/vc/lib | |||
| endif | |||
| ifeq ($(PLATFORM),PLATFORM_DESKTOP) | |||
| # add standard directories for GNU/Linux | |||
| ifeq ($(PLATFORM_OS),WINDOWS) | |||
| # external libraries to link with | |||
| # GLFW3 | |||
| LFLAGS += -L../src/external/glfw3/lib/$(LIBPATH) | |||
| # OpenAL Soft | |||
| LFLAGS += -L../src/external/openal_soft/lib/$(LIBPATH) | |||
| endif | |||
| endif | |||
| # define any libraries to link into executable | |||
| # if you want to link libraries (libname.so or libname.a), use the -lname | |||
| ifeq ($(PLATFORM),PLATFORM_DESKTOP) | |||
| ifeq ($(PLATFORM_OS),LINUX) | |||
| # libraries for Debian GNU/Linux desktop compiling | |||
| # requires the following packages: | |||
| # libglfw3-dev libopenal-dev libegl1-mesa-dev | |||
| LIBS = -lraylib -lglfw3 -lGL -lopenal -lm -pthread -ldl | |||
| # on XWindow could require also below libraries, just uncomment | |||
| #LIBS += -lX11 -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor | |||
| else | |||
| ifeq ($(PLATFORM_OS),OSX) | |||
| # libraries for OS X 10.9 desktop compiling | |||
| # requires the following packages: | |||
| # libglfw3-dev libopenal-dev libegl1-mesa-dev | |||
| LIBS = -lraylib -lglfw3 -framework OpenGL -framework OpenAl -framework Cocoa | |||
| else | |||
| # libraries for Windows desktop compiling | |||
| # NOTE: GLFW3 and OpenAL Soft libraries should be installed | |||
| LIBS = -lraylib -lglfw3 -lopengl32 -lopenal32 -lgdi32 | |||
| endif | |||
| endif | |||
| endif | |||
| ifeq ($(PLATFORM),PLATFORM_RPI) | |||
| # libraries for Raspberry Pi compiling | |||
| # NOTE: OpenAL Soft library should be installed (libopenal1 package) | |||
| LIBS = -lraylib -lGLESv2 -lEGL -lpthread -lrt -lm -lbcm_host -lopenal | |||
| endif | |||
| ifeq ($(PLATFORM),PLATFORM_WEB) | |||
| # just adjust the correct path to libraylib.bc | |||
| LIBS = ../release/html5/libraylib.bc | |||
| endif | |||
| # define additional parameters and flags for windows | |||
| ifeq ($(PLATFORM_OS),WINDOWS) | |||
| # resources file contains windows exe icon | |||
| # -Wl,--subsystem,windows hides the console window | |||
| WINFLAGS = C:\raylib\raylib_icon | |||
| endif | |||
| ifeq ($(PLATFORM),PLATFORM_WEB) | |||
| EXT = .html | |||
| endif | |||
| # define all screen object files required | |||
| SCREENS = \ | |||
| screens/screen_logo.o \ | |||
| screens/screen_title.o \ | |||
| screens/screen_gameplay.o \ | |||
| screens/screen_ending.o \ | |||
| # typing 'make' will invoke the first target entry in the file, | |||
| # in this case, the 'default' target entry is koala_seasons | |||
| default: koala_seasons | |||
| # compile template - koala_seasons | |||
| koala_seasons: koala_seasons.c $(SCREENS) | |||
| $(CC) -o $@$(EXT) $^ $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -D$(PLATFORM) $(WINFLAGS) | |||
| # compile screen LOGO | |||
| screens/screen_logo.o: screens/screen_logo.c | |||
| $(CC) -c $< -o $@ $(CFLAGS) $(INCLUDES) -D$(PLATFORM) | |||
| # compile screen TITLE | |||
| screens/screen_title.o: screens/screen_title.c | |||
| $(CC) -c $< -o $@ $(CFLAGS) $(INCLUDES) -D$(PLATFORM) | |||
| # compile screen OPTIONS | |||
| screens/screen_options.o: screens/screen_options.c | |||
| $(CC) -c $< -o $@ $(CFLAGS) $(INCLUDES) -D$(PLATFORM) | |||
| # compile screen GAMEPLAY | |||
| screens/screen_gameplay.o: screens/screen_gameplay.c | |||
| $(CC) -c $< -o $@ $(CFLAGS) $(INCLUDES) -D$(PLATFORM) | |||
| # compile screen ENDING | |||
| screens/screen_ending.o: screens/screen_ending.c | |||
| $(CC) -c $< -o $@ $(CFLAGS) $(INCLUDES) -D$(PLATFORM) | |||
| # clean everything | |||
| clean: | |||
| ifeq ($(PLATFORM),PLATFORM_DESKTOP) | |||
| ifeq ($(PLATFORM_OS),OSX) | |||
| find . -type f -perm +ugo+x -delete | |||
| rm -f *.o | |||
| else | |||
| ifeq ($(PLATFORM_OS),LINUX) | |||
| find -type f -executable | xargs file -i | grep -E 'x-object|x-archive|x-sharedlib|x-executable' | rev | cut -d ':' -f 2- | rev | xargs rm -f | |||
| else | |||
| del *.o *.exe | |||
| endif | |||
| endif | |||
| endif | |||
| ifeq ($(PLATFORM),PLATFORM_RPI) | |||
| find . -type f -executable -delete | |||
| rm -f *.o | |||
| endif | |||
| ifeq ($(PLATFORM),PLATFORM_WEB) | |||
| del *.o *.html *.js | |||
| endif | |||
| @echo Cleaning done | |||
| # instead of defining every module one by one, we can define a pattern | |||
| # this pattern below will automatically compile every module defined on $(OBJS) | |||
| #%.exe : %.c | |||
| # $(CC) -o $@ $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -D$(PLATFORM) | |||
| @ -0,0 +1,281 @@ | |||
| /******************************************************************************************* | |||
| * | |||
| * raylib - Koala Seasons game | |||
| * | |||
| * Koala Seasons is a runner, you must survive as long as possible jumping from tree to tree | |||
| * Ready to start the adventure? How long can you survive? | |||
| * | |||
| * This game has been created using raylib 1.5 (www.raylib.com) | |||
| * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) | |||
| * | |||
| * Copyright (c) 2014-2016 Ramon Santamaria (@raysan5) | |||
| * | |||
| ********************************************************************************************/ | |||
| #include "raylib.h" | |||
| #include "screens/screens.h" // NOTE: Defines currentScreen | |||
| #if defined(PLATFORM_WEB) | |||
| #include <emscripten/emscripten.h> | |||
| #endif | |||
| //---------------------------------------------------------------------------------- | |||
| // Global Variables Definition (local to this module) | |||
| //---------------------------------------------------------------------------------- | |||
| static float transAlpha = 0; | |||
| static bool onTransition = false; | |||
| static bool transFadeOut = false; | |||
| static int transFromScreen = -1; | |||
| static int transToScreen = -1; | |||
| static int framesCounter = 0; | |||
| static Music music; | |||
| //---------------------------------------------------------------------------------- | |||
| // Local Functions Declaration | |||
| //---------------------------------------------------------------------------------- | |||
| void TransitionToScreen(int screen); | |||
| void UpdateTransition(void); | |||
| void DrawTransition(void); | |||
| void UpdateDrawFrame(void); // Update and Draw one frame | |||
| //---------------------------------------------------------------------------------- | |||
| // Main entry point | |||
| //---------------------------------------------------------------------------------- | |||
| #if defined(PLATFORM_ANDROID) | |||
| void android_main(struct android_app *app) | |||
| #else | |||
| int main(void) | |||
| #endif | |||
| { | |||
| // Initialization | |||
| //--------------------------------------------------------- | |||
| const int screenWidth = 1280; | |||
| const int screenHeight = 720; | |||
| const char windowTitle[30] = "KOALA SEASONS"; | |||
| //ShowLogo(); | |||
| //SetConfigFlags(FLAG_FULLSCREEN_MODE); | |||
| #if defined(PLATFORM_ANDROID) | |||
| InitWindow(screenWidth, screenHeight, app); | |||
| #else | |||
| InitWindow(screenWidth, screenHeight, windowTitle); | |||
| #endif | |||
| // Load global data here (assets that must be available in all screens, i.e. fonts) | |||
| font = LoadSpriteFont("resources/graphics/mainfont.png"); | |||
| atlas01 = LoadTexture("resources/graphics/atlas01.png"); | |||
| atlas02 = LoadTexture("resources/graphics/atlas02.pvr"); | |||
| #if defined(PLATFORM_WEB) || defined(PLATFORM_RPI) || defined(PLATFORM_ANDROID) | |||
| colorBlend = LoadShader("resources/shaders/glsl100/base.vs", "resources/shaders/glsl100/blend_color.fs"); | |||
| #else | |||
| colorBlend = LoadShader("resources/shaders/glsl330/base.vs", "resources/shaders/glsl330/blend_color.fs"); | |||
| #endif | |||
| InitAudioDevice(); | |||
| // Load sounds data | |||
| fxJump = LoadSound("resources/audio/jump.ogg"); | |||
| fxDash = LoadSound("resources/audio/dash.ogg"); | |||
| fxEatLeaves = LoadSound("resources/audio/eat_leaves.ogg"); | |||
| fxHitResin = LoadSound("resources/audio/resin_hit.ogg"); | |||
| fxWind = LoadSound("resources/audio/wind_sound.ogg"); | |||
| fxDieSnake = LoadSound("resources/audio/snake_die.ogg"); | |||
| fxDieDingo = LoadSound("resources/audio/dingo_die.ogg"); | |||
| fxDieOwl = LoadSound("resources/audio/owl_die.ogg"); | |||
| music = LoadMusicStream("resources/audio/jngl.xm"); | |||
| PlayMusicStream(music); | |||
| SetMusicVolume(music, 1.0f); | |||
| // Define and init first screen | |||
| // NOTE: currentScreen is defined in screens.h as a global variable | |||
| currentScreen = TITLE; | |||
| InitLogoScreen(); | |||
| //InitOptionsScreen(); | |||
| 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()) UpdateDrawFrame(); | |||
| #endif | |||
| // De-Initialization | |||
| //-------------------------------------------------------------------------------------- | |||
| UnloadEndingScreen(); | |||
| UnloadTitleScreen(); | |||
| UnloadGameplayScreen(); | |||
| UnloadLogoScreen(); | |||
| UnloadTexture(atlas01); | |||
| UnloadTexture(atlas02); | |||
| UnloadSpriteFont(font); | |||
| UnloadShader(colorBlend); // Unload color overlay blending shader | |||
| UnloadSound(fxJump); | |||
| UnloadSound(fxDash); | |||
| UnloadSound(fxEatLeaves); | |||
| UnloadSound(fxHitResin); | |||
| UnloadSound(fxWind); | |||
| UnloadSound(fxDieSnake); | |||
| UnloadSound(fxDieDingo); | |||
| UnloadSound(fxDieOwl); | |||
| UnloadMusicStream(music); | |||
| CloseAudioDevice(); // Close audio device | |||
| CloseWindow(); // Close window and OpenGL context | |||
| //-------------------------------------------------------------------------------------- | |||
| #if !defined(PLATFORM_ANDROID) | |||
| return 0; | |||
| #endif | |||
| } | |||
| void TransitionToScreen(int screen) | |||
| { | |||
| onTransition = true; | |||
| transFromScreen = currentScreen; | |||
| transToScreen = screen; | |||
| } | |||
| void UpdateTransition(void) | |||
| { | |||
| if (!transFadeOut) | |||
| { | |||
| transAlpha += 0.05f; | |||
| if (transAlpha >= 1.0) | |||
| { | |||
| transAlpha = 1.0; | |||
| currentScreen = transToScreen; | |||
| transFadeOut = true; | |||
| framesCounter = 0; | |||
| } | |||
| } | |||
| else // Transition fade out logic | |||
| { | |||
| transAlpha -= 0.05f; | |||
| if (transAlpha <= 0) | |||
| { | |||
| transAlpha = 0; | |||
| transFadeOut = false; | |||
| onTransition = false; | |||
| transFromScreen = -1; | |||
| transToScreen = -1; | |||
| } | |||
| } | |||
| } | |||
| void DrawTransition(void) | |||
| { | |||
| DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(BLACK, transAlpha)); | |||
| } | |||
| // Update and Draw one frame | |||
| void UpdateDrawFrame(void) | |||
| { | |||
| // Update | |||
| //---------------------------------------------------------------------------------- | |||
| if (!onTransition) | |||
| { | |||
| switch (currentScreen) | |||
| { | |||
| case LOGO: | |||
| { | |||
| UpdateLogoScreen(); | |||
| if (FinishLogoScreen()) TransitionToScreen(TITLE); | |||
| } break; | |||
| case TITLE: | |||
| { | |||
| UpdateTitleScreen(); | |||
| // NOTE: FinishTitleScreen() return an int defining the screen to jump to | |||
| if (FinishTitleScreen() == 1) | |||
| { | |||
| UnloadTitleScreen(); | |||
| //currentScreen = OPTIONS; | |||
| //InitOptionsScreen(); | |||
| } | |||
| else if (FinishTitleScreen() == 2) | |||
| { | |||
| UnloadTitleScreen(); | |||
| InitGameplayScreen(); | |||
| TransitionToScreen(GAMEPLAY); | |||
| } | |||
| } break; | |||
| case GAMEPLAY: | |||
| { | |||
| UpdateGameplayScreen(); | |||
| if (FinishGameplayScreen()) | |||
| { | |||
| UnloadGameplayScreen(); | |||
| InitEndingScreen(); | |||
| TransitionToScreen(ENDING); | |||
| } | |||
| } break; | |||
| case ENDING: | |||
| { | |||
| UpdateEndingScreen(); | |||
| if (FinishEndingScreen()) | |||
| { | |||
| UnloadEndingScreen(); | |||
| InitGameplayScreen(); | |||
| TransitionToScreen(GAMEPLAY); | |||
| } | |||
| } break; | |||
| default: break; | |||
| } | |||
| } | |||
| else UpdateTransition(); | |||
| UpdateMusicStream(music); | |||
| //---------------------------------------------------------------------------------- | |||
| // Draw | |||
| //---------------------------------------------------------------------------------- | |||
| BeginDrawing(); | |||
| ClearBackground(WHITE); | |||
| switch (currentScreen) | |||
| { | |||
| case LOGO: DrawLogoScreen(); break; | |||
| case TITLE: DrawTitleScreen(); break; | |||
| case GAMEPLAY: DrawGameplayScreen(); break; | |||
| case ENDING: DrawEndingScreen(); break; | |||
| default: break; | |||
| } | |||
| if (onTransition) DrawTransition(); | |||
| DrawFPS(20, GetScreenHeight() - 30); | |||
| DrawRectangle(GetScreenWidth() - 200, GetScreenHeight() - 50, 200, 40, Fade(WHITE, 0.6f)); | |||
| DrawText("ALPHA VERSION", GetScreenWidth() - 180, GetScreenHeight() - 40, 20, DARKGRAY); | |||
| EndDrawing(); | |||
| //---------------------------------------------------------------------------------- | |||
| } | |||
| @ -0,0 +1,25 @@ | |||
| #version 100 | |||
| // Input vertex attributes | |||
| attribute vec3 vertexPosition; | |||
| attribute vec2 vertexTexCoord; | |||
| attribute vec4 vertexColor; | |||
| // Input uniform values | |||
| uniform mat4 mvpMatrix; | |||
| // Output vertex attributes (to fragment shader) | |||
| varying vec2 fragTexCoord; | |||
| varying vec4 fragColor; | |||
| // NOTE: Add here your custom variables | |||
| void main() | |||
| { | |||
| // Send vertex attributes to fragment shader | |||
| fragTexCoord = vertexTexCoord; | |||
| fragColor = vertexColor; | |||
| // Calculate final vertex position | |||
| gl_Position = mvpMatrix*vec4(vertexPosition, 1.0); | |||
| } | |||
| @ -0,0 +1,63 @@ | |||
| #version 100 | |||
| precision mediump float; | |||
| // Input vertex attributes (from vertex shader) | |||
| in vec2 fragTexCoord; | |||
| in vec4 fragColor; | |||
| // Input uniform values | |||
| uniform sampler2D texture0; | |||
| uniform vec4 colDiffuse; | |||
| // NOTE: Add here your custom variables | |||
| vec3 BlendOverlay(vec3 base, vec3 blend) | |||
| { | |||
| float red; | |||
| float green; | |||
| float blue; | |||
| if (base.r < 0.5) red = 2.0*base.r*blend.r; | |||
| else red = 1.0 - 2.0*(1.0 - base.r)*(1.0 - blend.r); | |||
| if (base.g < 0.5) green = 2.0*base.g*blend.g; | |||
| else green = 1.0 - 2.0 *(1.0 - base.g)*(1.0 - blend.g); | |||
| if (base.b < 0.5) blue = 2.0*base.b*blend.b; | |||
| else blue = 1.0 - 2.0 *(1.0 - base.b)*(1.0 - blend.b); | |||
| return vec3(red, green, blue); | |||
| } | |||
| void main() | |||
| { | |||
| // Blending Overlay | |||
| vec4 base = texture2D(texture0, fragTexCoord); | |||
| // No blending shader -> 64 FPS (1280x720) | |||
| //gl_FragColor = base*fragColor; | |||
| // Option01 -> 50 FPS (1280x720), 200 FPS (640x360) | |||
| vec3 final = BlendOverlay(base.rgb, fragColor.rgb); | |||
| gl_FragColor = vec4(final.rgb, base.a*fragColor.a); | |||
| // Option02 (Doesn't work) -> 63 FPS (1280x720) | |||
| //float luminance = (base.r*0.2126) + (base.g*0.7152) + (base.b*0.0722); | |||
| //gl_FragColor = vec4(tint*luminance, base.a); | |||
| // Option03 (no branches, precalculated ifs) -> 28 FPS (1280x720) | |||
| /* | |||
| vec4 blend = fragColor; | |||
| //if (base.a == 0.0) discard; // No improvement | |||
| vec3 br = clamp(sign(base.rgb - vec3(0.5)), vec3(0.0), vec3(1.0)); | |||
| vec3 multiply = 2.0 * base.rgb * blend.rgb; | |||
| vec3 screen = vec3(1.0) - 2.0 * (vec3(1.0) - base.rgb)*(vec3(1.0) - blend.rgb); | |||
| vec3 overlay = mix(multiply, screen, br); | |||
| vec3 finalColor = mix(base.rgb, overlay, blend.a); | |||
| gl_FragColor = vec4(finalColor, base.a); | |||
| */ | |||
| // Option04 (no branches, using built-in functions) -> 38 FPS (1280x720) | |||
| //gl_FragColor = vec4(mix(1 - 2*(1 - base.rgb)*(1 - tint), 2*base.rgb*tint, step(0.5, base.rgb)), base.a); | |||
| } | |||
| @ -0,0 +1,25 @@ | |||
| #version 330 | |||
| // Input vertex attributes | |||
| in vec3 vertexPosition; | |||
| in vec2 vertexTexCoord; | |||
| in vec4 vertexColor; | |||
| // Input uniform values | |||
| uniform mat4 mvpMatrix; | |||
| // Output vertex attributes (to fragment shader) | |||
| out vec2 fragTexCoord; | |||
| out vec4 fragColor; | |||
| // NOTE: Add here your custom variables | |||
| void main() | |||
| { | |||
| // Send vertex attributes to fragment shader | |||
| fragTexCoord = vertexTexCoord; | |||
| fragColor = vertexColor; | |||
| // Calculate final vertex position | |||
| gl_Position = mvpMatrix*vec4(vertexPosition, 1.0); | |||
| } | |||
| @ -0,0 +1,64 @@ | |||
| #version 330 | |||
| // Input vertex attributes (from vertex shader) | |||
| in vec2 fragTexCoord; | |||
| in vec4 fragColor; | |||
| // Input uniform values | |||
| uniform sampler2D texture0; | |||
| uniform vec4 colDiffuse; | |||
| // Output fragment color | |||
| out vec4 finalColor; | |||
| // NOTE: Add here your custom variables | |||
| vec3 BlendOverlay(vec3 base, vec3 blend) | |||
| { | |||
| float red; | |||
| float green; | |||
| float blue; | |||
| if (base.r < 0.5) red = 2.0*base.r*blend.r; | |||
| else red = 1.0 - 2.0*(1.0 - base.r)*(1.0 - blend.r); | |||
| if (base.g < 0.5) green = 2.0*base.g*blend.g; | |||
| else green = 1.0 - 2.0 *(1.0 - base.g)*(1.0 - blend.g); | |||
| if (base.b < 0.5) blue = 2.0*base.b*blend.b; | |||
| else blue = 1.0 - 2.0 *(1.0 - base.b)*(1.0 - blend.b); | |||
| return vec3(red, green, blue); | |||
| } | |||
| void main() | |||
| { | |||
| // Blending Overlay | |||
| vec4 base = texture2D(texture0, fragTexCoord); | |||
| // No blending shader -> 64 FPS (1280x720) | |||
| //gl_FragColor = base*tintColor; | |||
| // Option01 -> 50 FPS (1280x720), 200 FPS (640x360) | |||
| vec3 final = BlendOverlay(base.rgb, fragColor.rgb); | |||
| finalColor = vec4(final.rgb, base.a*fragColor.a); | |||
| // Option02 (Doesn't work) -> 63 FPS (1280x720) | |||
| //float luminance = (base.r*0.2126) + (base.g*0.7152) + (base.b*0.0722); | |||
| //gl_FragColor = vec4(tintColor.rgb*luminance, base.a); | |||
| // Option03 (no branches, precalculated ifs) -> 28 FPS (1280x720) | |||
| /* | |||
| vec4 blend = tintColor; | |||
| //if (base.a == 0.0) discard; // No improvement | |||
| vec3 br = clamp(sign(base.rgb - vec3(0.5)), vec3(0.0), vec3(1.0)); | |||
| vec3 multiply = 2.0 * base.rgb * blend.rgb; | |||
| vec3 screen = vec3(1.0) - 2.0 * (vec3(1.0) - base.rgb)*(vec3(1.0) - blend.rgb); | |||
| vec3 overlay = mix(multiply, screen, br); | |||
| vec3 finalColor = mix(base.rgb, overlay, blend.a); | |||
| gl_FragColor = vec4(finalColor, base.a); | |||
| */ | |||
| // Option04 (no branches, using built-in functions) -> 38 FPS (1280x720) | |||
| //gl_FragColor = vec4(mix(1 - 2*(1 - base.rgb)*(1 - tintColor.rgb), 2*base.rgb*tintColor.rgb, step(0.5, base.rgb)), base.a); | |||
| } | |||
| @ -0,0 +1,86 @@ | |||
| #define ending_button_replay (Rectangle){ 974, 1403, 123, 123 } | |||
| #define ending_button_share (Rectangle){ 954, 1528, 123, 123 } | |||
| #define ending_button_shop (Rectangle){ 958, 1653, 123, 123 } | |||
| #define ending_button_trophy (Rectangle){ 1479, 386, 123, 123 } | |||
| #define ending_goals_board (Rectangle){ 2, 254, 761, 422 } | |||
| #define ending_goals_check_plate (Rectangle){ 316, 2006, 36, 34 } | |||
| #define ending_goals_check_v (Rectangle){ 1727, 239, 50, 42 } | |||
| #define ending_goals_check_x (Rectangle){ 354, 1885, 42, 51 } | |||
| #define ending_goals_icon_death (Rectangle){ 1382, 516, 60, 60 } | |||
| #define ending_goals_icon_leaves (Rectangle){ 1444, 516, 60, 60 } | |||
| #define ending_goals_icon_special (Rectangle){ 1506, 511, 60, 60 } | |||
| #define ending_goals_icon_time (Rectangle){ 1568, 511, 60, 60 } | |||
| #define ending_paint_back (Rectangle){ 765, 254, 258, 305 } | |||
| #define ending_paint_frame (Rectangle){ 103, 1028, 334, 393 } | |||
| #define ending_paint_koalabee (Rectangle){ 439, 1060, 219, 216 } | |||
| #define ending_paint_koaladingo (Rectangle){ 439, 1278, 219, 216 } | |||
| #define ending_paint_koalaeagle (Rectangle){ 405, 1496, 219, 216 } | |||
| #define ending_paint_koalafire (Rectangle){ 771, 643, 219, 216 } | |||
| #define ending_paint_koalageneric (Rectangle){ 516, 678, 253, 250 } | |||
| #define ending_paint_koalaowl (Rectangle){ 661, 1790, 100, 81 } | |||
| #define ending_paint_koalasnake (Rectangle){ 774, 861, 219, 216 } | |||
| #define ending_plate_frame (Rectangle){ 2, 2, 1052, 250 } | |||
| #define ending_plate_headbee (Rectangle){ 1318, 516, 62, 60 } | |||
| #define ending_plate_headdingo (Rectangle){ 1481, 182, 56, 70 } | |||
| #define ending_plate_headeagle (Rectangle){ 1974, 116, 39, 48 } | |||
| #define ending_plate_headowl (Rectangle){ 226, 1885, 68, 52 } | |||
| #define ending_plate_headsnake (Rectangle){ 65, 1968, 46, 67 } | |||
| #define ending_score_enemyicon (Rectangle){ 661, 1697, 113, 91 } | |||
| #define ending_score_frame (Rectangle){ 419, 1714, 119, 123 } | |||
| #define ending_score_frameback (Rectangle){ 540, 1714, 119, 123 } | |||
| #define ending_score_leavesicon (Rectangle){ 1387, 254, 135, 130 } | |||
| #define ending_score_planklarge (Rectangle){ 1056, 132, 525, 48 } | |||
| #define ending_score_planksmall (Rectangle){ 1583, 116, 389, 48 } | |||
| #define ending_score_seasonicon (Rectangle){ 925, 1265, 135, 136 } | |||
| #define ending_score_seasonneedle (Rectangle){ 2032, 2, 12, 45 } | |||
| #define gameplay_countdown_1 (Rectangle){ 660, 1302, 110, 216 } | |||
| #define gameplay_countdown_2 (Rectangle){ 2, 1750, 110, 216 } | |||
| #define gameplay_countdown_3 (Rectangle){ 114, 1728, 110, 216 } | |||
| #define gameplay_enemy_bee (Rectangle){ 1025, 486, 250, 60 } | |||
| #define gameplay_enemy_dingo (Rectangle){ 755, 1079, 240, 150 } | |||
| #define gameplay_enemy_eagle (Rectangle){ 1570, 2, 460, 80 } | |||
| #define gameplay_enemy_eagle_death (Rectangle){ 1327, 386, 150, 128 } | |||
| #define gameplay_enemy_owl (Rectangle){ 765, 561, 240, 80 } | |||
| #define gameplay_enemy_snake (Rectangle){ 1025, 254, 360, 128 } | |||
| #define gameplay_fx_eaglealert (Rectangle){ 660, 1060, 93, 240 } | |||
| #define gameplay_fx_lightraymid (Rectangle){ 2, 1028, 54, 710 } | |||
| #define gameplay_gui_leafcounter_base (Rectangle){ 626, 1520, 178, 175 } | |||
| #define gameplay_gui_leafcounter_cell (Rectangle){ 972, 1231, 32, 32 } | |||
| #define gameplay_gui_leafcounter_glow (Rectangle){ 806, 1519, 146, 146 } | |||
| #define gameplay_gui_leafcounter_pulsel (Rectangle){ 226, 1728, 157, 155 } | |||
| #define gameplay_gui_seasonsclock_base (Rectangle){ 772, 1265, 151, 150 } | |||
| #define gameplay_gui_seasonsclock_disc (Rectangle){ 103, 1423, 300, 303 } | |||
| #define gameplay_koala_dash (Rectangle){ 1079, 1528, 100, 100 } | |||
| #define gameplay_koala_die (Rectangle){ 1083, 1630, 100, 100 } | |||
| #define gameplay_koala_fly (Rectangle){ 114, 1946, 200, 100 } | |||
| #define gameplay_koala_idle (Rectangle){ 1025, 384, 300, 100 } | |||
| #define gameplay_koala_jump (Rectangle){ 1083, 1732, 100, 100 } | |||
| #define gameplay_koala_menu (Rectangle){ 806, 1667, 150, 100 } | |||
| #define gameplay_koala_transform (Rectangle){ 772, 1417, 200, 100 } | |||
| #define gameplay_props_burnttree (Rectangle){ 58, 1028, 43, 720 } | |||
| #define gameplay_props_fire_spritesheet (Rectangle){ 516, 930, 256, 128 } | |||
| #define gameplay_props_ice_sprite (Rectangle){ 385, 1728, 32, 128 } | |||
| #define gameplay_props_leaf_big (Rectangle){ 1857, 166, 64, 64 } | |||
| #define gameplay_props_leaf_lil (Rectangle){ 1923, 166, 64, 64 } | |||
| #define gameplay_props_leaf_mid (Rectangle){ 316, 1940, 64, 64 } | |||
| #define gameplay_props_resin_sprite (Rectangle){ 405, 1423, 32, 64 } | |||
| #define gameplay_props_whirlwind_spritesheet (Rectangle){ 1056, 2, 512, 128 } | |||
| #define particle_dandelion (Rectangle){ 354, 2006, 32, 32 } | |||
| #define particle_ecualyptusflower (Rectangle){ 1989, 166, 32, 32 } | |||
| #define particle_ecualyptusleaf (Rectangle){ 1989, 200, 32, 32 } | |||
| #define particle_hit (Rectangle){ 296, 1885, 56, 53 } | |||
| #define particle_icecrystal (Rectangle){ 419, 1839, 32, 32 } | |||
| #define particle_planetreeleaf (Rectangle){ 453, 1839, 32, 32 } | |||
| #define particle_waterdrop (Rectangle){ 487, 1839, 32, 32 } | |||
| #define title_facebook (Rectangle){ 1539, 182, 92, 92 } | |||
| #define title_googleplay (Rectangle){ 1524, 276, 92, 92 } | |||
| #define title_music_off (Rectangle){ 1790, 166, 65, 66 } | |||
| #define title_music_on (Rectangle){ 1277, 486, 39, 66 } | |||
| #define title_speaker_off (Rectangle){ 2, 1968, 61, 71 } | |||
| #define title_speaker_on (Rectangle){ 1727, 166, 61, 71 } | |||
| #define title_textsnow01 (Rectangle){ 1570, 84, 439, 30 } | |||
| #define title_textsnow02 (Rectangle){ 1056, 182, 423, 48 } | |||
| #define title_textsnow03 (Rectangle){ 755, 1231, 215, 32 } | |||
| #define title_textsnow04 (Rectangle){ 1056, 232, 414, 20 } | |||
| #define title_titletext (Rectangle){ 2, 678, 512, 348 } | |||
| #define title_twitter (Rectangle){ 1633, 166, 92, 92 } | |||
| @ -0,0 +1,40 @@ | |||
| #define background_fog02 (Rectangle){ 644, 2, 500, 311 } | |||
| #define background_transformation (Rectangle){ 2, 364, 500, 400 } | |||
| #define ending_background (Rectangle){ 2, 766, 256, 256 } | |||
| #define gameplay_back_fx_lightraymid (Rectangle){ 260, 766, 14, 216 } | |||
| #define gameplay_back_ground00 (Rectangle){ 1146, 2, 640, 77 } | |||
| #define gameplay_back_ground01 (Rectangle){ 1146, 81, 640, 77 } | |||
| #define gameplay_back_ground02 (Rectangle){ 1146, 160, 640, 77 } | |||
| #define gameplay_back_ground03 (Rectangle){ 1146, 239, 640, 77 } | |||
| #define gameplay_back_tree01_layer01 (Rectangle){ 1833, 353, 28, 335 } | |||
| #define gameplay_back_tree01_layer02 (Rectangle){ 1998, 338, 28, 335 } | |||
| #define gameplay_back_tree01_layer03 (Rectangle){ 660, 315, 28, 335 } | |||
| #define gameplay_back_tree02_layer01 (Rectangle){ 690, 315, 26, 332 } | |||
| #define gameplay_back_tree02_layer02 (Rectangle){ 718, 315, 26, 332 } | |||
| #define gameplay_back_tree02_layer03 (Rectangle){ 746, 315, 26, 332 } | |||
| #define gameplay_back_tree03_layer01 (Rectangle){ 2028, 338, 15, 329 } | |||
| #define gameplay_back_tree03_layer02 (Rectangle){ 774, 315, 15, 329 } | |||
| #define gameplay_back_tree03_layer03 (Rectangle){ 791, 315, 15, 329 } | |||
| #define gameplay_back_tree04_layer01 (Rectangle){ 1860, 2, 38, 334 } | |||
| #define gameplay_back_tree04_layer02 (Rectangle){ 1900, 2, 38, 334 } | |||
| #define gameplay_back_tree04_layer03 (Rectangle){ 1940, 2, 38, 334 } | |||
| #define gameplay_back_tree05_layer01 (Rectangle){ 504, 364, 32, 349 } | |||
| #define gameplay_back_tree05_layer02 (Rectangle){ 538, 364, 32, 349 } | |||
| #define gameplay_back_tree05_layer03 (Rectangle){ 572, 364, 32, 349 } | |||
| #define gameplay_back_tree06_layer01 (Rectangle){ 1980, 2, 31, 334 } | |||
| #define gameplay_back_tree06_layer02 (Rectangle){ 2013, 2, 31, 334 } | |||
| #define gameplay_back_tree06_layer03 (Rectangle){ 1863, 338, 31, 334 } | |||
| #define gameplay_back_tree07_layer01 (Rectangle){ 606, 364, 25, 349 } | |||
| #define gameplay_back_tree07_layer02 (Rectangle){ 633, 364, 25, 349 } | |||
| #define gameplay_back_tree07_layer03 (Rectangle){ 1833, 2, 25, 349 } | |||
| #define gameplay_back_tree08_layer01 (Rectangle){ 1896, 338, 32, 331 } | |||
| #define gameplay_back_tree08_layer02 (Rectangle){ 1930, 338, 32, 331 } | |||
| #define gameplay_back_tree08_layer03 (Rectangle){ 1964, 338, 32, 331 } | |||
| #define gameplay_background (Rectangle){ 2, 2, 640, 360 } | |||
| #define gameplay_props_owl_branch (Rectangle){ 808, 349, 36, 24 } | |||
| #define gameplay_props_tree (Rectangle){ 1788, 2, 43, 720 } | |||
| #define particle_dandelion_bw (Rectangle){ 504, 715, 32, 32 } | |||
| #define particle_ecualyptusflower_bw (Rectangle){ 808, 315, 32, 32 } | |||
| #define particle_icecrystal_bw (Rectangle){ 276, 766, 32, 32 } | |||
| #define particle_planetreeleaf_bw (Rectangle){ 538, 715, 32, 32 } | |||
| #define particle_waterdrop_bw (Rectangle){ 842, 315, 32, 32 } | |||
| @ -0,0 +1,530 @@ | |||
| /********************************************************************************************** | |||
| * | |||
| * raylib - Koala Seasons game | |||
| * | |||
| * Ending Screen Functions Definitions (Init, Update, Draw, Unload) | |||
| * | |||
| * Copyright (c) 2014-2016 Ramon Santamaria (@raysan5) | |||
| * | |||
| * This software is provided "as-is", without any express or implied warranty. In no event | |||
| * will the authors be held liable for any damages arising from the use of this software. | |||
| * | |||
| * Permission is granted to anyone to use this software for any purpose, including commercial | |||
| * applications, and to alter it and redistribute it freely, subject to the following restrictions: | |||
| * | |||
| * 1. The origin of this software must not be misrepresented; you must not claim that you | |||
| * wrote the original software. If you use this software in a product, an acknowledgment | |||
| * in the product documentation would be appreciated but is not required. | |||
| * | |||
| * 2. Altered source versions must be plainly marked as such, and must not be misrepresented | |||
| * as being the original software. | |||
| * | |||
| * 3. This notice may not be removed or altered from any source distribution. | |||
| * | |||
| **********************************************************************************************/ | |||
| #include "raylib.h" | |||
| #include "screens.h" | |||
| #include <stdio.h> | |||
| #include "atlas01.h" | |||
| #include "atlas02.h" | |||
| typedef enum { DELAY, SEASONS, LEAVES, KILLS, REPLAY } EndingCounter; | |||
| typedef struct { | |||
| Vector2 position; | |||
| Vector2 speed; | |||
| float rotation; | |||
| float size; | |||
| Color color; | |||
| float alpha; | |||
| bool active; | |||
| } Particle; | |||
| //---------------------------------------------------------------------------------- | |||
| // Global Variables Definition (local to this module) | |||
| //---------------------------------------------------------------------------------- | |||
| // Ending screen global variables | |||
| static EndingCounter endingCounter; | |||
| static int framesCounter; | |||
| static int finishScreen; | |||
| static int framesKillsCounter; | |||
| static Rectangle playButton; | |||
| static Rectangle shopButton; | |||
| static Rectangle trophyButton; | |||
| static Rectangle shareButton; | |||
| static Color buttonPlayColor; | |||
| static Color buttonShopColor; | |||
| static Color buttonTrophyColor; | |||
| static Color buttonShareColor; | |||
| static Color backgroundColor; | |||
| static int currentScore; | |||
| static int seasonsCounter; | |||
| static int currentLeavesEnding; | |||
| static int finalYears; | |||
| static int replayTimer; | |||
| static int yearsElapsed; | |||
| static int initRotation; | |||
| static float clockRotation; | |||
| static float finalRotation; | |||
| static bool replaying; | |||
| static bool active[MAX_KILLS]; | |||
| static char initMonthText[32]; | |||
| static char finalMonthText[32]; | |||
| static Particle leafParticles[20]; | |||
| static int drawTimer; | |||
| // Death texts | |||
| const char textOwl01[32] = "Turned into a pretty"; | |||
| const char textOwl02[32] = "owl pellet"; | |||
| const char textDingo01[32] = "A dingo took your life"; | |||
| const char textFire01[32] = "Kissed by fire"; | |||
| const char textSnake01[32] = "Digested alive by a"; | |||
| const char textSnake02[32] = "big snake"; | |||
| const char textNaturalDeath01[32] = "LIFE KILLED YOU"; | |||
| const char textBee01[32] = "You turn out to be"; | |||
| const char textBee02[32] = "allergic to bee sting"; | |||
| const char textEagle[32] = "KOALA IS DEAD :("; | |||
| static float LinearEaseIn(float t, float b, float c, float d) { return c*t/d + b; } | |||
| //---------------------------------------------------------------------------------- | |||
| // Ending Screen Functions Definition | |||
| //---------------------------------------------------------------------------------- | |||
| // Ending Screen Initialization logic | |||
| void InitEndingScreen(void) | |||
| { | |||
| framesCounter = -10; | |||
| finishScreen = 0; | |||
| drawTimer = 15; | |||
| replayTimer = 0; | |||
| replaying = false; | |||
| finalYears = initYears + (seasons/4); | |||
| yearsElapsed = seasons/4; | |||
| playButton = (Rectangle){ GetScreenWidth()*0.871, GetScreenHeight()*0.096, 123, 123}; | |||
| shopButton = (Rectangle){ GetScreenWidth()*0.871, GetScreenHeight()*0.303, 123, 123}; | |||
| trophyButton = (Rectangle){ GetScreenWidth()*0.871, GetScreenHeight()*0.513, 123, 123}; | |||
| shareButton = (Rectangle){ GetScreenWidth()*0.871, GetScreenHeight()*0.719, 123, 123}; | |||
| buttonPlayColor = WHITE; | |||
| buttonShopColor = WHITE; | |||
| buttonTrophyColor = WHITE; | |||
| buttonShareColor = WHITE; | |||
| currentScore = 0; | |||
| seasonsCounter = 0; | |||
| currentLeavesEnding = 0; | |||
| endingCounter = DELAY; | |||
| backgroundColor = (Color){ 176, 167, 151, 255}; | |||
| for (int j = 0; j < 20; j++) | |||
| { | |||
| leafParticles[j].active = false; | |||
| leafParticles[j].position = (Vector2){ GetRandomValue(-20, 20), GetRandomValue(-20, 20) }; | |||
| leafParticles[j].speed = (Vector2){ (float)GetRandomValue(-500, 500)/100, (float)GetRandomValue(-500, 500)/100 }; | |||
| leafParticles[j].size = (float)GetRandomValue(3, 10)/5; | |||
| leafParticles[j].rotation = GetRandomValue(0, 360); | |||
| leafParticles[j].color = WHITE; | |||
| leafParticles[j].alpha = 1; | |||
| } | |||
| // Seasons death texts | |||
| if (initSeason == 0) | |||
| { | |||
| sprintf(initMonthText, "SUMMER"); | |||
| clockRotation = 225; | |||
| initRotation = 225; | |||
| } | |||
| else if (initSeason == 1) | |||
| { | |||
| sprintf(initMonthText, "AUTUMN"); | |||
| clockRotation = 135; | |||
| initRotation = 135; | |||
| } | |||
| else if (initSeason == 2) | |||
| { | |||
| sprintf(initMonthText, "WINTER"); | |||
| clockRotation = 45; | |||
| initRotation = 45; | |||
| } | |||
| else if (initSeason == 3) | |||
| { | |||
| sprintf(initMonthText, "SPRING"); | |||
| clockRotation = 315; | |||
| initRotation = 315; | |||
| } | |||
| if (currentSeason == 0) | |||
| { | |||
| sprintf(finalMonthText, "SUMMER"); | |||
| finalRotation = 225 + 360*yearsElapsed; | |||
| } | |||
| else if (currentSeason == 1) | |||
| { | |||
| sprintf(finalMonthText, "AUTUMN"); | |||
| finalRotation = 135 + 360*yearsElapsed; | |||
| } | |||
| else if (currentSeason == 2) | |||
| { | |||
| sprintf(finalMonthText, "WINTER"); | |||
| finalRotation = 45 + 360*yearsElapsed; | |||
| } | |||
| else if (currentSeason == 3) | |||
| { | |||
| sprintf(finalMonthText, "SPRING"); | |||
| finalRotation = 315 + 360*yearsElapsed; | |||
| } | |||
| for (int i = 0; i < MAX_KILLS; i++) active[i] = false; | |||
| } | |||
| // Ending Screen Update logic | |||
| void UpdateEndingScreen(void) | |||
| { | |||
| framesCounter += 1*TIME_FACTOR; | |||
| switch (endingCounter) | |||
| { | |||
| case DELAY: | |||
| { | |||
| if(framesCounter >= 10) | |||
| { | |||
| endingCounter = SEASONS; | |||
| framesCounter = 0; | |||
| } | |||
| } break; | |||
| case SEASONS: | |||
| { | |||
| if (seasons > 0) | |||
| { | |||
| seasonsCounter = (int)LinearEaseIn((float)framesCounter, 0.0f, (float)(seasons), 90.0f); | |||
| clockRotation = LinearEaseIn((float)framesCounter, (float)initRotation, (float)-(finalRotation - initRotation), 90.0f); | |||
| if (framesCounter >= 90) | |||
| { | |||
| endingCounter = LEAVES; | |||
| framesCounter = 0; | |||
| } | |||
| } | |||
| else endingCounter = LEAVES; | |||
| #if (defined(PLATFORM_ANDROID) || defined(PLATFORM_WEB)) | |||
| if (IsGestureDetected(GESTURE_TAP)) | |||
| { | |||
| seasonsCounter = seasons; | |||
| clockRotation = finalRotation; | |||
| framesCounter = 0; | |||
| endingCounter = LEAVES; | |||
| } | |||
| #elif (defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)) | |||
| if (IsKeyPressed(KEY_ENTER)) | |||
| { | |||
| seasonsCounter = seasons; | |||
| clockRotation = finalRotation; | |||
| framesCounter = 0; | |||
| endingCounter = LEAVES; | |||
| } | |||
| #endif | |||
| } break; | |||
| case LEAVES: | |||
| { | |||
| if (currentLeaves > 0) | |||
| { | |||
| if (currentLeavesEnding == currentLeaves) | |||
| { | |||
| endingCounter = KILLS; | |||
| framesCounter = 0; | |||
| } | |||
| else if (currentLeavesEnding < currentLeaves) | |||
| { | |||
| if (framesCounter >= 4) | |||
| { | |||
| currentLeavesEnding += 1; | |||
| framesCounter = 0; | |||
| } | |||
| for (int i = 0; i < 20; i++) | |||
| { | |||
| if (!leafParticles[i].active) | |||
| { | |||
| leafParticles[i].position = (Vector2){ GetScreenWidth()*0.46, GetScreenHeight()*0.32}; | |||
| leafParticles[i].alpha = 1.0f; | |||
| leafParticles[i].active = true; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| else endingCounter = KILLS; | |||
| #if (defined(PLATFORM_ANDROID) || defined(PLATFORM_WEB)) | |||
| if (IsGestureDetected(GESTURE_TAP)) | |||
| { | |||
| currentLeavesEnding = currentLeaves; | |||
| framesCounter = 0; | |||
| endingCounter = KILLS; | |||
| } | |||
| #elif (defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)) | |||
| if (IsKeyPressed(KEY_ENTER)) | |||
| { | |||
| currentLeavesEnding = currentLeaves; | |||
| framesCounter = 0; | |||
| endingCounter = KILLS; | |||
| } | |||
| #endif | |||
| } break; | |||
| case KILLS: | |||
| { | |||
| if (score > 0) | |||
| { | |||
| if (framesCounter <= 90 && !replaying) | |||
| { | |||
| currentScore = (int)LinearEaseIn((float)framesCounter, 0.0f, (float)(score), 90.0f); | |||
| } | |||
| framesKillsCounter += 1*TIME_FACTOR; | |||
| for (int i = 0; i < MAX_KILLS; i++) | |||
| { | |||
| if (framesKillsCounter >= drawTimer && active[i] == false) | |||
| { | |||
| active[i] = true; | |||
| framesKillsCounter = 0; | |||
| } | |||
| } | |||
| if (framesCounter >= 90) | |||
| { | |||
| endingCounter = REPLAY; | |||
| framesCounter = 0; | |||
| } | |||
| } | |||
| else endingCounter = REPLAY; | |||
| #if (defined(PLATFORM_ANDROID) || defined(PLATFORM_WEB)) | |||
| if (IsGestureDetected(GESTURE_TAP)) | |||
| { | |||
| currentScore = score; | |||
| framesCounter = 0; | |||
| for (int i = 0; i < MAX_KILLS; i++) active[i] = true; | |||
| endingCounter = REPLAY; | |||
| } | |||
| #elif (defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)) | |||
| if (IsKeyPressed(KEY_ENTER)) | |||
| { | |||
| currentScore = score; | |||
| framesCounter = 0; | |||
| for (int i = 0; i < MAX_KILLS; i++) active[i] = true; | |||
| endingCounter = REPLAY; | |||
| } | |||
| #endif | |||
| } break; | |||
| case REPLAY: | |||
| { | |||
| #if (defined(PLATFORM_ANDROID) || defined(PLATFORM_WEB)) | |||
| if (IsGestureDetected(GESTURE_TAP)) replaying = true; | |||
| #elif (defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)) | |||
| if (IsKeyPressed(KEY_ENTER)) replaying = true; | |||
| #endif | |||
| if (replaying) | |||
| { | |||
| replayTimer += 1*TIME_FACTOR; | |||
| if (replayTimer >= 30) | |||
| { | |||
| finishScreen = 1; | |||
| initSeason = GetRandomValue(0, 3); | |||
| } | |||
| buttonPlayColor = GOLD; | |||
| } | |||
| } break; | |||
| } | |||
| for (int i = 0; i < 20; i++) | |||
| { | |||
| if (leafParticles[i].active == true) | |||
| { | |||
| leafParticles[i].position.x += leafParticles[i].speed.x; | |||
| leafParticles[i].position.y += leafParticles[i].speed.y; | |||
| leafParticles[i].rotation += 6; | |||
| leafParticles[i].alpha -= 0.03f; | |||
| leafParticles[i].size -= 0.004; | |||
| if (leafParticles[i].size <= 0) leafParticles[i].size = 0.0f; | |||
| if (leafParticles[i].alpha <= 0) | |||
| { | |||
| leafParticles[i].alpha = 0.0f; | |||
| leafParticles[i].active = false; | |||
| } | |||
| } | |||
| } | |||
| // Buttons logic | |||
| #if (defined(PLATFORM_ANDROID) || defined(PLATFORM_WEB)) | |||
| if ((IsGestureDetected(GESTURE_TAP)) && CheckCollisionPointRec(GetTouchPosition(0), playButton)) | |||
| { | |||
| endingCounter = REPLAY; | |||
| replaying = true; | |||
| } | |||
| #elif (defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)) | |||
| if (CheckCollisionPointRec(GetMousePosition(), playButton)) | |||
| { | |||
| buttonPlayColor = GOLD; | |||
| if (IsMouseButtonPressed(0)) | |||
| { | |||
| endingCounter = REPLAY; | |||
| replaying = true; | |||
| } | |||
| } | |||
| else buttonPlayColor = WHITE; | |||
| if (CheckCollisionPointRec(GetMousePosition(), shopButton)) buttonShopColor = GOLD; | |||
| else buttonShopColor = WHITE; | |||
| if (CheckCollisionPointRec(GetMousePosition(), trophyButton)) buttonTrophyColor = GOLD; | |||
| else buttonTrophyColor = WHITE; | |||
| if (CheckCollisionPointRec(GetMousePosition(), shareButton)) buttonShareColor = GOLD; | |||
| else buttonShareColor = WHITE; | |||
| #endif | |||
| } | |||
| // Ending Screen Draw logic | |||
| void DrawEndingScreen(void) | |||
| { | |||
| for (int x = 0; x < 15; x++) | |||
| { | |||
| DrawTextureRec(atlas02, ending_background, (Vector2){ending_background.width*(x%5), ending_background.height*(x/5)}, backgroundColor); | |||
| } | |||
| // Frames and backgrounds | |||
| DrawTexturePro(atlas01, ending_plate_frame, (Rectangle){GetScreenWidth()*0.042, GetScreenHeight()*0.606, ending_plate_frame.width, ending_plate_frame.height}, (Vector2){ 0, 0}, 0, WHITE); | |||
| DrawTexturePro(atlas01, ending_paint_back, (Rectangle){GetScreenWidth()*0.133, GetScreenHeight()*0.097, ending_paint_back.width, ending_paint_back.height}, (Vector2){ 0, 0}, 0, WHITE); | |||
| if (killer == 0) DrawTexturePro(atlas01, ending_paint_koalafire, (Rectangle){GetScreenWidth()*0.145, GetScreenHeight()*0.171, ending_paint_koalafire.width, ending_paint_koalafire.height}, (Vector2){ 0, 0}, 0, WHITE); | |||
| else if (killer == 1) DrawTexturePro(atlas01, ending_paint_koalasnake, (Rectangle){GetScreenWidth()*0.145, GetScreenHeight()*0.171, ending_paint_koalasnake.width, ending_paint_koalasnake.height}, (Vector2){ 0, 0}, 0, WHITE); | |||
| else if (killer == 2) DrawTexturePro(atlas01, ending_paint_koaladingo, (Rectangle){GetScreenWidth()*0.145, GetScreenHeight()*0.171, ending_paint_koaladingo.width, ending_paint_koaladingo.height}, (Vector2){ 0, 0}, 0, WHITE); | |||
| else if (killer == 3) DrawTexturePro(atlas01, ending_paint_koalaowl, (Rectangle){GetScreenWidth()*0.2, GetScreenHeight()*0.3, ending_paint_koalaowl.width, ending_paint_koalaowl.height}, (Vector2){ 0, 0}, 0, WHITE); | |||
| else if (killer == 4) DrawTexturePro(atlas01, ending_paint_koalageneric, (Rectangle){GetScreenWidth()*0.133, GetScreenHeight()*0.171, ending_paint_koalageneric.width, ending_paint_koalageneric.height}, (Vector2){ 0, 0}, 0, WHITE); | |||
| else if (killer == 5) DrawTexturePro(atlas01, ending_paint_koalabee, (Rectangle){GetScreenWidth()*0.145, GetScreenHeight()*0.171, ending_paint_koalabee.width, ending_paint_koalabee.height}, (Vector2){ 0, 0}, 0, WHITE); | |||
| else if (killer == 6) DrawTexturePro(atlas01, ending_paint_koalaeagle, (Rectangle){GetScreenWidth()*0.145, GetScreenHeight()*0.171, ending_paint_koalaeagle.width, ending_paint_koalaeagle.height}, (Vector2){ 0, 0}, 0, WHITE); | |||
| DrawTexturePro(atlas01, ending_paint_frame, (Rectangle){GetScreenWidth()*0.102, GetScreenHeight()*0.035, ending_paint_frame.width, ending_paint_frame.height}, (Vector2){ 0, 0}, 0, WHITE); | |||
| // UI Score planks | |||
| DrawTexturePro(atlas01, ending_score_planksmall, (Rectangle){GetScreenWidth()*0.521, GetScreenHeight()*0.163, ending_score_planksmall.width, ending_score_planksmall.height}, (Vector2){ 0, 0}, 0, WHITE); | |||
| DrawTexturePro(atlas01, ending_score_planklarge, (Rectangle){GetScreenWidth()*0.415, GetScreenHeight()*0.303, ending_score_planklarge.width, ending_score_planklarge.height}, (Vector2){ 0, 0}, 0, WHITE); | |||
| DrawTexturePro(atlas01, ending_score_planksmall, (Rectangle){GetScreenWidth()*0.521, GetScreenHeight()*0.440, ending_score_planksmall.width, ending_score_planksmall.height}, (Vector2){ 0, 0}, 0, WHITE); | |||
| // UI Score icons and frames | |||
| DrawTexturePro(atlas01, ending_score_seasonicon, (Rectangle){GetScreenWidth()*0.529, GetScreenHeight()*0.096, ending_score_seasonicon.width, ending_score_seasonicon.height}, (Vector2){ 0, 0}, 0, WHITE); | |||
| DrawTexturePro(atlas01, ending_score_seasonneedle, (Rectangle){GetScreenWidth()*0.579, GetScreenHeight()*0.189, ending_score_seasonneedle.width, ending_score_seasonneedle.height}, (Vector2){ending_score_seasonneedle.width/2, ending_score_seasonneedle.height*0.9}, clockRotation, WHITE); | |||
| DrawTexturePro(atlas01, ending_score_frame, (Rectangle){GetScreenWidth()*0.535, GetScreenHeight()*0.11, ending_score_frame.width, ending_score_frame.height}, (Vector2){ 0, 0}, 0, WHITE); | |||
| DrawTexturePro(atlas01, ending_score_frameback, (Rectangle){GetScreenWidth()*0.430, GetScreenHeight()*0.246, ending_score_frameback.width, ending_score_frameback.height}, (Vector2){ 0, 0}, 0, WHITE); | |||
| DrawTexturePro(atlas01, ending_score_frame, (Rectangle){GetScreenWidth()*0.429, GetScreenHeight()*0.244, ending_score_frame.width, ending_score_frame.height}, (Vector2){ 0, 0}, 0, WHITE); | |||
| for (int i = 0; i < 20; i++) | |||
| { | |||
| if (leafParticles[i].active) | |||
| { | |||
| DrawTexturePro(atlas01, particle_ecualyptusleaf, | |||
| (Rectangle){ leafParticles[i].position.x, leafParticles[i].position.y, particle_ecualyptusleaf.width*leafParticles[i].size, particle_ecualyptusleaf.height*leafParticles[i].size }, | |||
| (Vector2){ particle_ecualyptusleaf.width/2*leafParticles[i].size, particle_ecualyptusleaf.height/2*leafParticles[i].size }, leafParticles[i].rotation, Fade(WHITE,leafParticles[i].alpha)); | |||
| } | |||
| } | |||
| DrawTexturePro(atlas01, ending_score_leavesicon, (Rectangle){GetScreenWidth()*0.421, GetScreenHeight()*0.228, ending_score_leavesicon.width, ending_score_leavesicon.height}, (Vector2){ 0, 0}, 0, WHITE); | |||
| DrawTexturePro(atlas01, ending_score_frameback, (Rectangle){GetScreenWidth()*0.536, GetScreenHeight()*0.383, ending_score_frameback.width, ending_score_frameback.height}, (Vector2){ 0, 0}, 0, WHITE); | |||
| DrawTexturePro(atlas01, ending_score_frame, (Rectangle){GetScreenWidth()*0.535, GetScreenHeight()*0.383, ending_score_frame.width, ending_score_frame.height}, (Vector2){ 0, 0}, 0, WHITE); | |||
| DrawTexturePro(atlas01, ending_score_enemyicon, (Rectangle){GetScreenWidth()*0.538, GetScreenHeight()*0.414, ending_score_enemyicon.width, ending_score_enemyicon.height}, (Vector2){ 0, 0}, 0, WHITE); | |||
| // UI Buttons | |||
| DrawTexturePro(atlas01, ending_button_replay, (Rectangle){GetScreenWidth()*0.871, GetScreenHeight()*0.096, ending_button_replay.width, ending_button_replay.height}, (Vector2){ 0, 0}, 0, buttonPlayColor); | |||
| DrawTexturePro(atlas01, ending_button_shop, (Rectangle){GetScreenWidth()*0.871, GetScreenHeight()*0.303, ending_button_shop.width, ending_button_shop.height}, (Vector2){ 0, 0}, 0, buttonShopColor); | |||
| DrawTexturePro(atlas01, ending_button_trophy, (Rectangle){GetScreenWidth()*0.871, GetScreenHeight()*0.513, ending_button_trophy.width, ending_button_trophy.height}, (Vector2){ 0, 0}, 0, buttonTrophyColor); | |||
| DrawTexturePro(atlas01, ending_button_share, (Rectangle){GetScreenWidth()*0.871, GetScreenHeight()*0.719, ending_button_share.width, ending_button_share.height}, (Vector2){ 0, 0}, 0, buttonShareColor); | |||
| DrawTextEx(font, FormatText("%03i", seasonsCounter), (Vector2){ GetScreenWidth()*0.73f, GetScreenHeight()*0.14f }, font.size, 1, WHITE); | |||
| DrawTextEx(font, FormatText("%03i", currentLeavesEnding), (Vector2){ GetScreenWidth()*0.73f, GetScreenHeight()*0.29f }, font.size, 1, WHITE); | |||
| DrawTextEx(font, FormatText("%04i", currentScore), (Vector2){ GetScreenWidth()*0.715f, GetScreenHeight()*0.426f }, font.size, 1, WHITE); | |||
| DrawTextEx(font, FormatText("%s %i - %s %i", initMonthText, initYears, finalMonthText, finalYears), (Vector2){ GetScreenWidth()*0.1f, GetScreenHeight()*0.7f }, font.size/2.0f, 1, WHITE); | |||
| for (int i = 0; i < MAX_KILLS; i++) | |||
| { | |||
| if (active[i]) | |||
| { | |||
| switch (killHistory[i]) | |||
| { | |||
| case 1: DrawTextureRec(atlas01, ending_plate_headsnake, (Vector2){GetScreenWidth()*0.448 + ending_plate_headsnake.width*(i%10), GetScreenHeight()*0.682 + (GetScreenHeight()*0.055)*(i/10)}, WHITE); break; | |||
| case 2: DrawTextureRec(atlas01, ending_plate_headdingo, (Vector2){GetScreenWidth()*0.448 + ending_plate_headdingo.width*(i%10), GetScreenHeight()*0.682 + (GetScreenHeight()*0.055)*(i/10)}, WHITE); break; | |||
| case 3: DrawTextureRec(atlas01, ending_plate_headowl, (Vector2){GetScreenWidth()*0.448 + ending_plate_headowl.width*(i%10), GetScreenHeight()*0.682 + (GetScreenHeight()*0.055)*(i/10)}, WHITE); break; | |||
| case 4: DrawTextureRec(atlas01, ending_plate_headbee, (Vector2){GetScreenWidth()*0.448 + ending_plate_headbee.width*(i%10), GetScreenHeight()*0.682 + (GetScreenHeight()*0.055)*(i/10)}, WHITE); break; | |||
| case 5: DrawTextureRec(atlas01, ending_plate_headeagle, (Vector2){GetScreenWidth()*0.448 + ending_plate_headeagle.width*(i%10), GetScreenHeight()*0.682 + (GetScreenHeight()*0.055)*(i/10)}, WHITE); break; | |||
| default: break; | |||
| } | |||
| } | |||
| } | |||
| /* | |||
| DrawText(FormatText("KOALA IS DEAD :("), GetScreenWidth()/2 - MeasureText("YOU'RE DEAD ", 60)/2, GetScreenHeight()/3, 60, RED); | |||
| DrawText(FormatText("Score: %02i - HiScore: %02i", score, hiscore),GetScreenWidth()/2 - MeasureText("Score: 00 - HiScore: 00", 60)/2, GetScreenHeight()/3 +100, 60, RED); | |||
| DrawText(FormatText("You lived: %02i years", years),GetScreenWidth()/2 - MeasureText("You lived: 00", 60)/2 + 60, GetScreenHeight()/3 +200, 30, RED); | |||
| DrawText(FormatText("%02s killed you", killer),GetScreenWidth()/2 - MeasureText("killer killed you", 60)/2 + 90, GetScreenHeight()/3 +270, 30, RED); | |||
| //DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(BLACK, 0.5)); | |||
| */ | |||
| //DrawTextEx(font, FormatText("%02s", killer), (Vector2){ GetScreenWidth()*0.08, GetScreenHeight()*0.78 }, font.size/2, 1, WHITE); | |||
| if (killer == 0) DrawTextEx(font, textFire01, (Vector2){ GetScreenWidth()*0.13f, GetScreenHeight()*0.78f }, font.size/2.0f, 1, WHITE); | |||
| else if (killer == 2) DrawTextEx(font, textDingo01, (Vector2){ GetScreenWidth()*0.13f, GetScreenHeight()*0.78f }, font.size/2.0f, 1, WHITE); | |||
| else if (killer == 1) | |||
| { | |||
| DrawTextEx(font, textSnake01, (Vector2){ GetScreenWidth()*0.13f, GetScreenHeight()*0.78f }, font.size/2.0f, 1, WHITE); | |||
| DrawTextEx(font, textSnake02, (Vector2){ GetScreenWidth()*0.13f, GetScreenHeight()*0.83f }, font.size/2.0f, 1, WHITE); | |||
| } | |||
| else if (killer == 3) | |||
| { | |||
| DrawTextEx(font, textOwl01, (Vector2){ GetScreenWidth()*0.13f, GetScreenHeight()*0.78f }, font.size/2.0f, 1, WHITE); | |||
| DrawTextEx(font, textOwl02, (Vector2){ GetScreenWidth()*0.13f, GetScreenHeight()*0.83f }, font.size/2.0f, 1, WHITE); | |||
| } | |||
| else if (killer == 4) DrawTextEx(font, textNaturalDeath01, (Vector2){ GetScreenWidth()*0.13f, GetScreenHeight()*0.78f }, font.size/2.0f, 1, WHITE); | |||
| else if (killer == 5) | |||
| { | |||
| DrawTextEx(font, textBee01, (Vector2){ GetScreenWidth()*0.13f, GetScreenHeight()*0.78f }, font.size/2.0f, 1, WHITE); | |||
| DrawTextEx(font, textBee02, (Vector2){ GetScreenWidth()*0.13f, GetScreenHeight()*0.83f }, font.size/2.0f, 1, WHITE); | |||
| } | |||
| else if (killer == 6) DrawTextEx(font, textEagle, (Vector2){ GetScreenWidth()*0.13f, GetScreenHeight()*0.78f }, font.size/2.0f, 1, WHITE); | |||
| } | |||
| // Ending Screen Unload logic | |||
| void UnloadEndingScreen(void) | |||
| { | |||
| // ... | |||
| } | |||
| // Ending Screen should finish? | |||
| int FinishEndingScreen(void) | |||
| { | |||
| return finishScreen; | |||
| } | |||
| @ -0,0 +1,227 @@ | |||
| /********************************************************************************************** | |||
| * | |||
| * raylib - Standard Game template | |||
| * | |||
| * Logo Screen Functions Definitions (Init, Update, Draw, Unload) | |||
| * | |||
| * Copyright (c) 2014 Ramon Santamaria (Ray San - raysan@raysanweb.com) | |||
| * | |||
| * This software is provided "as-is", without any express or implied warranty. In no event | |||
| * will the authors be held liable for any damages arising from the use of this software. | |||
| * | |||
| * Permission is granted to anyone to use this software for any purpose, including commercial | |||
| * applications, and to alter it and redistribute it freely, subject to the following restrictions: | |||
| * | |||
| * 1. The origin of this software must not be misrepresented; you must not claim that you | |||
| * wrote the original software. If you use this software in a product, an acknowledgment | |||
| * in the product documentation would be appreciated but is not required. | |||
| * | |||
| * 2. Altered source versions must be plainly marked as such, and must not be misrepresented | |||
| * as being the original software. | |||
| * | |||
| * 3. This notice may not be removed or altered from any source distribution. | |||
| * | |||
| **********************************************************************************************/ | |||
| #include "raylib.h" | |||
| #include "screens.h" | |||
| #include <string.h> | |||
| //---------------------------------------------------------------------------------- | |||
| // Global Variables Definition (local to this module) | |||
| //---------------------------------------------------------------------------------- | |||
| // Logo screen global variables | |||
| static int framesCounter; | |||
| static int finishScreen; | |||
| const char msgLogoA[64] = "A simple and easy-to-use library"; | |||
| const char msgLogoB[64] = "to learn videogames programming"; | |||
| int logoPositionX; | |||
| int logoPositionY; | |||
| int raylibLettersCount = 0; | |||
| int topSideRecWidth = 16; | |||
| int leftSideRecHeight = 16; | |||
| int bottomSideRecWidth = 16; | |||
| int rightSideRecHeight = 16; | |||
| char raylib[8] = " \0"; // raylib text array, max 8 letters | |||
| int logoScreenState = 0; // Tracking animation states (State Machine) | |||
| bool msgLogoADone = false; | |||
| bool msgLogoBDone = false; | |||
| int lettersCounter = 0; | |||
| char msgBuffer[128] = { ' ' }; | |||
| //---------------------------------------------------------------------------------- | |||
| // Logo Screen Functions Definition | |||
| //---------------------------------------------------------------------------------- | |||
| // Logo Screen Initialization logic | |||
| void InitLogoScreen(void) | |||
| { | |||
| // Initialize LOGO screen variables here! | |||
| framesCounter = 0; | |||
| finishScreen = 0; | |||
| logoPositionX = GetScreenWidth()/2 - 128; | |||
| logoPositionY = GetScreenHeight()/2 - 128; | |||
| } | |||
| // Logo Screen Update logic | |||
| void UpdateLogoScreen(void) | |||
| { | |||
| // Update LOGO screen | |||
| framesCounter++; // Count frames | |||
| // Update LOGO screen variables | |||
| if (logoScreenState == 0) // State 0: Small box blinking | |||
| { | |||
| framesCounter++; | |||
| if (framesCounter == 120) | |||
| { | |||
| logoScreenState = 1; | |||
| framesCounter = 0; // Reset counter... will be used later... | |||
| } | |||
| } | |||
| else if (logoScreenState == 1) // State 1: Top and left bars growing | |||
| { | |||
| topSideRecWidth += 4; | |||
| leftSideRecHeight += 4; | |||
| if (topSideRecWidth == 256) logoScreenState = 2; | |||
| } | |||
| else if (logoScreenState == 2) // State 2: Bottom and right bars growing | |||
| { | |||
| bottomSideRecWidth += 4; | |||
| rightSideRecHeight += 4; | |||
| if (bottomSideRecWidth == 256) | |||
| { | |||
| lettersCounter = 0; | |||
| for (int i = 0; i < (int)strlen(msgBuffer); i++) msgBuffer[i] = ' '; | |||
| logoScreenState = 3; | |||
| } | |||
| } | |||
| else if (logoScreenState == 3) // State 3: Letters appearing (one by one) | |||
| { | |||
| framesCounter++; | |||
| // Every 12 frames, one more letter! | |||
| if ((framesCounter%12) == 0) raylibLettersCount++; | |||
| switch (raylibLettersCount) | |||
| { | |||
| case 1: raylib[0] = 'r'; break; | |||
| case 2: raylib[1] = 'a'; break; | |||
| case 3: raylib[2] = 'y'; break; | |||
| case 4: raylib[3] = 'l'; break; | |||
| case 5: raylib[4] = 'i'; break; | |||
| case 6: raylib[5] = 'b'; break; | |||
| default: break; | |||
| } | |||
| if (raylibLettersCount >= 10) | |||
| { | |||
| // Write raylib description messages | |||
| if ((framesCounter%2) == 0) lettersCounter++; | |||
| if (!msgLogoADone) | |||
| { | |||
| if (lettersCounter <= (int)strlen(msgLogoA)) strncpy(msgBuffer, msgLogoA, lettersCounter); | |||
| else | |||
| { | |||
| for (int i = 0; i < (int)strlen(msgBuffer); i++) msgBuffer[i] = ' '; | |||
| lettersCounter = 0; | |||
| msgLogoADone = true; | |||
| } | |||
| } | |||
| else if (!msgLogoBDone) | |||
| { | |||
| if (lettersCounter <= (int)strlen(msgLogoB)) strncpy(msgBuffer, msgLogoB, lettersCounter); | |||
| else | |||
| { | |||
| msgLogoBDone = true; | |||
| framesCounter = 0; | |||
| //PlaySound(levelWin); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| // Wait for 2 seconds (60 frames) before jumping to TITLE screen | |||
| if (msgLogoBDone) | |||
| { | |||
| framesCounter++; | |||
| if (framesCounter > 150) finishScreen = true; | |||
| } | |||
| } | |||
| // Logo Screen Draw logic | |||
| void DrawLogoScreen(void) | |||
| { | |||
| // Draw LOGO screen | |||
| if (logoScreenState == 0) | |||
| { | |||
| if ((framesCounter/15)%2) DrawRectangle(logoPositionX, logoPositionY - 60, 16, 16, BLACK); | |||
| } | |||
| else if (logoScreenState == 1) | |||
| { | |||
| DrawRectangle(logoPositionX, logoPositionY - 60, topSideRecWidth, 16, BLACK); | |||
| DrawRectangle(logoPositionX, logoPositionY - 60, 16, leftSideRecHeight, BLACK); | |||
| } | |||
| else if (logoScreenState == 2) | |||
| { | |||
| DrawRectangle(logoPositionX, logoPositionY - 60, topSideRecWidth, 16, BLACK); | |||
| DrawRectangle(logoPositionX, logoPositionY - 60, 16, leftSideRecHeight, BLACK); | |||
| DrawRectangle(logoPositionX + 240, logoPositionY - 60, 16, rightSideRecHeight, BLACK); | |||
| DrawRectangle(logoPositionX, logoPositionY + 240 - 60, bottomSideRecWidth, 16, BLACK); | |||
| } | |||
| else if (logoScreenState == 3) | |||
| { | |||
| DrawRectangle(logoPositionX, logoPositionY - 60, topSideRecWidth, 16, BLACK); | |||
| DrawRectangle(logoPositionX, logoPositionY + 16 - 60, 16, leftSideRecHeight - 32, BLACK); | |||
| DrawRectangle(logoPositionX + 240, logoPositionY + 16 - 60, 16, rightSideRecHeight - 32, BLACK); | |||
| DrawRectangle(logoPositionX, logoPositionY + 240 - 60, bottomSideRecWidth, 16, BLACK); | |||
| DrawRectangle(GetScreenWidth()/2 - 112, GetScreenHeight()/2 - 112 - 60, 224, 224, RAYWHITE); | |||
| DrawText(raylib, GetScreenWidth()/2 - 44, GetScreenHeight()/2 + 48 - 60, 50, BLACK); | |||
| if (!msgLogoADone) DrawText(msgBuffer, GetScreenWidth()/2 - MeasureText(msgLogoA, 30)/2, logoPositionY + 230, 30, GRAY); | |||
| else | |||
| { | |||
| DrawText(msgLogoA, GetScreenWidth()/2 - MeasureText(msgLogoA, 30)/2, logoPositionY + 230, 30, GRAY); | |||
| if (!msgLogoBDone) DrawText(msgBuffer, GetScreenWidth()/2 - MeasureText(msgLogoB, 30)/2, logoPositionY + 280, 30, GRAY); | |||
| else | |||
| { | |||
| DrawText(msgLogoB, GetScreenWidth()/2 - MeasureText(msgLogoA, 30)/2, logoPositionY + 280, 30, GRAY); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| // Logo Screen Unload logic | |||
| void UnloadLogoScreen(void) | |||
| { | |||
| // TODO: Unload LOGO screen variables here! | |||
| } | |||
| // Logo Screen should finish? | |||
| int FinishLogoScreen(void) | |||
| { | |||
| return finishScreen; | |||
| } | |||
| @ -0,0 +1,125 @@ | |||
| /********************************************************************************************** | |||
| * | |||
| * raylib - Koala Seasons game | |||
| * | |||
| * Screens Functions Declarations (Init, Update, Draw, Unload) | |||
| * | |||
| * Copyright (c) 2014-2016 Ramon Santamaria (@raysan5) | |||
| * | |||
| * This software is provided "as-is", without any express or implied warranty. In no event | |||
| * will the authors be held liable for any damages arising from the use of this software. | |||
| * | |||
| * Permission is granted to anyone to use this software for any purpose, including commercial | |||
| * applications, and to alter it and redistribute it freely, subject to the following restrictions: | |||
| * | |||
| * 1. The origin of this software must not be misrepresented; you must not claim that you | |||
| * wrote the original software. If you use this software in a product, an acknowledgment | |||
| * in the product documentation would be appreciated but is not required. | |||
| * | |||
| * 2. Altered source versions must be plainly marked as such, and must not be misrepresented | |||
| * as being the original software. | |||
| * | |||
| * 3. This notice may not be removed or altered from any source distribution. | |||
| * | |||
| **********************************************************************************************/ | |||
| #ifndef SCREENS_H | |||
| #define SCREENS_H | |||
| #define GAME_FPS 60.0 | |||
| #define TIME_FACTOR 60.0/GAME_FPS | |||
| #define MAX_KILLS 128 | |||
| //---------------------------------------------------------------------------------- | |||
| // Types and Structures Definition | |||
| //---------------------------------------------------------------------------------- | |||
| typedef enum GameScreen { LOGO, TITLE, OPTIONS, GAMEPLAY, ENDING } GameScreen; | |||
| //---------------------------------------------------------------------------------- | |||
| // Global Variables Definition | |||
| //---------------------------------------------------------------------------------- | |||
| GameScreen currentScreen; | |||
| // NOTE: This is all the data used in the game | |||
| SpriteFont font; | |||
| Shader colorBlend; | |||
| Texture2D atlas01; | |||
| Texture2D atlas02; | |||
| Sound fxJump; | |||
| Sound fxDash; | |||
| Sound fxEatLeaves; | |||
| Sound fxDieSnake; | |||
| Sound fxDieDingo; | |||
| Sound fxDieOwl; | |||
| Sound fxHitResin; | |||
| Sound fxWind; | |||
| // Global Variables (required by ending screen and gameplay screen) | |||
| int score; | |||
| int hiscore; | |||
| int killHistory[MAX_KILLS]; | |||
| int killer; | |||
| int seasons; | |||
| int years; | |||
| int currentLeaves; | |||
| int currentSeason; | |||
| int initSeason; | |||
| int initYears; | |||
| int rainChance; | |||
| #ifdef __cplusplus | |||
| extern "C" { // Prevents name mangling of functions | |||
| #endif | |||
| //---------------------------------------------------------------------------------- | |||
| // Logo Screen Functions Declaration | |||
| //---------------------------------------------------------------------------------- | |||
| void InitLogoScreen(void); | |||
| void UpdateLogoScreen(void); | |||
| void DrawLogoScreen(void); | |||
| void UnloadLogoScreen(void); | |||
| int FinishLogoScreen(void); | |||
| //---------------------------------------------------------------------------------- | |||
| // Title Screen Functions Declaration | |||
| //---------------------------------------------------------------------------------- | |||
| void InitTitleScreen(void); | |||
| void UpdateTitleScreen(void); | |||
| void DrawTitleScreen(void); | |||
| void UnloadTitleScreen(void); | |||
| int FinishTitleScreen(void); | |||
| //---------------------------------------------------------------------------------- | |||
| // Options Screen Functions Declaration | |||
| //---------------------------------------------------------------------------------- | |||
| void InitOptionsScreen(void); | |||
| void UpdateOptionsScreen(void); | |||
| void DrawOptionsScreen(void); | |||
| void UnloadOptionsScreen(void); | |||
| int FinishOptionsScreen(void); | |||
| //---------------------------------------------------------------------------------- | |||
| // Gameplay Screen Functions Declaration | |||
| //---------------------------------------------------------------------------------- | |||
| void InitGameplayScreen(void); | |||
| void UpdateGameplayScreen(void); | |||
| void DrawGameplayScreen(void); | |||
| void UnloadGameplayScreen(void); | |||
| int FinishGameplayScreen(void); | |||
| //---------------------------------------------------------------------------------- | |||
| // Ending Screen Functions Declaration | |||
| //---------------------------------------------------------------------------------- | |||
| void InitEndingScreen(void); | |||
| void UpdateEndingScreen(void); | |||
| void DrawEndingScreen(void); | |||
| void UnloadEndingScreen(void); | |||
| int FinishEndingScreen(void); | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif // SCREENS_H | |||