@ -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 - 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. | |||
# | |||
#************************************************************************************************** | |||
.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) |
@ -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 |
@ -0,0 +1,111 @@ | |||
/********************************************************************************************** | |||
* | |||
* raylib - Advance Game template | |||
* | |||
* Ending 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" | |||
//---------------------------------------------------------------------------------- | |||
// 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; | |||
} |
@ -0,0 +1,490 @@ | |||
/********************************************************************************************** | |||
* | |||
* raylib - Advance Game template | |||
* | |||
* Gameplay 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 <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); | |||
} | |||
} |
@ -0,0 +1,181 @@ | |||
/********************************************************************************************** | |||
* | |||
* raylib - Advance 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" | |||
#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; | |||
} |
@ -0,0 +1,112 @@ | |||
/********************************************************************************************** | |||
* | |||
* raylib - Advance Game template | |||
* | |||
* Title 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" | |||
//---------------------------------------------------------------------------------- | |||
// 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; | |||
} |
@ -0,0 +1,87 @@ | |||
/********************************************************************************************** | |||
* | |||
* raylib - Advance Game template | |||
* | |||
* Screens Functions Declarations (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. | |||
* | |||
**********************************************************************************************/ | |||
#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 |
@ -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 | |||
*/ |