summaryrefslogtreecommitdiffhomepage
path: root/games/wave_collector
diff options
context:
space:
mode:
authorRay <[email protected]>2017-01-22 15:31:56 +0100
committerRay <[email protected]>2017-01-22 15:31:56 +0100
commitf164ec80d6f1ca7afb7aec6a1e525cd67d401c14 (patch)
tree3ada899b11950e42eca457d2f8673016365ae9a8 /games/wave_collector
parent7586031410c7c3746025ef6c8bc6bee4b73baf1f (diff)
downloadraylib-f164ec80d6f1ca7afb7aec6a1e525cd67d401c14.tar.gz
raylib-f164ec80d6f1ca7afb7aec6a1e525cd67d401c14.zip
Upload wave collector - GGJ17 game
Diffstat (limited to 'games/wave_collector')
-rw-r--r--games/wave_collector/Makefile233
-rw-r--r--games/wave_collector/resources/audio/pause.wavbin0 -> 25906 bytes
-rw-r--r--games/wave_collector/resources/audio/sample_off.wavbin0 -> 9291 bytes
-rw-r--r--games/wave_collector/resources/audio/sample_on.wavbin0 -> 2335 bytes
-rw-r--r--games/wave_collector/resources/audio/start.wavbin0 -> 14079 bytes
-rw-r--r--games/wave_collector/resources/audio/wave.oggbin0 -> 1364969 bytes
-rw-r--r--games/wave_collector/resources/font.fnt100
-rw-r--r--games/wave_collector/resources/font.pngbin0 -> 140998 bytes
-rw-r--r--games/wave_collector/resources/textures/background.pngbin0 -> 840327 bytes
-rw-r--r--games/wave_collector/resources/textures/background_gameplay.pngbin0 -> 561566 bytes
-rw-r--r--games/wave_collector/resources/textures/background_title.pngbin0 -> 606904 bytes
-rw-r--r--games/wave_collector/resources/textures/icon_synchro.pngbin0 -> 10015 bytes
-rw-r--r--games/wave_collector/resources/textures/icon_warp.pngbin0 -> 11832 bytes
-rw-r--r--games/wave_collector/resources/textures/line.pngbin0 -> 977 bytes
-rw-r--r--games/wave_collector/resources/textures/logo_raylib.pngbin0 -> 1868 bytes
-rw-r--r--games/wave_collector/resources/textures/lose.pngbin0 -> 79189 bytes
-rw-r--r--games/wave_collector/resources/textures/player.pngbin0 -> 11785 bytes
-rw-r--r--games/wave_collector/resources/textures/sample_big.pngbin0 -> 3006 bytes
-rw-r--r--games/wave_collector/resources/textures/sample_mid.pngbin0 -> 1720 bytes
-rw-r--r--games/wave_collector/resources/textures/sample_small.pngbin0 -> 1857 bytes
-rw-r--r--games/wave_collector/resources/textures/title.pngbin0 -> 125004 bytes
-rw-r--r--games/wave_collector/resources/textures/win.pngbin0 -> 33189 bytes
-rw-r--r--games/wave_collector/screens/screen_ending.c111
-rw-r--r--games/wave_collector/screens/screen_gameplay.c490
-rw-r--r--games/wave_collector/screens/screen_logo.c181
-rw-r--r--games/wave_collector/screens/screen_title.c112
-rw-r--r--games/wave_collector/screens/screens.h87
-rw-r--r--games/wave_collector/wave_collector.c310
28 files changed, 1624 insertions, 0 deletions
diff --git a/games/wave_collector/Makefile b/games/wave_collector/Makefile
new file mode 100644
index 00000000..bac51ef1
--- /dev/null
+++ b/games/wave_collector/Makefile
@@ -0,0 +1,233 @@
+#**************************************************************************************************
+#
+# raylib - Advance Game
+#
+# makefile to compile advance game for desktop platforms, Raspberry Pi and HTML5 (emscripten)
+#
+# Copyright (c) 2014 Ramon Santamaria (Ray San - [email protected])
+#
+# 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.
+#
+#**************************************************************************************************
+
+.PHONY: all clean
+
+# 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 -s ALLOW_MEMORY_GROWTH=1 --preload-file resources --shell-file C:/raylib/raylib/templates/web_shell/shell.html
+ #-s ASSERTIONS=1 # to check for memory allocation errors (-O1 disables it)
+ #-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
+ifeq ($(PLATFORM),PLATFORM_RPI)
+ INCLUDES = -I. -I../../src -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. -I../src -I/usr/local/include/raylib/
+ else
+ INCLUDES = -I. -I../../src -IC:/raylib/raylib/src
+ # external libraries headers
+ # GLFW3
+ INCLUDES += -I../../external/glfw3/include
+ # OpenAL Soft
+ INCLUDES += -I../../external/openal_soft/include
+ endif
+endif
+
+# define library paths containing required libs
+ifeq ($(PLATFORM),PLATFORM_RPI)
+ LFLAGS = -L. -L../../src -L/opt/vc/lib
+endif
+ifeq ($(PLATFORM),PLATFORM_DESKTOP)
+ # add standard directories for GNU/Linux
+ ifeq ($(PLATFORM_OS),LINUX)
+ LFLAGS = -L. -L../../src
+ else
+ LFLAGS = -L. -L../../src
+ ifeq ($(PLATFORM_OS),WINDOWS)
+ LFLAGS += -LC:/GitHub/raylib/src
+ endif
+ # external libraries to link with
+ # GLFW3
+ LFLAGS += -L../../external/glfw3/lib/$(LIBPATH)
+ ifneq ($(PLATFORM_OS),OSX)
+ # OpenAL Soft
+ LFLAGS += -L../../external/openal_soft/lib/$(LIBPATH)
+ endif
+ endif
+endif
+
+ifeq ($(PLATFORM),PLATFORM_WEB)
+ INCLUDES = -I. -I..
+ LFLAGS = -L. -L..
+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 -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 -lwinmm -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)
+ # NOTE: Set the correct path to libraylib.bc
+ LIBS = 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/src/resources -Wl,-allow-multiple-definition
+ # -Wl,--subsystem,windows
+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 default target entry called 'all',
+# in this case, the 'default' target entry is advance_game
+default: wave_collector
+
+# compile template - advance_game
+wave_collector: wave_collector.c $(SCREENS)
+ $(CC) -o $@$(EXT) $< $(SCREENS) $(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 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 screens/*.o
+ else
+ ifeq ($(PLATFORM_OS),LINUX)
+ find . -type f -executable -delete
+ rm -f screens/*.o
+ else
+ del screens\*.o *.exe
+ endif
+ endif
+endif
+ifeq ($(PLATFORM),PLATFORM_RPI)
+ find . -type f -executable -delete
+ rm -f screens/*.o
+endif
+ifeq ($(PLATFORM),PLATFORM_WEB)
+ del screens/*.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)
diff --git a/games/wave_collector/resources/audio/pause.wav b/games/wave_collector/resources/audio/pause.wav
new file mode 100644
index 00000000..f35301ee
--- /dev/null
+++ b/games/wave_collector/resources/audio/pause.wav
Binary files differ
diff --git a/games/wave_collector/resources/audio/sample_off.wav b/games/wave_collector/resources/audio/sample_off.wav
new file mode 100644
index 00000000..d2203e72
--- /dev/null
+++ b/games/wave_collector/resources/audio/sample_off.wav
Binary files differ
diff --git a/games/wave_collector/resources/audio/sample_on.wav b/games/wave_collector/resources/audio/sample_on.wav
new file mode 100644
index 00000000..38b7ca58
--- /dev/null
+++ b/games/wave_collector/resources/audio/sample_on.wav
Binary files differ
diff --git a/games/wave_collector/resources/audio/start.wav b/games/wave_collector/resources/audio/start.wav
new file mode 100644
index 00000000..66ce7ac1
--- /dev/null
+++ b/games/wave_collector/resources/audio/start.wav
Binary files differ
diff --git a/games/wave_collector/resources/audio/wave.ogg b/games/wave_collector/resources/audio/wave.ogg
new file mode 100644
index 00000000..a5b0dea4
--- /dev/null
+++ b/games/wave_collector/resources/audio/wave.ogg
Binary files differ
diff --git a/games/wave_collector/resources/font.fnt b/games/wave_collector/resources/font.fnt
new file mode 100644
index 00000000..607e5a4d
--- /dev/null
+++ b/games/wave_collector/resources/font.fnt
@@ -0,0 +1,100 @@
+info face=font size=57 bold=0 italic=0 charset= unicode= stretchH=100 smooth=1 aa=1 padding=2,2,2,2 spacing=0,0 outline=0
+common lineHeight=68 base=55 scaleW=512 scaleH=1024 pages=1 packed=0
+page id=0 file="font.png"
+chars count=95
+char id=32 x=2 y=57 width=0 height=0 xoffset=0 yoffset=55 xadvance=29 page=0 chnl=15
+char id=33 x=4 y=5 width=16 height=61 xoffset=2 yoffset=4 xadvance=16 page=0 chnl=15
+char id=34 x=22 y=10 width=25 height=27 xoffset=0 yoffset=8 xadvance=23 page=0 chnl=15
+char id=35 x=49 y=26 width=41 height=27 xoffset=-3 yoffset=24 xadvance=34 page=0 chnl=15
+char id=36 x=92 y=26 width=41 height=27 xoffset=-3 yoffset=24 xadvance=34 page=0 chnl=15
+char id=37 x=135 y=13 width=34 height=49 xoffset=-1 yoffset=12 xadvance=30 page=0 chnl=15
+char id=38 x=171 y=16 width=51 height=46 xoffset=-1 yoffset=14 xadvance=47 page=0 chnl=15
+char id=39 x=224 y=10 width=16 height=27 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
+char id=40 x=242 y=8 width=18 height=60 xoffset=0 yoffset=6 xadvance=16 page=0 chnl=15
+char id=41 x=262 y=8 width=18 height=60 xoffset=-1 yoffset=6 xadvance=15 page=0 chnl=15
+char id=42 x=282 y=11 width=29 height=32 xoffset=-1 yoffset=10 xadvance=25 page=0 chnl=15
+char id=43 x=313 y=25 width=29 height=29 xoffset=-2 yoffset=24 xadvance=24 page=0 chnl=15
+char id=44 x=344 y=45 width=16 height=29 xoffset=0 yoffset=44 xadvance=13 page=0 chnl=15
+char id=45 x=362 y=33 width=29 height=15 xoffset=1 yoffset=31 xadvance=28 page=0 chnl=15
+char id=46 x=393 y=45 width=16 height=17 xoffset=-1 yoffset=44 xadvance=13 page=0 chnl=15
+char id=47 x=411 y=6 width=37 height=61 xoffset=-3 yoffset=4 xadvance=30 page=0 chnl=15
+char id=48 x=450 y=14 width=43 height=49 xoffset=-1 yoffset=12 xadvance=39 page=0 chnl=15
+char id=49 x=2 y=91 width=22 height=49 xoffset=-1 yoffset=12 xadvance=19 page=0 chnl=15
+char id=50 x=26 y=91 width=42 height=49 xoffset=-1 yoffset=12 xadvance=39 page=0 chnl=15
+char id=51 x=70 y=91 width=41 height=48 xoffset=-2 yoffset=12 xadvance=35 page=0 chnl=15
+char id=52 x=113 y=91 width=40 height=48 xoffset=-2 yoffset=12 xadvance=35 page=0 chnl=15
+char id=53 x=155 y=91 width=35 height=49 xoffset=-1 yoffset=12 xadvance=31 page=0 chnl=15
+char id=54 x=192 y=91 width=48 height=48 xoffset=-2 yoffset=13 xadvance=43 page=0 chnl=15
+char id=55 x=242 y=91 width=38 height=49 xoffset=-2 yoffset=12 xadvance=33 page=0 chnl=15
+char id=56 x=282 y=91 width=49 height=49 xoffset=-2 yoffset=12 xadvance=43 page=0 chnl=15
+char id=57 x=333 y=91 width=46 height=49 xoffset=-2 yoffset=12 xadvance=41 page=0 chnl=15
+char id=58 x=381 y=102 width=16 height=37 xoffset=0 yoffset=24 xadvance=14 page=0 chnl=15
+char id=59 x=399 y=102 width=16 height=48 xoffset=0 yoffset=24 xadvance=15 page=0 chnl=15
+char id=60 x=417 y=98 width=41 height=42 xoffset=-2 yoffset=19 xadvance=37 page=0 chnl=15
+char id=61 x=460 y=104 width=29 height=30 xoffset=0 yoffset=25 xadvance=27 page=0 chnl=15
+char id=62 x=2 y=173 width=42 height=42 xoffset=-1 yoffset=19 xadvance=36 page=0 chnl=15
+char id=63 x=46 y=155 width=39 height=61 xoffset=0 yoffset=0 xadvance=35 page=0 chnl=15
+char id=64 x=87 y=167 width=58 height=53 xoffset=-1 yoffset=12 xadvance=54 page=0 chnl=15
+char id=65 x=147 y=169 width=47 height=47 xoffset=-2 yoffset=14 xadvance=41 page=0 chnl=15
+char id=66 x=196 y=169 width=47 height=46 xoffset=0 yoffset=14 xadvance=42 page=0 chnl=15
+char id=67 x=245 y=169 width=41 height=47 xoffset=-1 yoffset=14 xadvance=37 page=0 chnl=15
+char id=68 x=288 y=169 width=43 height=47 xoffset=0 yoffset=14 xadvance=39 page=0 chnl=15
+char id=69 x=333 y=169 width=43 height=46 xoffset=-2 yoffset=14 xadvance=39 page=0 chnl=15
+char id=70 x=378 y=169 width=40 height=46 xoffset=-2 yoffset=14 xadvance=35 page=0 chnl=15
+char id=71 x=420 y=169 width=41 height=46 xoffset=-2 yoffset=14 xadvance=37 page=0 chnl=15
+char id=72 x=463 y=167 width=43 height=48 xoffset=1 yoffset=12 xadvance=43 page=0 chnl=15
+char id=73 x=2 y=237 width=16 height=48 xoffset=1 yoffset=12 xadvance=15 page=0 chnl=15
+char id=74 x=20 y=239 width=25 height=46 xoffset=-2 yoffset=14 xadvance=21 page=0 chnl=15
+char id=75 x=47 y=238 width=45 height=49 xoffset=1 yoffset=14 xadvance=41 page=0 chnl=15
+char id=76 x=94 y=237 width=31 height=48 xoffset=1 yoffset=13 xadvance=28 page=0 chnl=15
+char id=77 x=127 y=239 width=51 height=46 xoffset=0 yoffset=14 xadvance=49 page=0 chnl=15
+char id=78 x=180 y=239 width=40 height=46 xoffset=0 yoffset=14 xadvance=39 page=0 chnl=15
+char id=79 x=222 y=239 width=51 height=46 xoffset=-2 yoffset=14 xadvance=45 page=0 chnl=15
+char id=80 x=275 y=239 width=44 height=46 xoffset=0 yoffset=14 xadvance=40 page=0 chnl=15
+char id=81 x=321 y=239 width=51 height=46 xoffset=-2 yoffset=14 xadvance=45 page=0 chnl=15
+char id=82 x=374 y=239 width=45 height=48 xoffset=0 yoffset=15 xadvance=41 page=0 chnl=15
+char id=83 x=421 y=238 width=34 height=48 xoffset=-2 yoffset=13 xadvance=28 page=0 chnl=15
+char id=84 x=457 y=239 width=41 height=47 xoffset=-2 yoffset=14 xadvance=36 page=0 chnl=15
+char id=85 x=2 y=306 width=46 height=46 xoffset=0 yoffset=15 xadvance=43 page=0 chnl=15
+char id=86 x=50 y=305 width=44 height=48 xoffset=-2 yoffset=13 xadvance=38 page=0 chnl=15
+char id=87 x=96 y=305 width=55 height=47 xoffset=-2 yoffset=13 xadvance=49 page=0 chnl=15
+char id=88 x=153 y=306 width=43 height=46 xoffset=-2 yoffset=14 xadvance=38 page=0 chnl=15
+char id=89 x=198 y=305 width=38 height=47 xoffset=-2 yoffset=13 xadvance=31 page=0 chnl=15
+char id=90 x=238 y=306 width=40 height=47 xoffset=-2 yoffset=14 xadvance=35 page=0 chnl=15
+char id=91 x=280 y=295 width=26 height=66 xoffset=1 yoffset=4 xadvance=24 page=0 chnl=15
+char id=92 x=308 y=293 width=37 height=61 xoffset=-4 yoffset=2 xadvance=29 page=0 chnl=15
+char id=93 x=347 y=295 width=26 height=66 xoffset=-2 yoffset=4 xadvance=22 page=0 chnl=15
+char id=94 x=375 y=294 width=28 height=17 xoffset=-1 yoffset=3 xadvance=24 page=0 chnl=15
+char id=95 x=405 y=346 width=49 height=15 xoffset=-1 yoffset=55 xadvance=45 page=0 chnl=15
+char id=96 x=456 y=295 width=20 height=17 xoffset=1 yoffset=3 xadvance=18 page=0 chnl=15
+char id=97 x=2 y=387 width=38 height=39 xoffset=-2 yoffset=22 xadvance=35 page=0 chnl=15
+char id=98 x=42 y=375 width=41 height=52 xoffset=1 yoffset=9 xadvance=38 page=0 chnl=15
+char id=99 x=85 y=387 width=38 height=39 xoffset=-2 yoffset=22 xadvance=34 page=0 chnl=15
+char id=100 x=125 y=375 width=41 height=52 xoffset=-2 yoffset=9 xadvance=38 page=0 chnl=15
+char id=101 x=168 y=387 width=38 height=39 xoffset=1 yoffset=22 xadvance=34 page=0 chnl=15
+char id=102 x=208 y=375 width=27 height=52 xoffset=1 yoffset=9 xadvance=23 page=0 chnl=15
+char id=103 x=237 y=387 width=41 height=52 xoffset=-2 yoffset=21 xadvance=38 page=0 chnl=15
+char id=104 x=280 y=375 width=37 height=51 xoffset=1 yoffset=9 xadvance=34 page=0 chnl=15
+char id=105 x=319 y=380 width=15 height=47 xoffset=2 yoffset=14 xadvance=16 page=0 chnl=15
+char id=106 x=336 y=378 width=25 height=60 xoffset=-6 yoffset=12 xadvance=18 page=0 chnl=15
+char id=107 x=363 y=375 width=40 height=51 xoffset=2 yoffset=9 xadvance=38 page=0 chnl=15
+char id=108 x=405 y=379 width=15 height=48 xoffset=1 yoffset=13 xadvance=16 page=0 chnl=15
+char id=109 x=422 y=387 width=47 height=39 xoffset=0 yoffset=22 xadvance=46 page=0 chnl=15
+char id=110 x=2 y=465 width=37 height=39 xoffset=0 yoffset=22 xadvance=34 page=0 chnl=15
+char id=111 x=41 y=465 width=41 height=40 xoffset=-1 yoffset=21 xadvance=37 page=0 chnl=15
+char id=112 x=84 y=465 width=41 height=52 xoffset=1 yoffset=22 xadvance=37 page=0 chnl=15
+char id=113 x=127 y=465 width=41 height=51 xoffset=-2 yoffset=22 xadvance=38 page=0 chnl=15
+char id=114 x=170 y=465 width=34 height=39 xoffset=1 yoffset=22 xadvance=30 page=0 chnl=15
+char id=115 x=206 y=462 width=37 height=42 xoffset=-2 yoffset=19 xadvance=31 page=0 chnl=15
+char id=116 x=245 y=453 width=36 height=52 xoffset=0 yoffset=9 xadvance=31 page=0 chnl=15
+char id=117 x=283 y=465 width=37 height=39 xoffset=0 yoffset=22 xadvance=35 page=0 chnl=15
+char id=118 x=322 y=463 width=35 height=41 xoffset=-2 yoffset=19 xadvance=28 page=0 chnl=15
+char id=119 x=359 y=463 width=51 height=41 xoffset=-2 yoffset=19 xadvance=44 page=0 chnl=15
+char id=120 x=412 y=465 width=35 height=40 xoffset=-2 yoffset=21 xadvance=29 page=0 chnl=15
+char id=121 x=449 y=465 width=37 height=52 xoffset=0 yoffset=22 xadvance=35 page=0 chnl=15
+char id=122 x=2 y=543 width=38 height=40 xoffset=-3 yoffset=21 xadvance=31 page=0 chnl=15
+char id=123 x=42 y=527 width=24 height=61 xoffset=-3 yoffset=5 xadvance=18 page=0 chnl=15
+char id=124 x=68 y=522 width=16 height=66 xoffset=1 yoffset=1 xadvance=15 page=0 chnl=15
+char id=125 x=86 y=527 width=24 height=61 xoffset=-1 yoffset=5 xadvance=18 page=0 chnl=15
+char id=126 x=112 y=526 width=32 height=16 xoffset=0 yoffset=4 xadvance=29 page=0 chnl=15
+char id=32 x=0 y=0 width=0 height=0 xoffset=0 yoffset=4 xadvance=29 page=0 chnl=15 \ No newline at end of file
diff --git a/games/wave_collector/resources/font.png b/games/wave_collector/resources/font.png
new file mode 100644
index 00000000..15287ccb
--- /dev/null
+++ b/games/wave_collector/resources/font.png
Binary files differ
diff --git a/games/wave_collector/resources/textures/background.png b/games/wave_collector/resources/textures/background.png
new file mode 100644
index 00000000..f8613f82
--- /dev/null
+++ b/games/wave_collector/resources/textures/background.png
Binary files differ
diff --git a/games/wave_collector/resources/textures/background_gameplay.png b/games/wave_collector/resources/textures/background_gameplay.png
new file mode 100644
index 00000000..e4180288
--- /dev/null
+++ b/games/wave_collector/resources/textures/background_gameplay.png
Binary files differ
diff --git a/games/wave_collector/resources/textures/background_title.png b/games/wave_collector/resources/textures/background_title.png
new file mode 100644
index 00000000..01fc46d3
--- /dev/null
+++ b/games/wave_collector/resources/textures/background_title.png
Binary files differ
diff --git a/games/wave_collector/resources/textures/icon_synchro.png b/games/wave_collector/resources/textures/icon_synchro.png
new file mode 100644
index 00000000..b7172823
--- /dev/null
+++ b/games/wave_collector/resources/textures/icon_synchro.png
Binary files differ
diff --git a/games/wave_collector/resources/textures/icon_warp.png b/games/wave_collector/resources/textures/icon_warp.png
new file mode 100644
index 00000000..2a5eb7bb
--- /dev/null
+++ b/games/wave_collector/resources/textures/icon_warp.png
Binary files differ
diff --git a/games/wave_collector/resources/textures/line.png b/games/wave_collector/resources/textures/line.png
new file mode 100644
index 00000000..6c338710
--- /dev/null
+++ b/games/wave_collector/resources/textures/line.png
Binary files differ
diff --git a/games/wave_collector/resources/textures/logo_raylib.png b/games/wave_collector/resources/textures/logo_raylib.png
new file mode 100644
index 00000000..99ba5437
--- /dev/null
+++ b/games/wave_collector/resources/textures/logo_raylib.png
Binary files differ
diff --git a/games/wave_collector/resources/textures/lose.png b/games/wave_collector/resources/textures/lose.png
new file mode 100644
index 00000000..f01c0284
--- /dev/null
+++ b/games/wave_collector/resources/textures/lose.png
Binary files differ
diff --git a/games/wave_collector/resources/textures/player.png b/games/wave_collector/resources/textures/player.png
new file mode 100644
index 00000000..c8913a8f
--- /dev/null
+++ b/games/wave_collector/resources/textures/player.png
Binary files differ
diff --git a/games/wave_collector/resources/textures/sample_big.png b/games/wave_collector/resources/textures/sample_big.png
new file mode 100644
index 00000000..b4c4be97
--- /dev/null
+++ b/games/wave_collector/resources/textures/sample_big.png
Binary files differ
diff --git a/games/wave_collector/resources/textures/sample_mid.png b/games/wave_collector/resources/textures/sample_mid.png
new file mode 100644
index 00000000..20ec5868
--- /dev/null
+++ b/games/wave_collector/resources/textures/sample_mid.png
Binary files differ
diff --git a/games/wave_collector/resources/textures/sample_small.png b/games/wave_collector/resources/textures/sample_small.png
new file mode 100644
index 00000000..7b624f7f
--- /dev/null
+++ b/games/wave_collector/resources/textures/sample_small.png
Binary files differ
diff --git a/games/wave_collector/resources/textures/title.png b/games/wave_collector/resources/textures/title.png
new file mode 100644
index 00000000..383dfdc3
--- /dev/null
+++ b/games/wave_collector/resources/textures/title.png
Binary files differ
diff --git a/games/wave_collector/resources/textures/win.png b/games/wave_collector/resources/textures/win.png
new file mode 100644
index 00000000..d7afdc25
--- /dev/null
+++ b/games/wave_collector/resources/textures/win.png
Binary files differ
diff --git a/games/wave_collector/screens/screen_ending.c b/games/wave_collector/screens/screen_ending.c
new file mode 100644
index 00000000..d246005c
--- /dev/null
+++ b/games/wave_collector/screens/screen_ending.c
@@ -0,0 +1,111 @@
+/**********************************************************************************************
+*
+* raylib - Advance Game template
+*
+* Ending Screen Functions Definitions (Init, Update, Draw, Unload)
+*
+* Copyright (c) 2014 Ramon Santamaria (Ray San - [email protected])
+*
+* 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"
+
+//----------------------------------------------------------------------------------
+// Global Variables Definition (local to this module)
+//----------------------------------------------------------------------------------
+
+// Ending screen global variables
+static int framesCounter;
+static int finishScreen;
+
+static Texture2D texBackground;
+static Texture2D texWin;
+static Texture2D texLose;
+static Texture2D texLogo;
+
+//----------------------------------------------------------------------------------
+// Ending Screen Functions Definition
+//----------------------------------------------------------------------------------
+
+// Ending Screen Initialization logic
+void InitEndingScreen(void)
+{
+ // TODO: Initialize ENDING screen variables here!
+ framesCounter = 0;
+ finishScreen = 0;
+
+ texBackground = LoadTexture("resources/textures/background.png");
+ texWin = LoadTexture("resources/textures/win.png");
+ texLose = LoadTexture("resources/textures/lose.png");
+ texLogo = LoadTexture("resources/textures/logo_raylib.png");
+}
+
+// Ending Screen Update logic
+void UpdateEndingScreen(void)
+{
+ // TODO: Update ENDING screen variables here!
+ framesCounter++;
+
+ // Press enter to return to TITLE screen
+ if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON))
+ {
+ finishScreen = 1;
+ }
+}
+
+// Ending Screen Draw logic
+void DrawEndingScreen(void)
+{
+ DrawTexture(texBackground, 0, 0, WHITE);
+
+ if (endingStatus == 1) // Win
+ {
+ DrawTexture(texWin, GetScreenWidth()/2 - texWin.width/2, 90, WHITE);
+ DrawTextEx(font, "congrats, you got the wave!", (Vector2){ 200, 335 }, font.size, 0, WHITE);
+ }
+ else if (endingStatus == 2) // Lose
+ {
+ DrawTexture(texLose, GetScreenWidth()/2 - texWin.width/2, 90, WHITE);
+ DrawTextEx(font, "it seems you lose the wave...", (Vector2){ 205, 335 }, font.size, 0, WHITE);
+ }
+
+ DrawRectangle(0, GetScreenHeight() - 70, 560, 40, Fade(RAYWHITE, 0.8f));
+ DrawText("(c) Developed by Ramon Santamaria (@raysan5)", 36, GetScreenHeight() - 60, 20, DARKBLUE);
+
+ DrawText("powered by", GetScreenWidth() - 162, GetScreenHeight() - 190, 20, DARKGRAY);
+ DrawTexture(texLogo, GetScreenWidth() - 128 - 34, GetScreenHeight() - 128 - 36, WHITE);
+
+ if ((framesCounter > 80) && ((framesCounter/40)%2)) DrawTextEx(font, "mouse click to return", (Vector2){ 300, 464 }, font.size, 0, SKYBLUE);
+}
+
+// Ending Screen Unload logic
+void UnloadEndingScreen(void)
+{
+ // TODO: Unload ENDING screen variables here!
+ UnloadTexture(texBackground);
+ UnloadTexture(texWin);
+ UnloadTexture(texLose);
+ UnloadTexture(texLogo);
+}
+
+// Ending Screen should finish?
+int FinishEndingScreen(void)
+{
+ return finishScreen;
+} \ No newline at end of file
diff --git a/games/wave_collector/screens/screen_gameplay.c b/games/wave_collector/screens/screen_gameplay.c
new file mode 100644
index 00000000..a3a9394a
--- /dev/null
+++ b/games/wave_collector/screens/screen_gameplay.c
@@ -0,0 +1,490 @@
+/**********************************************************************************************
+*
+* raylib - Advance Game template
+*
+* Gameplay Screen Functions Definitions (Init, Update, Draw, Unload)
+*
+* Copyright (c) 2014 Ramon Santamaria (Ray San - [email protected])
+*
+* 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 <stdlib.h> // Required for: malloc(), free()
+#include <math.h> // Required for: sqrtf(), asinf()
+
+#define MAX_SAMPLES_SPEED 7 // Max speed for samples movement
+#define MIN_SAMPLES_SPEED 3 // Min speed for samples movement
+#define SAMPLES_SPACING 100 // Separation between samples in pixels
+#define SAMPLES_MULTIPLIER 500 // Defines sample data scaling value (it would be adjusted to MAX_GAME_HEIGHT)
+#define MAX_GAME_HEIGHT 400 // Defines max possible amplitude between samples (game area)
+
+//----------------------------------------------------------------------------------
+// Types and Structures Definition
+//----------------------------------------------------------------------------------
+typedef struct Player {
+ Vector2 position;
+ Vector2 speed;
+ int width;
+ int height;
+ Color color;
+} Player;
+
+typedef struct Sample {
+ float value;
+ Vector2 position;
+ int radius;
+ bool active; // Define if sample is active (can be collected)
+ bool collected; // Define if sample has been collected
+ bool renderable; // Define if sample should be rendered
+ Color color;
+} Sample;
+
+//----------------------------------------------------------------------------------
+// Global Variables Definition (local to this module)
+//----------------------------------------------------------------------------------
+
+// Gameplay screen global variables
+static int framesCounter;
+static int finishScreen;
+static bool pause;
+
+// Player variables
+static Player player;
+static Rectangle playerArea; // Define player movement area (and sample collection limits)
+
+static float warpCounter; // Time warp counter
+static float synchro; // Calculates collected samples relation [0..1]
+
+//static int combo;
+//static int maxCombo;
+
+static Rectangle waveRec;
+
+// Samples variables
+static Sample *samples; // Game samples
+static int totalSamples = 0; // Total game samples (proportional to waveData num samples)
+static int collectedSamples; // Samples collected by player
+static int currentSample; // Last sample to go through player collect area
+static float samplesSpeed; // All samples move at the same speed
+static float waveTime; // Total sample time in ms
+
+// Resources variables
+static Texture2D texBackground;
+static Texture2D texPlayer;
+static Texture2D texSampleSmall;
+static Texture2D texSampleMid;
+static Texture2D texSampleBig;
+static Texture2D texLine;
+
+//static RenderTexture2D waveTarget;
+
+static Sound fxSampleOn; // Collected sample sound
+static Sound fxSampleOff; // Miss sample sound
+static Sound fxWave; // Sound from wave sample
+static Sound fxPause; // Pause sound
+// Debug variables
+
+//------------------------------------------------------------------------------------
+// Module Functions Declaration (local)
+//------------------------------------------------------------------------------------
+//static void DrawWave(float *waveData, int sampleCount, Rectangle bounds, Color color);
+//static void DrawWaveEx(float *waveData, int sampleCount, int playedSamples, Rectangle bounds, Color color);
+static void DrawSamples(Sample *samples, int sampleCount, int playedSamples, Rectangle bounds, Color color);
+
+//----------------------------------------------------------------------------------
+// Gameplay Screen Functions Definition
+//----------------------------------------------------------------------------------
+
+// Gameplay Screen Initialization logic
+void InitGameplayScreen(void)
+{
+ framesCounter = 0;
+ finishScreen = 0;
+ pause = false;
+ endingStatus = 0;
+
+ // Textures loading
+ texBackground = LoadTexture("resources/textures/background_gameplay.png");
+ texPlayer = LoadTexture("resources/textures/player.png");
+ texSampleSmall = LoadTexture("resources/textures/sample_small.png");
+ texSampleMid = LoadTexture("resources/textures/sample_mid.png");
+ texSampleBig = LoadTexture("resources/textures/sample_big.png");
+ texLine = LoadTexture("resources/textures/line.png");
+
+ waveRec = (Rectangle){ 32, 32, 1280 - 64, 105 };
+ //RenderTexture2D waveTarget = LoadRenderTexture(waveRec.width, waveRec.height);
+
+ // Sound loading
+ fxSampleOn = LoadSound("resources/audio/sample_on.wav");
+ fxSampleOff = LoadSound("resources/audio/sample_off.wav");
+ fxPause = LoadSound("resources/audio/pause.wav");
+
+ SetSoundVolume(fxSampleOn, 0.6f);
+ SetSoundVolume(fxPause, 0.5f);
+
+ // Initialize player data
+ playerArea = (Rectangle){ 200, 160, 80, 400 };
+
+ player.width = 20;
+ player.height = 60;
+ player.speed = (Vector2){ 15, 15 };
+ player.color = GOLD;
+ player.position = (Vector2){ playerArea.x + playerArea.width/2 - texPlayer.width/2,
+ playerArea.y + playerArea.height/2 - texPlayer.height/2 };
+
+ warpCounter = 395;
+ synchro = 0.2f;
+
+ // Initialize wave and samples data
+ Wave wave = LoadWave("resources/audio/wave.ogg");
+ float *waveData = GetWaveData(wave);
+ //printf("Wave total samples: %i\n", wave.sampleCount);
+
+ // We calculate the required parameters to adjust audio time to gameplay time
+ // that way samples collected correspond to audio playing
+ // Synchonization is not perfect due to possible rounding issues (float to int)
+ waveTime = wave.sampleCount/wave.sampleRate; // Total sample time in seconds
+ float requiredSamples = (MAX_SAMPLES_SPEED*waveTime*60 - 1000)/SAMPLES_SPACING;
+ int samplesDivision = (int)(wave.sampleCount/requiredSamples);
+
+ totalSamples = wave.sampleCount/samplesDivision;
+
+ fxWave = LoadSoundFromWave(wave);
+ UnloadWave(wave);
+
+ collectedSamples = 0;
+
+ // Init samples
+ samples = (Sample *)malloc(totalSamples*sizeof(Sample));
+
+ // Normalize wave data (min vs max values) to scale properly
+ float minSampleValue = 0.0f;
+ float maxSampleValue = 0.0f;
+
+ for (int i = 0; i < totalSamples; i++)
+ {
+ if (waveData[i*samplesDivision] < minSampleValue) minSampleValue = waveData[i*samplesDivision];
+ if (waveData[i*samplesDivision] > maxSampleValue) maxSampleValue = waveData[i*samplesDivision];
+ }
+
+ float sampleScaleFactor = 1.0f/(maxSampleValue - minSampleValue); // 400 pixels maximum size
+
+ // Initialize samples
+ for (int i = 0; i < totalSamples; i++)
+ {
+ samples[i].value = waveData[i*samplesDivision]*sampleScaleFactor; // Normalized value [-1.0..1.0]
+ samples[i].position.x = player.position.x + 1000 + i*SAMPLES_SPACING;
+
+ samples[i].position.y = GetScreenHeight()/2 + samples[i].value*SAMPLES_MULTIPLIER;
+
+ if (samples[i].position.y > GetScreenHeight()/2 + MAX_GAME_HEIGHT/2) samples[i].position.y = GetScreenHeight()/2 - MAX_GAME_HEIGHT/2;
+ else if (samples[i].position.y < GetScreenHeight()/2 - MAX_GAME_HEIGHT/2) samples[i].position.y = GetScreenHeight()/2 + MAX_GAME_HEIGHT/2;
+
+ samples[i].radius = 6;
+ samples[i].active = true;
+ samples[i].collected = false;
+ samples[i].color = RED;
+ }
+
+ samplesSpeed = MAX_SAMPLES_SPEED;
+ currentSample = 0;
+
+ // We already saved the samples we needed for the game, we can free waveData
+ free(waveData);
+
+ // Load and start playing music
+ // NOTE: Music is loaded in main code base
+ PlayMusicStream(music);
+}
+
+// Gameplay Screen Update logic
+void UpdateGameplayScreen(void)
+{
+ if (IsKeyPressed('P'))
+ {
+ PlaySound(fxPause);
+ pause = !pause;
+
+ if (pause) PauseMusicStream(music);
+ else ResumeMusicStream(music);
+ }
+
+ if (!pause)
+ {
+ framesCounter++; // Time starts counting to awake enemies
+
+ // Player movement logic (mouse)
+ player.position.y = GetMousePosition().y;
+
+ // Player movement logic (keyboard)
+ if (IsKeyDown(KEY_W)) player.position.y -= player.speed.y;
+ else if (IsKeyDown(KEY_S)) player.position.y += player.speed.y;
+
+ // Player movement logic (gamepad)
+ /*
+ if (IsGamepadAvailable(GAMEPAD_PLAYER1))
+ {
+ Vector2 movement = { 0.0f };
+
+ movement.x = GetGamepadAxisMovement(GAMEPAD_PLAYER1, GAMEPAD_PS3_AXIS_LEFT_X);
+ movement.y = GetGamepadAxisMovement(GAMEPAD_PLAYER1, GAMEPAD_PS3_AXIS_LEFT_Y);
+
+ player.position.x += movement.x*0.1f; // Scale gamepad movement value
+ player.position.y += movement.y*0.1f; // Scale gamepad movement value
+ }
+ */
+
+ // Player logic: check player area limits
+ if (player.position.x < playerArea.x) player.position.x = playerArea.x;
+ else if ((player.position.x + player.width) > (playerArea.x + playerArea.width)) player.position.x = playerArea.x + playerArea.width - player.width;
+
+ if (player.position.y < playerArea.y) player.position.y = playerArea.y;
+ else if ((player.position.y + player.height) > (playerArea.y + playerArea.height)) player.position.y = playerArea.y + playerArea.height - player.height;
+
+ // Samples logic
+ for (int i = 0; i < totalSamples; i++)
+ {
+ // Samples movement logic
+ samples[i].position.x -= samplesSpeed;
+
+ if (((samples[i].position.x + samples[i].radius) > -SAMPLES_SPACING) &&
+ ((samples[i].position.x - samples[i].radius) < GetScreenWidth())) samples[i].renderable = true;
+ else samples[i].renderable = false;
+
+ // Samples catch logic
+ if (!samples[i].collected && CheckCollisionCircleRec(samples[i].position, samples[i].radius, (Rectangle){ (int)player.position.x, (int)player.position.y, player.width, player.height }))
+ {
+ samples[i].collected = true;
+ collectedSamples++;
+ synchro += 0.02;
+
+ if (synchro >= 1.0f) synchro = 1.0f;
+
+ // Set sound pitch depending on sample position (base pitch: 1.0f)
+ // NOTE: waveData[i*WAVE_SAMPLES_DIV] is scaled to [0.3..1.7]
+ SetSoundPitch(fxSampleOn, samples[i].value*1.4f + 0.7f);
+
+ PlaySound(fxSampleOn);
+ }
+
+ if ((samples[i].position.x - samples[i].radius) < player.position.x)
+ {
+ currentSample = i; // Register last sample going out range
+
+ if (samples[i].active)
+ {
+ samples[i].active = false;
+
+ //PlaySound(fxSampleOff);
+
+ if (!samples[i].collected) synchro -= 0.05f;
+ }
+ }
+ }
+
+ if (IsKeyDown(KEY_SPACE) && (warpCounter > 0))
+ {
+ warpCounter--;
+ if (warpCounter < 0) warpCounter = 0;
+
+ samplesSpeed -= 0.1f;
+ if (samplesSpeed <= MIN_SAMPLES_SPEED) samplesSpeed = MIN_SAMPLES_SPEED;
+
+ SetMusicPitch(music, samplesSpeed/MAX_SAMPLES_SPEED);
+ }
+ else
+ {
+ warpCounter++;
+ if (warpCounter > 395) warpCounter = 395;
+
+ samplesSpeed += 0.1f;
+ if (samplesSpeed >= MAX_SAMPLES_SPEED) samplesSpeed = MAX_SAMPLES_SPEED;
+
+ SetMusicPitch(music, samplesSpeed/MAX_SAMPLES_SPEED);
+ }
+
+ // Check ending conditions
+ if (currentSample >= totalSamples)
+ {
+ StopMusicStream(music);
+ endingStatus = 1; // Win
+ finishScreen = 1;
+ }
+
+ if (synchro <= 0.0f)
+ {
+ synchro = 0.0f;
+ StopMusicStream(music);
+ endingStatus = 2; // Loose
+ finishScreen = 1;
+ }
+ }
+}
+
+// Gameplay Screen Draw logic
+void DrawGameplayScreen(void)
+{
+ // Draw background
+ DrawTexture(texBackground, 0, 0, WHITE);
+
+ // Screen elements drawing
+ //DrawRectangleLines(playerArea.x, playerArea.y, playerArea.width, playerArea.height, BLUE);
+ DrawRectangle(0, GetScreenHeight()/2 - 1, GetScreenWidth(), 2, Fade(BLUE, 0.3f));
+ //DrawRectangleLines(0, GetScreenHeight()/2 - MAX_GAME_HEIGHT/2, GetScreenWidth(), MAX_GAME_HEIGHT, GRAY);
+
+ // Draw samples
+ for (int i = 0; i < totalSamples - 1; i++)
+ {
+ if (samples[i].renderable)
+ {
+ Color col = samples[i].color;
+
+ if (i < (currentSample + 1)) col = Fade(DARKGRAY, 0.5f);
+ else col = WHITE;
+
+ //DrawCircleV(samples[i].position, samples[i].radius, col);
+ if (!samples[i].collected)
+ {
+ // TODO: Draw differnt size samples
+ DrawTexture(texSampleMid, samples[i].position.x - texSampleMid.width/2, samples[i].position.y - texSampleMid.height/2, col);
+
+ }
+
+ if (i < (currentSample + 1)) col = Fade(GRAY, 0.3f);
+ else col = Fade(WHITE, 0.5f);
+
+ // Draw line between samples
+ //DrawLine(samples[i].position.x, samples[i].position.y, samples[i + 1].position.x, samples[i + 1].position.y, col);
+
+ float dx = samples[i + 1].position.x - samples[i].position.x;
+ float dy = samples[i + 1].position.y - samples[i].position.y;
+ float d = sqrtf(dx*dx + dy*dy);
+ float angle = asinf(dy/d);
+
+ // TODO: Draw lines using textures - IMPROVE!
+ //DrawTextureEx(texLine, (Vector2){ samples[i].position.x - 2, samples[i].position.y - 2 }, -RAD2DEG*angle, d/SAMPLES_SPACING, col);
+
+ DrawTexturePro(texLine, (Rectangle){ 0, 0, texLine.width, texLine.height },
+ (Rectangle){ samples[i].position.x, samples[i].position.y, (float)texLine.width*d/SAMPLES_SPACING, texLine.height },
+ (Vector2){ 0, (float)texLine.height/2 }, -RAD2DEG*angle, col);
+ }
+ }
+
+ // Draw player
+ //DrawRectangle((int)player.position.x, (int)player.position.y, player.width, player.height, player.color);
+ DrawTexture(texPlayer, player.position.x - 32, player.position.y - 24, WHITE);
+
+ // Draw pause message
+ if (pause) DrawTextEx(font, "WAVE PAUSED", (Vector2){ 235, 400 }, font.size*2, 0, WHITE);
+
+ // Draw number of samples
+ //DrawText(FormatText("%05i", collectedSamples), 900, 200, 40, GRAY);
+ //DrawText(FormatText("%05i", totalSamples), 900, 250, 40, GRAY);
+ DrawTextEx(font, FormatText("%05i / %05i", collectedSamples, totalSamples), (Vector2){810, 170}, font.size, -2, SKYBLUE);
+
+ // Draw synchonicity level
+ DrawRectangle(99, 622, 395, 32, Fade(RAYWHITE, 0.8f));
+
+ if (synchro <= 0.3f) DrawRectangle(99, 622, synchro*395, 32, Fade(RED, 0.8f));
+ else if (synchro <= 0.8f) DrawRectangle(99, 622, synchro*395, 32, Fade(ORANGE,0.8f));
+ else if (synchro < 1.0f) DrawRectangle(99, 622, synchro*395, 32, Fade(LIME,0.8f));
+ else DrawRectangle(99, 622, synchro*395, 32, Fade(GREEN, 0.9f));
+
+ DrawRectangleLines(99, 622, 395, 32, MAROON);
+
+ if (synchro == 1.0f) DrawTextEx(font, FormatText("%02i%%", (int)(synchro*100)), (Vector2){99 + 390, 600}, font.size, -2, GREEN);
+ else DrawTextEx(font, FormatText("%02i%%", (int)(synchro*100)), (Vector2){99 + 390, 600}, font.size, -2, SKYBLUE);
+
+ // Draw time warp coool-down bar
+ DrawRectangle(754, 622, 395, 32, Fade(RAYWHITE, 0.8f));
+ DrawRectangle(754, 622, warpCounter, 32, Fade(SKYBLUE, 0.8f));
+ DrawRectangleLines(754, 622, 395, 32, DARKGRAY);
+ //DrawText(FormatText("%02i%%", (int)(synchro*100)), 754 + 410, 628, 20, DARKGRAY);
+ DrawTextEx(font, FormatText("%02i%%", (int)((float)warpCounter/395.0f*100.0f)), (Vector2){754 + 390, 600}, font.size, -2, SKYBLUE);
+
+ // Draw wave
+ // NOTE: Old drawing method, replaced by rendertarget
+ DrawSamples(samples, totalSamples, currentSample, waveRec, MAROON);
+ DrawRectangle(waveRec.x + (int)currentSample*1240/totalSamples, waveRec.y, 2, 99, DARKGRAY);
+ //DrawRectangleLines(20, 20, 1240, 140, DARKGRAY);
+ //DrawRectangle(20, 150, (float)currentSample/totalSamples*1240, 10, GRAY);
+
+ // TODO: Draw wave using render target --> It FAILS! Need to review...
+ /*
+ BeginTextureMode(waveTarget);
+ DrawSamples(samples, totalSamples, currentSample, (Rectangle){ 0, 0, waveTarget.texture.width, waveTarget.texture.height }, MAROON);
+ EndTextureMode();
+
+ DrawTextureEx(waveTarget.texture, (Vector2){ waveRec.x, waveRec.y }, 0.0f, 1.0f, WHITE);
+ */
+}
+
+// Gameplay Screen Unload logic
+void UnloadGameplayScreen(void)
+{
+ // Unload textures
+ UnloadTexture(texBackground);
+ UnloadTexture(texPlayer);
+ UnloadTexture(texSampleSmall);
+ UnloadTexture(texSampleMid);
+ UnloadTexture(texSampleBig);
+ UnloadTexture(texLine);
+
+ //UnloadRenderTexture(waveTarget);
+
+ // Unload sounds
+ UnloadSound(fxSampleOn);
+ UnloadSound(fxSampleOff);
+ UnloadSound(fxWave);
+ UnloadSound(fxPause);
+
+ //free(samples); // Unload game samples (crashes game)
+}
+
+// Gameplay Screen should finish?
+int FinishGameplayScreen(void)
+{
+ return finishScreen;
+}
+
+//------------------------------------------------------------------------------------
+// Module Functions Definitions (local)
+//------------------------------------------------------------------------------------
+
+// Draw samples in wave form (including already played samples in a different color!)
+// NOTE: For proper visualization, MSAA x4 is recommended, alternatively
+// it should be rendered to a bigger texture and then scaled down with
+// bilinear/trilinear texture filtering
+static void DrawSamples(Sample *samples, int sampleCount, int playedSamples, Rectangle bounds, Color color)
+{
+ // NOTE: We just pick a sample to draw every increment
+ float sampleIncrementX = (float)bounds.width/sampleCount;
+
+ Color col = color;
+
+ for (int i = 0; i < sampleCount - 1; i++)
+ {
+ if (i < playedSamples) col = GRAY;
+ else col = color;
+
+ DrawLineV((Vector2){ (float)bounds.x + (float)i*sampleIncrementX, (float)(bounds.y + bounds.height/2) + samples[i].value*bounds.height },
+ (Vector2){ (float)bounds.x + (float)(i + 1)*sampleIncrementX, (float)(bounds.y + bounds.height/2) + + samples[i + 1].value*bounds.height }, col);
+ }
+} \ No newline at end of file
diff --git a/games/wave_collector/screens/screen_logo.c b/games/wave_collector/screens/screen_logo.c
new file mode 100644
index 00000000..e855752e
--- /dev/null
+++ b/games/wave_collector/screens/screen_logo.c
@@ -0,0 +1,181 @@
+/**********************************************************************************************
+*
+* raylib - Advance Game template
+*
+* Logo Screen Functions Definitions (Init, Update, Draw, Unload)
+*
+* Copyright (c) 2014 Ramon Santamaria (Ray San - [email protected])
+*
+* 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"
+
+#define LOGO_RECS_SIDE 16
+
+//----------------------------------------------------------------------------------
+// Global Variables Definition (local to this module)
+//----------------------------------------------------------------------------------
+
+// Logo screen global variables
+static int framesCounter;
+static int finishScreen;
+
+static int logoPositionX;
+static int logoPositionY;
+
+static int lettersCount;
+
+static int topSideRecWidth;
+static int leftSideRecHeight;
+
+static int bottomSideRecWidth;
+static int rightSideRecHeight;
+
+static int state; // Tracking animation states (State Machine)
+static float alpha = 1.0f; // Useful for fading
+
+//----------------------------------------------------------------------------------
+// Logo Screen Functions Definition
+//----------------------------------------------------------------------------------
+
+// Logo Screen Initialization logic
+void InitLogoScreen(void)
+{
+ // Initialize LOGO screen variables here!
+ finishScreen = 0;
+ framesCounter = 0;
+ lettersCount = 0;
+
+ logoPositionX = GetScreenWidth()/2 - 128;
+ logoPositionY = GetScreenHeight()/2 - 128;
+
+ topSideRecWidth = LOGO_RECS_SIDE;
+ leftSideRecHeight = LOGO_RECS_SIDE;
+ bottomSideRecWidth = LOGO_RECS_SIDE;
+ rightSideRecHeight = LOGO_RECS_SIDE;
+
+ state = 0;
+ alpha = 1.0f;
+}
+
+// Logo Screen Update logic
+void UpdateLogoScreen(void)
+{
+ // Update LOGO screen variables here!
+ if (state == 0) // State 0: Small box blinking
+ {
+ framesCounter++;
+
+ if (framesCounter == 80)
+ {
+ state = 1;
+ framesCounter = 0; // Reset counter... will be used later...
+
+ PlayMusicStream(music); // Start playing music... ;)
+ }
+ }
+ else if (state == 1) // State 1: Top and left bars growing
+ {
+ topSideRecWidth += 8;
+ leftSideRecHeight += 8;
+
+ if (topSideRecWidth == 256) state = 2;
+ }
+ else if (state == 2) // State 2: Bottom and right bars growing
+ {
+ bottomSideRecWidth += 8;
+ rightSideRecHeight += 8;
+
+ if (bottomSideRecWidth == 256) state = 3;
+ }
+ else if (state == 3) // State 3: Letters appearing (one by one)
+ {
+ framesCounter++;
+
+ if (lettersCount < 10)
+ {
+ if (framesCounter/15) // Every 12 frames, one more letter!
+ {
+ lettersCount++;
+ framesCounter = 0;
+ }
+ }
+ else // When all letters have appeared, just fade out everything
+ {
+ if (framesCounter > 200)
+ {
+ alpha -= 0.02f;
+
+ if (alpha <= 0.0f)
+ {
+ alpha = 0.0f;
+ finishScreen = 1;
+ }
+ }
+ }
+ }
+}
+
+// Logo Screen Draw logic
+void DrawLogoScreen(void)
+{
+ if (state == 0)
+ {
+ if ((framesCounter/10)%2) DrawRectangle(logoPositionX, logoPositionY, 16, 16, BLACK);
+ }
+ else if (state == 1)
+ {
+ DrawRectangle(logoPositionX, logoPositionY, topSideRecWidth, 16, BLACK);
+ DrawRectangle(logoPositionX, logoPositionY, 16, leftSideRecHeight, BLACK);
+ }
+ else if (state == 2)
+ {
+ DrawRectangle(logoPositionX, logoPositionY, topSideRecWidth, 16, BLACK);
+ DrawRectangle(logoPositionX, logoPositionY, 16, leftSideRecHeight, BLACK);
+
+ DrawRectangle(logoPositionX + 240, logoPositionY, 16, rightSideRecHeight, BLACK);
+ DrawRectangle(logoPositionX, logoPositionY + 240, bottomSideRecWidth, 16, BLACK);
+ }
+ else if (state == 3)
+ {
+ DrawRectangle(logoPositionX, logoPositionY, topSideRecWidth, 16, Fade(BLACK, alpha));
+ DrawRectangle(logoPositionX, logoPositionY + 16, 16, leftSideRecHeight - 32, Fade(BLACK, alpha));
+
+ DrawRectangle(logoPositionX + 240, logoPositionY + 16, 16, rightSideRecHeight - 32, Fade(BLACK, alpha));
+ DrawRectangle(logoPositionX, logoPositionY + 240, bottomSideRecWidth, 16, Fade(BLACK, alpha));
+
+ DrawRectangle(GetScreenWidth()/2 - 112, GetScreenHeight()/2 - 112, 224, 224, Fade(RAYWHITE, alpha));
+
+ DrawText(SubText("raylib", 0, lettersCount), GetScreenWidth()/2 - 44, GetScreenHeight()/2 + 48, 50, Fade(BLACK, alpha));
+
+ if (framesCounter > 20) DrawText("powered by", logoPositionX, logoPositionY - 27, 20, Fade(DARKGRAY, alpha));
+ }
+}
+
+// Logo Screen Unload logic
+void UnloadLogoScreen(void)
+{
+ // Unload LOGO screen variables here!
+}
+
+// Logo Screen should finish?
+int FinishLogoScreen(void)
+{
+ return finishScreen;
+} \ No newline at end of file
diff --git a/games/wave_collector/screens/screen_title.c b/games/wave_collector/screens/screen_title.c
new file mode 100644
index 00000000..1d33e3ba
--- /dev/null
+++ b/games/wave_collector/screens/screen_title.c
@@ -0,0 +1,112 @@
+/**********************************************************************************************
+*
+* raylib - Advance Game template
+*
+* Title Screen Functions Definitions (Init, Update, Draw, Unload)
+*
+* Copyright (c) 2014 Ramon Santamaria (Ray San - [email protected])
+*
+* 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"
+
+//----------------------------------------------------------------------------------
+// Global Variables Definition (local to this module)
+//----------------------------------------------------------------------------------
+
+// Title screen global variables
+static int framesCounter;
+static int finishScreen;
+
+static Texture2D texBackground;
+static Texture2D texTitle;
+static Texture2D texLogo;
+
+static float titleAlpha = 0.0f;
+
+static Sound fxStart;
+
+//----------------------------------------------------------------------------------
+// Title Screen Functions Definition
+//----------------------------------------------------------------------------------
+
+// Title Screen Initialization logic
+void InitTitleScreen(void)
+{
+ // Initialize TITLE screen variables here!
+ framesCounter = 0;
+ finishScreen = 0;
+
+ texBackground = LoadTexture("resources/textures/background_title.png");
+ texTitle = LoadTexture("resources/textures/title.png");
+ texLogo = LoadTexture("resources/textures/logo_raylib.png");
+
+ fxStart = LoadSound("resources/audio/start.wav");
+}
+
+// Title Screen Update logic
+void UpdateTitleScreen(void)
+{
+ // Update TITLE screen variables here!
+ framesCounter++;
+
+ titleAlpha += 0.005f;
+
+ if (titleAlpha >= 1.0f) titleAlpha = 1.0f;
+
+ // Press enter to change to ATTIC screen
+ if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON))
+ {
+ PlaySound(fxStart);
+ StopMusicStream(music);
+ finishScreen = 1;
+ }
+}
+
+// Title Screen Draw logic
+void DrawTitleScreen(void)
+{
+ DrawTexture(texBackground, 0, 0, WHITE);
+ DrawTexture(texTitle, GetScreenWidth()/2 - texTitle.width/2, -25, Fade(WHITE, titleAlpha));
+
+ DrawRectangle(0, GetScreenHeight() - 70, 560, 40, Fade(RAYWHITE, 0.8f));
+ DrawText("(c) Developed by Ramon Santamaria (@raysan5)", 36, GetScreenHeight() - 60, 20, DARKBLUE);
+
+ DrawText("powered by", GetScreenWidth() - 162, GetScreenHeight() - 190, 20, DARKGRAY);
+ DrawTexture(texLogo, GetScreenWidth() - 128 - 34, GetScreenHeight() - 128 - 36, WHITE);
+
+ if ((framesCounter > 160) && ((framesCounter/40)%2)) DrawTextEx(font, "mouse click to start", (Vector2){ 325, 500 }, font.size, 0, SKYBLUE);
+}
+
+// Title Screen Unload logic
+void UnloadTitleScreen(void)
+{
+ // Unload TITLE screen variables here!
+ UnloadTexture(texBackground);
+ UnloadTexture(texTitle);
+ UnloadTexture(texLogo);
+
+ UnloadSound(fxStart);
+}
+
+// Title Screen should finish?
+int FinishTitleScreen(void)
+{
+ return finishScreen;
+} \ No newline at end of file
diff --git a/games/wave_collector/screens/screens.h b/games/wave_collector/screens/screens.h
new file mode 100644
index 00000000..9c9c5175
--- /dev/null
+++ b/games/wave_collector/screens/screens.h
@@ -0,0 +1,87 @@
+/**********************************************************************************************
+*
+* raylib - Advance Game template
+*
+* Screens Functions Declarations (Init, Update, Draw, Unload)
+*
+* Copyright (c) 2014 Ramon Santamaria (Ray San - [email protected])
+*
+* 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
+
+//----------------------------------------------------------------------------------
+// Types and Structures Definition
+//----------------------------------------------------------------------------------
+typedef enum GameScreen { LOGO = 0, TITLE, GAMEPLAY, ENDING } GameScreen;
+
+//----------------------------------------------------------------------------------
+// Global Variables Definition
+//----------------------------------------------------------------------------------
+GameScreen currentScreen;
+SpriteFont font;
+Music music;
+int endingStatus; // 1 - Win, 2 - Lose
+//char *sampleFilename;
+
+#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);
+
+//----------------------------------------------------------------------------------
+// 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 \ No newline at end of file
diff --git a/games/wave_collector/wave_collector.c b/games/wave_collector/wave_collector.c
new file mode 100644
index 00000000..8c271604
--- /dev/null
+++ b/games/wave_collector/wave_collector.c
@@ -0,0 +1,310 @@
+/*******************************************************************************************
+*
+* GLOBAL GAME JAM 2017 - WAVE COLLECTOR
+*
+* 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 (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>
+
+#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)
+float transAlpha = 0;
+bool onTransition = false;
+bool transFadeOut = false;
+int transFromScreen = -1;
+int transToScreen = -1;
+
+//----------------------------------------------------------------------------------
+// Local Functions Declaration
+//----------------------------------------------------------------------------------
+void TransitionToScreen(int screen);
+void ChangeToScreen(int screen); // No transition effect
+void UpdateTransition(void);
+void DrawTransition(void);
+
+void UpdateDrawFrame(void); // Update and Draw one frame
+
+//static const char *GetExtension(const char *fileName);
+
+//----------------------------------------------------------------------------------
+// Main entry point
+//----------------------------------------------------------------------------------
+int main(int argc, char *argv[])
+{
+ // Initialization
+ //---------------------------------------------------------
+ /*
+#if !defined(PLATFORM_WEB)
+ // TODO: Add support for dropped files on the exe
+ sampleFilename = (char *)malloc(256);
+ if (argc > 1)
+ {
+ if ((strcmp(GetExtension(argv[1]), "ogg") == 0) ||
+ (strcmp(GetExtension(argv[1]), "wav") == 0))
+ {
+ strcpy(sampleFilename, argv[1]);
+ }
+ }
+#endif
+ */
+ SetConfigFlags(FLAG_MSAA_4X_HINT);
+ InitWindow(screenWidth, screenHeight, "GGJ17 - WAVE COLLECTOR");
+
+ // Global data loading (assets that must be available in all screens, i.e. fonts)
+ InitAudioDevice();
+
+ font = LoadSpriteFont("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!
+ UnloadSpriteFont(font);
+ UnloadMusicStream(music);
+
+ CloseAudioDevice();
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
+
+void TransitionToScreen(int screen)
+{
+ onTransition = true;
+ transFromScreen = currentScreen;
+ transToScreen = screen;
+}
+
+void ChangeToScreen(int screen)
+{
+ switch (currentScreen)
+ {
+ case LOGO: UnloadLogoScreen(); break;
+ case TITLE: UnloadTitleScreen(); break;
+ case GAMEPLAY: UnloadGameplayScreen(); break;
+ case ENDING: UnloadEndingScreen(); break;
+ default: break;
+ }
+
+ switch (screen)
+ {
+ case LOGO: InitLogoScreen(); break;
+ case TITLE: InitTitleScreen(); break;
+ case GAMEPLAY: InitGameplayScreen(); break;
+ case ENDING: InitEndingScreen(); break;
+ default: break;
+ }
+
+ currentScreen = screen;
+}
+
+void UpdateTransition(void)
+{
+ if (!transFadeOut)
+ {
+ transAlpha += 0.05f;
+
+ if (transAlpha >= 1.0)
+ {
+ transAlpha = 1.0;
+
+ switch (transFromScreen)
+ {
+ case LOGO: UnloadLogoScreen(); break;
+ case TITLE: UnloadTitleScreen(); break;
+ case GAMEPLAY: UnloadGameplayScreen(); break;
+ case ENDING: UnloadEndingScreen(); break;
+ default: break;
+ }
+
+ switch (transToScreen)
+ {
+ case LOGO:
+ {
+ InitLogoScreen();
+ currentScreen = LOGO;
+ } break;
+ case TITLE:
+ {
+ InitTitleScreen();
+ currentScreen = TITLE;
+ } break;
+ case GAMEPLAY:
+ {
+ InitGameplayScreen();
+ currentScreen = GAMEPLAY;
+ } break;
+ case ENDING:
+ {
+ InitEndingScreen();
+ currentScreen = ENDING;
+ } break;
+ default: break;
+ }
+
+ transFadeOut = true;
+ }
+ }
+ 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(RAYWHITE, transAlpha));
+}
+
+// Update and draw game frame
+void UpdateDrawFrame(void)
+{
+ // Update
+ //----------------------------------------------------------------------------------
+ if (!onTransition)
+ {
+ switch(currentScreen)
+ {
+ case LOGO:
+ {
+ UpdateLogoScreen();
+
+ if (FinishLogoScreen()) TransitionToScreen(TITLE);
+
+ } break;
+ case TITLE:
+ {
+ UpdateTitleScreen();
+
+ if (FinishTitleScreen() == 1)
+ {
+ StopMusicStream(music);
+ 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
+ {
+ // Update transition (fade-in, fade-out)
+ UpdateTransition();
+ }
+
+ 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;
+ }
+
+ if (onTransition) DrawTransition();
+
+ //DrawFPS(10, 10);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+}
+
+/*
+#if !defined(PLATFORM_WEB)
+// Get the extension for a filename
+static const char *GetExtension(const char *fileName)
+{
+ const char *dot = strrchr(fileName, '.');
+ if (!dot || dot == fileName) return "";
+ return (dot + 1);
+}
+#endif
+*/ \ No newline at end of file