WARNING: REMOVED raylib/games - Moved to raysan5/raylib-games
Move raylib games to another repo. It will reduce repo size for new clones. I considered also removing the related history with [`git filter-repo`](https://github.com/newren/git-filter-repo) (the current sane alternative to the deprecated `filter-branch`) but it has some implications: It would had made a new repository with distinct history and checksums. If the repo was previously published, the history of the new one won't have been compatible with the history others have pulled.
This commit is contained in:
parent
eb04be8141
commit
fd5d1dfcb6
300 changed files with 0 additions and 37282 deletions
|
|
@ -1,43 +0,0 @@
|
||||||
# Setup the project and settings
|
|
||||||
project(games)
|
|
||||||
|
|
||||||
# Get the source toegher
|
|
||||||
file(GLOB sources *.c)
|
|
||||||
|
|
||||||
set(OUTPUT_EXT)
|
|
||||||
|
|
||||||
if(${PLATFORM} MATCHES "Web")
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Os -s USE_GLFW=3 -s ASSERTIONS=1 -s WASM=1 -s EMTERPRETIFY=1 -s EMTERPRETIFY_ASYNC=1")
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --shell-file ${CMAKE_SOURCE_DIR}/src/shell.html")
|
|
||||||
set(OUTPUT_EXT ".html")
|
|
||||||
|
|
||||||
# Remove the -rdynamic flag because otherwise emscripten
|
|
||||||
# does not generate HTML+JS+WASM files, only a non-working
|
|
||||||
# and fat HTML
|
|
||||||
string(REPLACE "-rdynamic" "" CMAKE_SHARED_LIBRARY_LINK_C_FLAGS ${CMAKE_SHARED_LIBRARY_LINK_C_FLAGS})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (NOT TARGET raylib)
|
|
||||||
find_package(raylib 2.0 REQUIRED)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Do each game
|
|
||||||
foreach(game_source ${sources})
|
|
||||||
# Create the basename for the game
|
|
||||||
get_filename_component(game_name ${game_source} NAME)
|
|
||||||
string(REPLACE ".c" "${OUTPUT_EXT}" game_name ${game_name})
|
|
||||||
|
|
||||||
# Setup the game
|
|
||||||
add_executable(${game_name} ${game_source})
|
|
||||||
|
|
||||||
# Link the libraries
|
|
||||||
target_link_libraries(${game_name} raylib)
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
# Do the games with subdirectories
|
|
||||||
add_subdirectory(drturtle)
|
|
||||||
add_subdirectory(just_do)
|
|
||||||
add_subdirectory(koala_seasons)
|
|
||||||
add_subdirectory(light_my_ritual)
|
|
||||||
add_subdirectory(skully_escape)
|
|
||||||
add_subdirectory(wave_collector)
|
|
||||||
398
games/Makefile
398
games/Makefile
|
|
@ -1,398 +0,0 @@
|
||||||
#**************************************************************************************************
|
|
||||||
#
|
|
||||||
# raylib makefile for Desktop platforms, Raspberry Pi, Android and HTML5
|
|
||||||
#
|
|
||||||
# Copyright (c) 2013-2020 Ramon Santamaria (@raysan5)
|
|
||||||
#
|
|
||||||
# This software is provided "as-is", without any express or implied warranty. In no event
|
|
||||||
# will the authors be held liable for any damages arising from the use of this software.
|
|
||||||
#
|
|
||||||
# Permission is granted to anyone to use this software for any purpose, including commercial
|
|
||||||
# applications, and to alter it and redistribute it freely, subject to the following restrictions:
|
|
||||||
#
|
|
||||||
# 1. The origin of this software must not be misrepresented; you must not claim that you
|
|
||||||
# wrote the original software. If you use this software in a product, an acknowledgment
|
|
||||||
# in the product documentation would be appreciated but is not required.
|
|
||||||
#
|
|
||||||
# 2. Altered source versions must be plainly marked as such, and must not be misrepresented
|
|
||||||
# as being the original software.
|
|
||||||
#
|
|
||||||
# 3. This notice may not be removed or altered from any source distribution.
|
|
||||||
#
|
|
||||||
#**************************************************************************************************
|
|
||||||
|
|
||||||
.PHONY: all clean
|
|
||||||
|
|
||||||
# Define required raylib variables
|
|
||||||
PROJECT_NAME ?= raylib_examples
|
|
||||||
RAYLIB_VERSION ?= 3.0.0
|
|
||||||
RAYLIB_API_VERSION ?= 3
|
|
||||||
RAYLIB_PATH ?= ..
|
|
||||||
|
|
||||||
# Define default options
|
|
||||||
|
|
||||||
# One of PLATFORM_DESKTOP, PLATFORM_RPI, PLATFORM_ANDROID, PLATFORM_WEB
|
|
||||||
PLATFORM ?= PLATFORM_DESKTOP
|
|
||||||
|
|
||||||
# Locations of your newly installed library and associated headers. See ../src/Makefile
|
|
||||||
# On Linux, if you have installed raylib but cannot compile the examples, check that
|
|
||||||
# the *_INSTALL_PATH values here are the same as those in src/Makefile or point to known locations.
|
|
||||||
# To enable system-wide compile-time and runtime linking to libraylib.so, run ../src/$ sudo make install RAYLIB_LIBTYPE_SHARED.
|
|
||||||
# To enable compile-time linking to a special version of libraylib.so, change these variables here.
|
|
||||||
# To enable runtime linking to a special version of libraylib.so, see EXAMPLE_RUNTIME_PATH below.
|
|
||||||
# If there is a libraylib in both EXAMPLE_RUNTIME_PATH and RAYLIB_INSTALL_PATH, at runtime,
|
|
||||||
# the library at EXAMPLE_RUNTIME_PATH, if present, will take precedence over the one at RAYLIB_INSTALL_PATH.
|
|
||||||
# RAYLIB_INSTALL_PATH should be the desired full path to libraylib. No relative paths.
|
|
||||||
DESTDIR ?= /usr/local
|
|
||||||
RAYLIB_INSTALL_PATH ?= $(DESTDIR)/lib
|
|
||||||
# RAYLIB_H_INSTALL_PATH locates the installed raylib header and associated source files.
|
|
||||||
RAYLIB_H_INSTALL_PATH ?= $(DESTDIR)/include
|
|
||||||
|
|
||||||
# Library type used for raylib: STATIC (.a) or SHARED (.so/.dll)
|
|
||||||
RAYLIB_LIBTYPE ?= STATIC
|
|
||||||
|
|
||||||
# Build mode for project: DEBUG or RELEASE
|
|
||||||
BUILD_MODE ?= RELEASE
|
|
||||||
|
|
||||||
# Use external GLFW library instead of rglfw module
|
|
||||||
# TODO: Review usage on Linux. Target version of choice. Switch on -lglfw or -lglfw3
|
|
||||||
USE_EXTERNAL_GLFW ?= FALSE
|
|
||||||
|
|
||||||
# Use Wayland display server protocol on Linux desktop
|
|
||||||
# by default it uses X11 windowing system
|
|
||||||
USE_WAYLAND_DISPLAY ?= FALSE
|
|
||||||
|
|
||||||
# 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
|
|
||||||
else
|
|
||||||
UNAMEOS=$(shell uname)
|
|
||||||
ifeq ($(UNAMEOS),Linux)
|
|
||||||
PLATFORM_OS=LINUX
|
|
||||||
endif
|
|
||||||
ifeq ($(UNAMEOS),FreeBSD)
|
|
||||||
PLATFORM_OS=BSD
|
|
||||||
endif
|
|
||||||
ifeq ($(UNAMEOS),OpenBSD)
|
|
||||||
PLATFORM_OS=BSD
|
|
||||||
endif
|
|
||||||
ifeq ($(UNAMEOS),NetBSD)
|
|
||||||
PLATFORM_OS=BSD
|
|
||||||
endif
|
|
||||||
ifeq ($(UNAMEOS),DragonFly)
|
|
||||||
PLATFORM_OS=BSD
|
|
||||||
endif
|
|
||||||
ifeq ($(UNAMEOS),Darwin)
|
|
||||||
PLATFORM_OS=OSX
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_RPI)
|
|
||||||
UNAMEOS=$(shell uname)
|
|
||||||
ifeq ($(UNAMEOS),Linux)
|
|
||||||
PLATFORM_OS=LINUX
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# RAYLIB_PATH adjustment for different platforms.
|
|
||||||
# If using GNU make, we can get the full path to the top of the tree. Windows? BSD?
|
|
||||||
# Required for ldconfig or other tools that do not perform path expansion.
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
|
||||||
ifeq ($(PLATFORM_OS),LINUX)
|
|
||||||
RAYLIB_PREFIX ?= ..
|
|
||||||
RAYLIB_PATH = $(realpath $(RAYLIB_PREFIX))
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
# Default path for raylib on Raspberry Pi, if installed in different path, update it!
|
|
||||||
# This is not currently used by src/Makefile. Not sure of its origin or usage. Refer to wiki.
|
|
||||||
# TODO: update install: target in src/Makefile for RPI, consider relation to LINUX.
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_RPI)
|
|
||||||
RAYLIB_PATH ?= /home/pi/raylib
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_WEB)
|
|
||||||
# Emscripten required variables
|
|
||||||
EMSDK_PATH ?= C:/emsdk
|
|
||||||
EMSCRIPTEN_PATH ?= $(EMSDK_PATH)/fastcomp/emscripten
|
|
||||||
CLANG_PATH = $(EMSDK_PATH)/fastcomp/bin
|
|
||||||
PYTHON_PATH = $(EMSDK_PATH)/python/2.7.13.1_64bit/python-2.7.13.amd64
|
|
||||||
NODE_PATH = $(EMSDK_PATH)/node/12.9.1_64bit/bin
|
|
||||||
export PATH = $(EMSDK_PATH);$(EMSCRIPTEN_PATH);$(CLANG_PATH);$(NODE_PATH);$(PYTHON_PATH);C:\raylib\MinGW\bin:$$(PATH)
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Define raylib release directory for compiled library.
|
|
||||||
# RAYLIB_RELEASE_PATH points to provided binaries or your freshly built version
|
|
||||||
RAYLIB_RELEASE_PATH ?= $(RAYLIB_PATH)/src
|
|
||||||
|
|
||||||
# EXAMPLE_RUNTIME_PATH embeds a custom runtime location of libraylib.so or other desired libraries
|
|
||||||
# into each example binary compiled with RAYLIB_LIBTYPE=SHARED. It defaults to RAYLIB_RELEASE_PATH
|
|
||||||
# so that these examples link at runtime with your version of libraylib.so in ../release/libs/linux
|
|
||||||
# without formal installation from ../src/Makefile. It aids portability and is useful if you have
|
|
||||||
# multiple versions of raylib, have raylib installed to a non-standard location, or want to
|
|
||||||
# bundle libraylib.so with your game. Change it to your liking.
|
|
||||||
# NOTE: If, at runtime, there is a libraylib.so at both EXAMPLE_RUNTIME_PATH and RAYLIB_INSTALL_PATH,
|
|
||||||
# The library at EXAMPLE_RUNTIME_PATH, if present, will take precedence over RAYLIB_INSTALL_PATH,
|
|
||||||
# Implemented for LINUX below with CFLAGS += -Wl,-rpath,$(EXAMPLE_RUNTIME_PATH)
|
|
||||||
# To see the result, run readelf -d core/core_basic_window; looking at the RPATH or RUNPATH attribute.
|
|
||||||
# To see which libraries a built example is linking to, ldd core/core_basic_window;
|
|
||||||
# Look for libraylib.so.1 => $(RAYLIB_INSTALL_PATH)/libraylib.so.1 or similar listing.
|
|
||||||
EXAMPLE_RUNTIME_PATH ?= $(RAYLIB_RELEASE_PATH)
|
|
||||||
|
|
||||||
# Define default C compiler: gcc
|
|
||||||
# NOTE: define g++ compiler if using C++
|
|
||||||
CC = gcc
|
|
||||||
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
|
||||||
ifeq ($(PLATFORM_OS),OSX)
|
|
||||||
# OSX default compiler
|
|
||||||
CC = clang
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM_OS),BSD)
|
|
||||||
# FreeBSD, OpenBSD, NetBSD, DragonFly default compiler
|
|
||||||
CC = clang
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_RPI)
|
|
||||||
ifeq ($(USE_RPI_CROSS_COMPILER),TRUE)
|
|
||||||
# Define RPI cross-compiler
|
|
||||||
#CC = armv6j-hardfloat-linux-gnueabi-gcc
|
|
||||||
CC = $(RPI_TOOLCHAIN)/bin/arm-linux-gnueabihf-gcc
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_WEB)
|
|
||||||
# HTML5 emscripten compiler
|
|
||||||
# WARNING: To compile to HTML5, code must be redesigned
|
|
||||||
# to use emscripten.h and emscripten_set_main_loop()
|
|
||||||
CC = emcc
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Define default make program: Mingw32-make
|
|
||||||
MAKE = mingw32-make
|
|
||||||
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
|
||||||
ifeq ($(PLATFORM_OS),LINUX)
|
|
||||||
MAKE = make
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Define compiler flags:
|
|
||||||
# -O1 defines optimization level
|
|
||||||
# -g include debug information on compilation
|
|
||||||
# -s strip unnecessary data from build
|
|
||||||
# -Wall turns on most, but not all, compiler warnings
|
|
||||||
# -std=c99 defines C language mode (standard C from 1999 revision)
|
|
||||||
# -std=gnu99 defines C language mode (GNU C from 1999 revision)
|
|
||||||
# -Wno-missing-braces ignore invalid warning (GCC bug 53119)
|
|
||||||
# -D_DEFAULT_SOURCE use with -std=c99 on Linux and PLATFORM_WEB, required for timespec
|
|
||||||
CFLAGS += -Wall -std=c99 -D_DEFAULT_SOURCE -Wno-missing-braces
|
|
||||||
|
|
||||||
ifeq ($(BUILD_MODE),DEBUG)
|
|
||||||
CFLAGS += -g
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_WEB)
|
|
||||||
CFLAGS += -s ASSERTIONS=1 --profiling
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_WEB)
|
|
||||||
CFLAGS += -Os
|
|
||||||
else
|
|
||||||
CFLAGS += -s -O1
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Additional flags for compiler (if desired)
|
|
||||||
#CFLAGS += -Wextra -Wmissing-prototypes -Wstrict-prototypes
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
|
||||||
ifeq ($(PLATFORM_OS),WINDOWS)
|
|
||||||
# resource file contains windows executable icon and properties
|
|
||||||
# -Wl,--subsystem,windows hides the console window
|
|
||||||
CFLAGS += $(RAYLIB_PATH)/src/raylib.rc.data
|
|
||||||
ifeq ($(BUILD_MODE), RELEASE)
|
|
||||||
CFLAGS += -Wl,--subsystem,windows
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM_OS),LINUX)
|
|
||||||
ifeq ($(RAYLIB_LIBTYPE),STATIC)
|
|
||||||
CFLAGS += -D_DEFAULT_SOURCE
|
|
||||||
endif
|
|
||||||
ifeq ($(RAYLIB_LIBTYPE),SHARED)
|
|
||||||
# Explicitly enable runtime link to libraylib.so
|
|
||||||
CFLAGS += -Wl,-rpath,$(EXAMPLE_RUNTIME_PATH)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_RPI)
|
|
||||||
CFLAGS += -std=gnu99
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_WEB)
|
|
||||||
# -Os # size optimization
|
|
||||||
# -O2 # optimization level 2, if used, also set --memory-init-file 0
|
|
||||||
# -s USE_GLFW=3 # Use glfw3 library (context/input management)
|
|
||||||
# -s ALLOW_MEMORY_GROWTH=1 # to allow memory resizing -> WARNING: Audio buffers could FAIL!
|
|
||||||
# -s TOTAL_MEMORY=16777216 # to specify heap memory size (default = 16MB)
|
|
||||||
# -s USE_PTHREADS=1 # multithreading support
|
|
||||||
# -s WASM=0 # disable Web Assembly, emitted by default
|
|
||||||
# -s EMTERPRETIFY=1 # enable emscripten code interpreter (very slow)
|
|
||||||
# -s EMTERPRETIFY_ASYNC=1 # support synchronous loops by emterpreter
|
|
||||||
# -s FORCE_FILESYSTEM=1 # force filesystem to load/save files data
|
|
||||||
# -s ASSERTIONS=1 # enable runtime checks for common memory allocation errors (-O1 and above turn it off)
|
|
||||||
# --profiling # include information for code profiling
|
|
||||||
# --memory-init-file 0 # to avoid an external memory initialization code file (.mem)
|
|
||||||
# --preload-file resources # specify a resources folder for data compilation
|
|
||||||
CFLAGS += -s USE_GLFW=3
|
|
||||||
|
|
||||||
# Define a custom shell .html and output extension
|
|
||||||
CFLAGS += --shell-file $(RAYLIB_PATH)/src/shell.html
|
|
||||||
EXT = .html
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Define include paths for required headers
|
|
||||||
# NOTE: Several external required libraries (stb and others)
|
|
||||||
INCLUDE_PATHS = -I. -I$(RAYLIB_PATH)/src -I$(RAYLIB_PATH)/src/external
|
|
||||||
|
|
||||||
# Define additional directories containing required header files
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_RPI)
|
|
||||||
# RPI required libraries
|
|
||||||
INCLUDE_PATHS += -I/opt/vc/include
|
|
||||||
INCLUDE_PATHS += -I/opt/vc/include/interface/vmcs_host/linux
|
|
||||||
INCLUDE_PATHS += -I/opt/vc/include/interface/vcos/pthreads
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
|
||||||
ifeq ($(PLATFORM_OS),BSD)
|
|
||||||
# Consider -L$(RAYLIB_H_INSTALL_PATH)
|
|
||||||
INCLUDE_PATHS += -I/usr/local/include
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM_OS),LINUX)
|
|
||||||
# Reset everything.
|
|
||||||
# Precedence: immediately local, installed version, raysan5 provided libs -I$(RAYLIB_H_INSTALL_PATH) -I$(RAYLIB_PATH)/release/include
|
|
||||||
INCLUDE_PATHS = -I$(RAYLIB_H_INSTALL_PATH) -isystem. -isystem$(RAYLIB_PATH)/src -isystem$(RAYLIB_PATH)/release/include -isystem$(RAYLIB_PATH)/src/external
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Define library paths containing required libs.
|
|
||||||
LDFLAGS = -L. -L$(RAYLIB_RELEASE_PATH) -L$(RAYLIB_PATH)/src
|
|
||||||
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
|
||||||
ifeq ($(PLATFORM_OS),BSD)
|
|
||||||
# Consider -L$(RAYLIB_INSTALL_PATH)
|
|
||||||
LDFLAGS += -L. -Lsrc -L/usr/local/lib
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM_OS),LINUX)
|
|
||||||
# Reset everything.
|
|
||||||
# Precedence: immediately local, installed version, raysan5 provided libs
|
|
||||||
LDFLAGS = -L. -L$(RAYLIB_INSTALL_PATH) -L$(RAYLIB_RELEASE_PATH)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_RPI)
|
|
||||||
LDFLAGS += -L/opt/vc/lib
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Define any libraries required on linking
|
|
||||||
# if you want to link libraries (libname.so or libname.a), use the -lname
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
|
||||||
ifeq ($(PLATFORM_OS),WINDOWS)
|
|
||||||
# Libraries for Windows desktop compilation
|
|
||||||
# NOTE: WinMM library required to set high-res timer resolution
|
|
||||||
LDLIBS = -lraylib -lopengl32 -lgdi32 -lwinmm
|
|
||||||
# Required for physac examples
|
|
||||||
LDLIBS += -static -lpthread
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM_OS),LINUX)
|
|
||||||
# Libraries for Debian GNU/Linux desktop compiling
|
|
||||||
# NOTE: Required packages: libegl1-mesa-dev
|
|
||||||
LDLIBS = -lraylib -lGL -lm -lpthread -ldl -lrt
|
|
||||||
|
|
||||||
# On X11 requires also below libraries
|
|
||||||
LDLIBS += -lX11
|
|
||||||
# NOTE: It seems additional libraries are not required any more, latest GLFW just dlopen them
|
|
||||||
#LDLIBS += -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor
|
|
||||||
|
|
||||||
# On Wayland windowing system, additional libraries requires
|
|
||||||
ifeq ($(USE_WAYLAND_DISPLAY),TRUE)
|
|
||||||
LDLIBS += -lwayland-client -lwayland-cursor -lwayland-egl -lxkbcommon
|
|
||||||
endif
|
|
||||||
# Explicit link to libc
|
|
||||||
ifeq ($(RAYLIB_LIBTYPE),SHARED)
|
|
||||||
LDLIBS += -lc
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM_OS),OSX)
|
|
||||||
# Libraries for OSX 10.9 desktop compiling
|
|
||||||
# NOTE: Required packages: libopenal-dev libegl1-mesa-dev
|
|
||||||
LDLIBS = -lraylib -framework OpenGL -framework Cocoa -framework IOKit -framework CoreAudio -framework CoreVideo
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM_OS),BSD)
|
|
||||||
# Libraries for FreeBSD, OpenBSD, NetBSD, DragonFly desktop compiling
|
|
||||||
# NOTE: Required packages: mesa-libs
|
|
||||||
LDLIBS = -lraylib -lGL -lpthread -lm
|
|
||||||
|
|
||||||
# On XWindow requires also below libraries
|
|
||||||
LDLIBS += -lX11 -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor
|
|
||||||
endif
|
|
||||||
ifeq ($(USE_EXTERNAL_GLFW),TRUE)
|
|
||||||
# NOTE: It could require additional packages installed: libglfw3-dev
|
|
||||||
LDLIBS += -lglfw
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_RPI)
|
|
||||||
# Libraries for Raspberry Pi compiling
|
|
||||||
# NOTE: Required packages: libasound2-dev (ALSA)
|
|
||||||
LDLIBS = -lraylib -lbrcmGLESv2 -lbrcmEGL -lpthread -lrt -lm -lbcm_host -ldl
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_WEB)
|
|
||||||
# Libraries for web (HTML5) compiling
|
|
||||||
LDLIBS = $(RAYLIB_RELEASE_PATH)/libraylib.bc
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Define all source files required
|
|
||||||
SAMPLES = \
|
|
||||||
arkanoid \
|
|
||||||
asteroids \
|
|
||||||
asteroids_survival \
|
|
||||||
floppy \
|
|
||||||
gold_fever \
|
|
||||||
gorilas \
|
|
||||||
missile_commander \
|
|
||||||
pang \
|
|
||||||
snake \
|
|
||||||
space_invaders \
|
|
||||||
tetris \
|
|
||||||
|
|
||||||
# typing 'make' will invoke the default target entry
|
|
||||||
all: $(SAMPLES)
|
|
||||||
|
|
||||||
# Generic compilation pattern
|
|
||||||
# NOTE: Examples must be ready for Android compilation!
|
|
||||||
%: %.c
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_ANDROID)
|
|
||||||
$(MAKE) -f Makefile.Android PROJECT_NAME=$@ PROJECT_SOURCE_FILES=$<
|
|
||||||
else
|
|
||||||
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Clean everything
|
|
||||||
clean:
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
|
||||||
ifeq ($(PLATFORM_OS),WINDOWS)
|
|
||||||
del *.o *.exe /s
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM_OS),LINUX)
|
|
||||||
find -type f -executable | xargs file -i | grep -E 'x-object|x-archive|x-sharedlib|x-executable|x-pie-executable' | rev | cut -d ':' -f 2- | rev | xargs rm -fv
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM_OS),OSX)
|
|
||||||
find . -type f -perm +ugo+x -delete
|
|
||||||
rm -f *.o
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_RPI)
|
|
||||||
find . -type f -executable -delete
|
|
||||||
rm -fv *.o
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_WEB)
|
|
||||||
del *.o *.html *.js
|
|
||||||
endif
|
|
||||||
@echo Cleaning done
|
|
||||||
|
|
||||||
|
|
@ -1,300 +0,0 @@
|
||||||
#**************************************************************************************************
|
|
||||||
#
|
|
||||||
# raylib makefile for Android project (APK building)
|
|
||||||
#
|
|
||||||
# Copyright (c) 2017 Ramon Santamaria (@raysan5)
|
|
||||||
#
|
|
||||||
# This software is provided "as-is", without any express or implied warranty. In no event
|
|
||||||
# will the authors be held liable for any damages arising from the use of this software.
|
|
||||||
#
|
|
||||||
# Permission is granted to anyone to use this software for any purpose, including commercial
|
|
||||||
# applications, and to alter it and redistribute it freely, subject to the following restrictions:
|
|
||||||
#
|
|
||||||
# 1. The origin of this software must not be misrepresented; you must not claim that you
|
|
||||||
# wrote the original software. If you use this software in a product, an acknowledgment
|
|
||||||
# in the product documentation would be appreciated but is not required.
|
|
||||||
#
|
|
||||||
# 2. Altered source versions must be plainly marked as such, and must not be misrepresented
|
|
||||||
# as being the original software.
|
|
||||||
#
|
|
||||||
# 3. This notice may not be removed or altered from any source distribution.
|
|
||||||
#
|
|
||||||
#**************************************************************************************************
|
|
||||||
|
|
||||||
# Define required raylib variables
|
|
||||||
PLATFORM ?= PLATFORM_ANDROID
|
|
||||||
RAYLIB_PATH ?= ..\..
|
|
||||||
|
|
||||||
# Define Android architecture (armeabi-v7a, arm64-v8a, x86, x86-64) and API version
|
|
||||||
ANDROID_ARCH ?= ARM
|
|
||||||
ANDROID_API_VERSION = 21
|
|
||||||
ifeq ($(ANDROID_ARCH),ARM)
|
|
||||||
ANDROID_ARCH_NAME = armeabi-v7a
|
|
||||||
endif
|
|
||||||
ifeq ($(ANDROID_ARCH),ARM64)
|
|
||||||
ANDROID_ARCH_NAME = arm64-v8a
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Required path variables
|
|
||||||
# NOTE: JAVA_HOME must be set to JDK
|
|
||||||
JAVA_HOME ?= C:/JavaJDK
|
|
||||||
ANDROID_HOME = C:/android-sdk
|
|
||||||
ANDROID_TOOLCHAIN = C:/android_toolchain_$(ANDROID_ARCH)_API$(ANDROID_API_VERSION)
|
|
||||||
ANDROID_BUILD_TOOLS = $(ANDROID_HOME)/build-tools/28.0.1
|
|
||||||
ANDROID_PLATFORM_TOOLS = $(ANDROID_HOME)/platform-tools
|
|
||||||
|
|
||||||
# Android project configuration variables
|
|
||||||
PROJECT_NAME ?= raylib_game
|
|
||||||
PROJECT_LIBRARY_NAME ?= main
|
|
||||||
PROJECT_BUILD_PATH ?= android.$(PROJECT_NAME)
|
|
||||||
PROJECT_RESOURCES_PATH ?= resources
|
|
||||||
PROJECT_SOURCE_FILES ?= raylib_game.c
|
|
||||||
|
|
||||||
# Some source files are placed in directories, when compiling to some
|
|
||||||
# output directory other than source, that directory must pre-exist.
|
|
||||||
# Here we get a list of required folders that need to be created on
|
|
||||||
# code output folder $(PROJECT_BUILD_PATH)\obj to avoid GCC errors.
|
|
||||||
PROJECT_SOURCE_DIRS = $(sort $(dir $(PROJECT_SOURCE_FILES)))
|
|
||||||
|
|
||||||
# Android app configuration variables
|
|
||||||
APP_LABEL_NAME ?= rGame
|
|
||||||
APP_COMPANY_NAME ?= raylib
|
|
||||||
APP_PRODUCT_NAME ?= rgame
|
|
||||||
APP_VERSION_CODE ?= 1
|
|
||||||
APP_VERSION_NAME ?= 1.0
|
|
||||||
APP_ICON_LDPI ?= $(RAYLIB_PATH)\logo\raylib_36x36.png
|
|
||||||
APP_ICON_MDPI ?= $(RAYLIB_PATH)\logo\raylib_48x48.png
|
|
||||||
APP_ICON_HDPI ?= $(RAYLIB_PATH)\logo\raylib_72x72.png
|
|
||||||
APP_SCREEN_ORIENTATION ?= landscape
|
|
||||||
APP_KEYSTORE_PASS ?= raylib
|
|
||||||
|
|
||||||
# Library type used for raylib: STATIC (.a) or SHARED (.so/.dll)
|
|
||||||
RAYLIB_LIBTYPE ?= STATIC
|
|
||||||
|
|
||||||
# Library path for libraylib.a/libraylib.so
|
|
||||||
RAYLIB_LIB_PATH = $(RAYLIB_PATH)\src
|
|
||||||
|
|
||||||
# Shared libs must be added to APK if required
|
|
||||||
# NOTE: Generated NativeLoader.java automatically load those libraries
|
|
||||||
ifeq ($(RAYLIB_LIBTYPE),SHARED)
|
|
||||||
PROJECT_SHARED_LIBS = lib/$(ANDROID_ARCH_NAME)/libraylib.so
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Compiler and archiver
|
|
||||||
# NOTE: GCC is being deprecated in Android NDK r16
|
|
||||||
ifeq ($(ANDROID_ARCH),ARM)
|
|
||||||
CC = $(ANDROID_TOOLCHAIN)/bin/arm-linux-androideabi-clang
|
|
||||||
AR = $(ANDROID_TOOLCHAIN)/bin/arm-linux-androideabi-ar
|
|
||||||
endif
|
|
||||||
ifeq ($(ANDROID_ARCH),ARM64)
|
|
||||||
CC = $(ANDROID_TOOLCHAIN)/bin/aarch64-linux-android-clang
|
|
||||||
AR = $(ANDROID_TOOLCHAIN)/bin/aarch64-linux-android-ar
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Compiler flags for arquitecture
|
|
||||||
ifeq ($(ANDROID_ARCH),ARM)
|
|
||||||
CFLAGS = -std=c99 -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16
|
|
||||||
endif
|
|
||||||
ifeq ($(ANDROID_ARCH),ARM64)
|
|
||||||
CFLAGS = -std=c99 -target aarch64 -mfix-cortex-a53-835769
|
|
||||||
endif
|
|
||||||
# Compilation functions attributes options
|
|
||||||
CFLAGS += -ffunction-sections -funwind-tables -fstack-protector-strong -fPIC
|
|
||||||
# Compiler options for the linker
|
|
||||||
CFLAGS += -Wall -Wa,--noexecstack -Wformat -Werror=format-security -no-canonical-prefixes
|
|
||||||
# Preprocessor macro definitions
|
|
||||||
CFLAGS += -DANDROID -DPLATFORM_ANDROID -D__ANDROID_API__=$(ANDROID_API_VERSION)
|
|
||||||
|
|
||||||
# Paths containing required header files
|
|
||||||
INCLUDE_PATHS = -I. -I$(RAYLIB_PATH)/src -I$(RAYLIB_PATH)/src/external/android/native_app_glue
|
|
||||||
|
|
||||||
# Linker options
|
|
||||||
LDFLAGS = -Wl,-soname,lib$(PROJECT_LIBRARY_NAME).so -Wl,--exclude-libs,libatomic.a
|
|
||||||
LDFLAGS += -Wl,--build-id -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--warn-shared-textrel -Wl,--fatal-warnings
|
|
||||||
# Force linking of library module to define symbol
|
|
||||||
LDFLAGS += -u ANativeActivity_onCreate
|
|
||||||
# Library paths containing required libs
|
|
||||||
LDFLAGS += -L. -L$(PROJECT_BUILD_PATH)/obj -L$(PROJECT_BUILD_PATH)/lib/$(ANDROID_ARCH_NAME) -L$(ANDROID_TOOLCHAIN)\sysroot\usr\lib
|
|
||||||
|
|
||||||
# Define any libraries to link into executable
|
|
||||||
# if you want to link libraries (libname.so or libname.a), use the -lname
|
|
||||||
LDLIBS = -lm -lc -lraylib -llog -landroid -lEGL -lGLESv2 -lOpenSLES -ldl
|
|
||||||
|
|
||||||
# Generate target objects list from PROJECT_SOURCE_FILES
|
|
||||||
OBJS = $(patsubst %.c, $(PROJECT_BUILD_PATH)/obj/%.o, $(PROJECT_SOURCE_FILES))
|
|
||||||
|
|
||||||
# Android APK building process... some steps required...
|
|
||||||
# NOTE: typing 'make' will invoke the default target entry called 'all',
|
|
||||||
all: create_temp_project_dirs \
|
|
||||||
copy_project_required_libs \
|
|
||||||
copy_project_resources \
|
|
||||||
generate_loader_script \
|
|
||||||
generate_android_manifest \
|
|
||||||
generate_apk_keystore \
|
|
||||||
config_project_package \
|
|
||||||
compile_project_code \
|
|
||||||
compile_project_class \
|
|
||||||
compile_project_class_dex \
|
|
||||||
create_project_apk_package \
|
|
||||||
sign_project_apk_package \
|
|
||||||
zipalign_project_apk_package
|
|
||||||
|
|
||||||
# Create required temp directories for APK building
|
|
||||||
create_temp_project_dirs:
|
|
||||||
if not exist $(PROJECT_BUILD_PATH) mkdir $(PROJECT_BUILD_PATH)
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\obj mkdir $(PROJECT_BUILD_PATH)\obj
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\src mkdir $(PROJECT_BUILD_PATH)\src
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\src\com mkdir $(PROJECT_BUILD_PATH)\src\com
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\src\com\$(APP_COMPANY_NAME) mkdir $(PROJECT_BUILD_PATH)\src\com\$(APP_COMPANY_NAME)
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\src\com\$(APP_COMPANY_NAME)\$(APP_PRODUCT_NAME) mkdir $(PROJECT_BUILD_PATH)\src\com\$(APP_COMPANY_NAME)\$(APP_PRODUCT_NAME)
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\lib mkdir $(PROJECT_BUILD_PATH)\lib
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\lib\$(ANDROID_ARCH_NAME) mkdir $(PROJECT_BUILD_PATH)\lib\$(ANDROID_ARCH_NAME)
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\bin mkdir $(PROJECT_BUILD_PATH)\bin
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\res mkdir $(PROJECT_BUILD_PATH)\res
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\res\drawable-ldpi mkdir $(PROJECT_BUILD_PATH)\res\drawable-ldpi
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\res\drawable-mdpi mkdir $(PROJECT_BUILD_PATH)\res\drawable-mdpi
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\res\drawable-hdpi mkdir $(PROJECT_BUILD_PATH)\res\drawable-hdpi
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\res\values mkdir $(PROJECT_BUILD_PATH)\res\values
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\assets mkdir $(PROJECT_BUILD_PATH)\assets
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\assets\$(PROJECT_RESOURCES_PATH) mkdir $(PROJECT_BUILD_PATH)\assets\$(PROJECT_RESOURCES_PATH)
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\obj\screens mkdir $(PROJECT_BUILD_PATH)\obj\screens
|
|
||||||
$(foreach dir, $(PROJECT_SOURCE_DIRS), $(call create_dir, $(dir)))
|
|
||||||
|
|
||||||
define create_dir
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\obj\$(1) mkdir $(PROJECT_BUILD_PATH)\obj\$(1)
|
|
||||||
endef
|
|
||||||
|
|
||||||
# Copy required shared libs for integration into APK
|
|
||||||
# NOTE: If using shared libs they are loaded by generated NativeLoader.java
|
|
||||||
copy_project_required_libs:
|
|
||||||
ifeq ($(RAYLIB_LIBTYPE),SHARED)
|
|
||||||
copy /Y $(RAYLIB_LIB_PATH)\libraylib.so $(PROJECT_BUILD_PATH)\lib\$(ANDROID_ARCH_NAME)\libraylib.so
|
|
||||||
endif
|
|
||||||
ifeq ($(RAYLIB_LIBTYPE),STATIC)
|
|
||||||
copy /Y $(RAYLIB_LIB_PATH)\libraylib.a $(PROJECT_BUILD_PATH)\lib\$(ANDROID_ARCH_NAME)\libraylib.a
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Copy project required resources: strings.xml, icon.png, assets
|
|
||||||
# NOTE: Required strings.xml is generated and game resources are copied to assets folder
|
|
||||||
# TODO: Review xcopy usage, it can not be found in some systems!
|
|
||||||
copy_project_resources:
|
|
||||||
copy $(APP_ICON_LDPI) $(PROJECT_BUILD_PATH)\res\drawable-ldpi\icon.png /Y
|
|
||||||
copy $(APP_ICON_MDPI) $(PROJECT_BUILD_PATH)\res\drawable-mdpi\icon.png /Y
|
|
||||||
copy $(APP_ICON_HDPI) $(PROJECT_BUILD_PATH)\res\drawable-hdpi\icon.png /Y
|
|
||||||
@echo ^<?xml version="1.0" encoding="utf-8"^?^> > $(PROJECT_BUILD_PATH)/res/values/strings.xml
|
|
||||||
@echo ^<resources^>^<string name="app_name"^>$(APP_LABEL_NAME)^</string^>^</resources^> >> $(PROJECT_BUILD_PATH)/res/values/strings.xml
|
|
||||||
if exist $(PROJECT_RESOURCES_PATH) C:\Windows\System32\xcopy $(PROJECT_RESOURCES_PATH) $(PROJECT_BUILD_PATH)\assets\$(PROJECT_RESOURCES_PATH) /Y /E /F
|
|
||||||
|
|
||||||
# Generate NativeLoader.java to load required shared libraries
|
|
||||||
# NOTE: Probably not the bet way to generate this file... but it works.
|
|
||||||
generate_loader_script:
|
|
||||||
@echo package com.$(APP_COMPANY_NAME).$(APP_PRODUCT_NAME); > $(PROJECT_BUILD_PATH)/src/com/$(APP_COMPANY_NAME)/$(APP_PRODUCT_NAME)/NativeLoader.java
|
|
||||||
@echo. >> $(PROJECT_BUILD_PATH)/src/com/$(APP_COMPANY_NAME)/$(APP_PRODUCT_NAME)/NativeLoader.java
|
|
||||||
@echo public class NativeLoader extends android.app.NativeActivity { >> $(PROJECT_BUILD_PATH)/src/com/$(APP_COMPANY_NAME)/$(APP_PRODUCT_NAME)/NativeLoader.java
|
|
||||||
@echo static { >> $(PROJECT_BUILD_PATH)/src/com/$(APP_COMPANY_NAME)/$(APP_PRODUCT_NAME)/NativeLoader.java
|
|
||||||
ifeq ($(RAYLIB_LIBTYPE),SHARED)
|
|
||||||
@echo System.loadLibrary("raylib"); >> $(PROJECT_BUILD_PATH)/src/com/$(APP_COMPANY_NAME)/$(APP_PRODUCT_NAME)/NativeLoader.java
|
|
||||||
endif
|
|
||||||
@echo System.loadLibrary("$(PROJECT_LIBRARY_NAME)"); >> $(PROJECT_BUILD_PATH)/src/com/$(APP_COMPANY_NAME)/$(APP_PRODUCT_NAME)/NativeLoader.java
|
|
||||||
@echo } >> $(PROJECT_BUILD_PATH)/src/com/$(APP_COMPANY_NAME)/$(APP_PRODUCT_NAME)/NativeLoader.java
|
|
||||||
@echo } >> $(PROJECT_BUILD_PATH)/src/com/$(APP_COMPANY_NAME)/$(APP_PRODUCT_NAME)/NativeLoader.java
|
|
||||||
|
|
||||||
# Generate AndroidManifest.xml with all the required options
|
|
||||||
# NOTE: Probably not the bet way to generate this file... but it works.
|
|
||||||
generate_android_manifest:
|
|
||||||
@echo ^<?xml version="1.0" encoding="utf-8"^?^> > $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo ^<manifest xmlns:android="http://schemas.android.com/apk/res/android" >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo package="com.$(APP_COMPANY_NAME).$(APP_PRODUCT_NAME)" >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo android:versionCode="$(APP_VERSION_CODE)" android:versionName="$(APP_VERSION_NAME)" ^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo ^<uses-sdk android:minSdkVersion="$(ANDROID_API_VERSION)" /^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo ^<uses-feature android:glEsVersion="0x00020000" android:required="true" /^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo ^<application android:allowBackup="false" android:label="@string/app_name" android:icon="@drawable/icon" ^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo ^<activity android:name="com.$(APP_COMPANY_NAME).$(APP_PRODUCT_NAME).NativeLoader" >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo android:configChanges="orientation|keyboardHidden|screenSize" >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo android:screenOrientation="$(APP_SCREEN_ORIENTATION)" android:launchMode="singleTask" >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo android:clearTaskOnLaunch="true"^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo ^<meta-data android:name="android.app.lib_name" android:value="$(PROJECT_LIBRARY_NAME)" /^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo ^<intent-filter^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo ^<action android:name="android.intent.action.MAIN" /^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo ^<category android:name="android.intent.category.LAUNCHER" /^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo ^</intent-filter^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo ^</activity^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo ^</application^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo ^</manifest^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
|
|
||||||
# Generate storekey for APK signing: $(PROJECT_NAME).keystore
|
|
||||||
# NOTE: Configure here your Distinguished Names (-dname) if required!
|
|
||||||
generate_apk_keystore:
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)/$(PROJECT_NAME).keystore $(JAVA_HOME)/bin/keytool -genkeypair -validity 1000 -dname "CN=$(APP_COMPANY_NAME),O=Android,C=ES" -keystore $(PROJECT_BUILD_PATH)/$(PROJECT_NAME).keystore -storepass $(APP_KEYSTORE_PASS) -keypass $(APP_KEYSTORE_PASS) -alias $(PROJECT_NAME)Key -keyalg RSA
|
|
||||||
|
|
||||||
# Config project package and resource using AndroidManifest.xml and res/values/strings.xml
|
|
||||||
# NOTE: Generates resources file: src/com/$(APP_COMPANY_NAME)/$(APP_PRODUCT_NAME)/R.java
|
|
||||||
config_project_package:
|
|
||||||
$(ANDROID_BUILD_TOOLS)/aapt package -f -m -S $(PROJECT_BUILD_PATH)/res -J $(PROJECT_BUILD_PATH)/src -M $(PROJECT_BUILD_PATH)/AndroidManifest.xml -I $(ANDROID_HOME)/platforms/android-$(ANDROID_API_VERSION)/android.jar
|
|
||||||
|
|
||||||
# Compile native_app_glue code as static library: obj/libnative_app_glue.a
|
|
||||||
compile_native_app_glue:
|
|
||||||
$(CC) -c $(RAYLIB_PATH)/src/external/android/native_app_glue/android_native_app_glue.c -o $(PROJECT_BUILD_PATH)/obj/native_app_glue.o $(CFLAGS)
|
|
||||||
$(AR) rcs $(PROJECT_BUILD_PATH)/obj/libnative_app_glue.a $(PROJECT_BUILD_PATH)/obj/native_app_glue.o
|
|
||||||
|
|
||||||
# Compile project code into a shared library: lib/lib$(PROJECT_LIBRARY_NAME).so
|
|
||||||
compile_project_code: $(OBJS)
|
|
||||||
$(CC) -o $(PROJECT_BUILD_PATH)/lib/$(ANDROID_ARCH_NAME)/lib$(PROJECT_LIBRARY_NAME).so $(OBJS) -shared $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS)
|
|
||||||
|
|
||||||
# Compile all .c files required into object (.o) files
|
|
||||||
# NOTE: Those files will be linked into a shared library
|
|
||||||
$(PROJECT_BUILD_PATH)/obj/%.o:%.c
|
|
||||||
$(CC) -c $^ -o $@ $(INCLUDE_PATHS) $(CFLAGS) --sysroot=$(ANDROID_TOOLCHAIN)/sysroot
|
|
||||||
|
|
||||||
# Compile project .java code into .class (Java bytecode)
|
|
||||||
compile_project_class:
|
|
||||||
$(JAVA_HOME)/bin/javac -verbose -source 1.7 -target 1.7 -d $(PROJECT_BUILD_PATH)/obj -bootclasspath $(JAVA_HOME)/jre/lib/rt.jar -classpath $(ANDROID_HOME)/platforms/android-$(ANDROID_API_VERSION)/android.jar;$(PROJECT_BUILD_PATH)/obj -sourcepath $(PROJECT_BUILD_PATH)/src $(PROJECT_BUILD_PATH)/src/com/$(APP_COMPANY_NAME)/$(APP_PRODUCT_NAME)/R.java $(PROJECT_BUILD_PATH)/src/com/$(APP_COMPANY_NAME)/$(APP_PRODUCT_NAME)/NativeLoader.java
|
|
||||||
|
|
||||||
# Compile .class files into Dalvik executable bytecode (.dex)
|
|
||||||
# NOTE: Since Android 5.0, Dalvik interpreter (JIT) has been replaced by ART (AOT)
|
|
||||||
compile_project_class_dex:
|
|
||||||
$(ANDROID_BUILD_TOOLS)/dx --verbose --dex --output=$(PROJECT_BUILD_PATH)/bin/classes.dex $(PROJECT_BUILD_PATH)/obj
|
|
||||||
|
|
||||||
# Create Android APK package: bin/$(PROJECT_NAME).unsigned.apk
|
|
||||||
# NOTE: Requires compiled classes.dex and lib$(PROJECT_LIBRARY_NAME).so
|
|
||||||
# NOTE: Use -A resources to define additional directory in which to find raw asset files
|
|
||||||
create_project_apk_package:
|
|
||||||
$(ANDROID_BUILD_TOOLS)/aapt package -f -M $(PROJECT_BUILD_PATH)/AndroidManifest.xml -S $(PROJECT_BUILD_PATH)/res -A $(PROJECT_BUILD_PATH)/assets -I $(ANDROID_HOME)/platforms/android-$(ANDROID_API_VERSION)/android.jar -F $(PROJECT_BUILD_PATH)/bin/$(PROJECT_NAME).unsigned.apk $(PROJECT_BUILD_PATH)/bin
|
|
||||||
cd $(PROJECT_BUILD_PATH) && $(ANDROID_BUILD_TOOLS)/aapt add bin/$(PROJECT_NAME).unsigned.apk lib/$(ANDROID_ARCH_NAME)/lib$(PROJECT_LIBRARY_NAME).so $(PROJECT_SHARED_LIBS)
|
|
||||||
|
|
||||||
# Create signed APK package using generated Key: bin/$(PROJECT_NAME).signed.apk
|
|
||||||
sign_project_apk_package:
|
|
||||||
$(JAVA_HOME)/bin/jarsigner -keystore $(PROJECT_BUILD_PATH)/$(PROJECT_NAME).keystore -storepass $(APP_KEYSTORE_PASS) -keypass $(APP_KEYSTORE_PASS) -signedjar $(PROJECT_BUILD_PATH)/bin/$(PROJECT_NAME).signed.apk $(PROJECT_BUILD_PATH)/bin/$(PROJECT_NAME).unsigned.apk $(PROJECT_NAME)Key
|
|
||||||
|
|
||||||
# Create zip-aligned APK package: $(PROJECT_NAME).apk
|
|
||||||
zipalign_project_apk_package:
|
|
||||||
$(ANDROID_BUILD_TOOLS)/zipalign -f 4 $(PROJECT_BUILD_PATH)/bin/$(PROJECT_NAME).signed.apk $(PROJECT_NAME).apk
|
|
||||||
|
|
||||||
# Install $(PROJECT_NAME).apk to default emulator/device
|
|
||||||
# NOTE: Use -e (emulator) or -d (device) parameters if required
|
|
||||||
install:
|
|
||||||
$(ANDROID_PLATFORM_TOOLS)/adb install --abi $(ANDROID_ARCH_NAME) -rds $(PROJECT_NAME).apk
|
|
||||||
|
|
||||||
# Check supported ABI for the device (armeabi-v7a, arm64-v8a, x86, x86_64)
|
|
||||||
check_device_abi:
|
|
||||||
$(ANDROID_PLATFORM_TOOLS)/adb shell getprop ro.product.cpu.abi
|
|
||||||
|
|
||||||
# Monitorize output log coming from device, only raylib tag
|
|
||||||
logcat:
|
|
||||||
$(ANDROID_PLATFORM_TOOLS)/adb logcat -c
|
|
||||||
$(ANDROID_PLATFORM_TOOLS)/adb logcat raylib:V *:S
|
|
||||||
|
|
||||||
# Install and monitorize $(PROJECT_NAME).apk to default emulator/device
|
|
||||||
deploy:
|
|
||||||
$(ANDROID_PLATFORM_TOOLS)/adb install -r $(PROJECT_NAME).apk
|
|
||||||
$(ANDROID_PLATFORM_TOOLS)/adb logcat -c
|
|
||||||
$(ANDROID_PLATFORM_TOOLS)/adb logcat raylib:V *:S
|
|
||||||
|
|
||||||
#$(ANDROID_PLATFORM_TOOLS)/adb logcat *:W
|
|
||||||
|
|
||||||
# Clean everything
|
|
||||||
clean:
|
|
||||||
del $(PROJECT_BUILD_PATH)\* /f /s /q
|
|
||||||
rmdir $(PROJECT_BUILD_PATH) /s /q
|
|
||||||
@echo Cleaning done
|
|
||||||
323
games/arkanoid.c
323
games/arkanoid.c
|
|
@ -1,323 +0,0 @@
|
||||||
/*******************************************************************************************
|
|
||||||
*
|
|
||||||
* raylib - sample game: arkanoid
|
|
||||||
*
|
|
||||||
* Sample game Marc Palau and Ramon Santamaria
|
|
||||||
*
|
|
||||||
* This game has been created using raylib v1.3 (www.raylib.com)
|
|
||||||
* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
|
|
||||||
*
|
|
||||||
* Copyright (c) 2015 Ramon Santamaria (@raysan5)
|
|
||||||
*
|
|
||||||
********************************************************************************************/
|
|
||||||
|
|
||||||
#include "raylib.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#if defined(PLATFORM_WEB)
|
|
||||||
#include <emscripten/emscripten.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
// Some Defines
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
#define PLAYER_MAX_LIFE 5
|
|
||||||
#define LINES_OF_BRICKS 5
|
|
||||||
#define BRICKS_PER_LINE 20
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
// Types and Structures Definition
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
typedef enum GameScreen { LOGO, TITLE, GAMEPLAY, ENDING } GameScreen;
|
|
||||||
|
|
||||||
typedef struct Player {
|
|
||||||
Vector2 position;
|
|
||||||
Vector2 size;
|
|
||||||
int life;
|
|
||||||
} Player;
|
|
||||||
|
|
||||||
typedef struct Ball {
|
|
||||||
Vector2 position;
|
|
||||||
Vector2 speed;
|
|
||||||
int radius;
|
|
||||||
bool active;
|
|
||||||
} Ball;
|
|
||||||
|
|
||||||
typedef struct Brick {
|
|
||||||
Vector2 position;
|
|
||||||
bool active;
|
|
||||||
} Brick;
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
// Global Variables Declaration
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
static const int screenWidth = 800;
|
|
||||||
static const int screenHeight = 450;
|
|
||||||
|
|
||||||
static bool gameOver = false;
|
|
||||||
static bool pause = false;
|
|
||||||
|
|
||||||
static Player player = { 0 };
|
|
||||||
static Ball ball = { 0 };
|
|
||||||
static Brick brick[LINES_OF_BRICKS][BRICKS_PER_LINE] = { 0 };
|
|
||||||
static Vector2 brickSize = { 0 };
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
// Module Functions Declaration (local)
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
static void InitGame(void); // Initialize game
|
|
||||||
static void UpdateGame(void); // Update game (one frame)
|
|
||||||
static void DrawGame(void); // Draw game (one frame)
|
|
||||||
static void UnloadGame(void); // Unload game
|
|
||||||
static void UpdateDrawFrame(void); // Update and Draw (one frame)
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
// Program main entry point
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
// Initialization (Note windowTitle is unused on Android)
|
|
||||||
//---------------------------------------------------------
|
|
||||||
InitWindow(screenWidth, screenHeight, "sample game: arkanoid");
|
|
||||||
|
|
||||||
InitGame();
|
|
||||||
|
|
||||||
#if defined(PLATFORM_WEB)
|
|
||||||
emscripten_set_main_loop(UpdateDrawFrame, 0, 1);
|
|
||||||
#else
|
|
||||||
SetTargetFPS(60);
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Main game loop
|
|
||||||
while (!WindowShouldClose()) // Detect window close button or ESC key
|
|
||||||
{
|
|
||||||
// Update and Draw
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
UpdateDrawFrame();
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
// De-Initialization
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
UnloadGame(); // Unload loaded data (textures, sounds, models...)
|
|
||||||
|
|
||||||
CloseWindow(); // Close window and OpenGL context
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
// Module Functions Definitions (local)
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Initialize game variables
|
|
||||||
void InitGame(void)
|
|
||||||
{
|
|
||||||
brickSize = (Vector2){ GetScreenWidth()/BRICKS_PER_LINE, 40 };
|
|
||||||
|
|
||||||
// Initialize player
|
|
||||||
player.position = (Vector2){ screenWidth/2, screenHeight*7/8 };
|
|
||||||
player.size = (Vector2){ screenWidth/10, 20 };
|
|
||||||
player.life = PLAYER_MAX_LIFE;
|
|
||||||
|
|
||||||
// Initialize ball
|
|
||||||
ball.position = (Vector2){ screenWidth/2, screenHeight*7/8 - 30 };
|
|
||||||
ball.speed = (Vector2){ 0, 0 };
|
|
||||||
ball.radius = 7;
|
|
||||||
ball.active = false;
|
|
||||||
|
|
||||||
// Initialize bricks
|
|
||||||
int initialDownPosition = 50;
|
|
||||||
|
|
||||||
for (int i = 0; i < LINES_OF_BRICKS; i++)
|
|
||||||
{
|
|
||||||
for (int j = 0; j < BRICKS_PER_LINE; j++)
|
|
||||||
{
|
|
||||||
brick[i][j].position = (Vector2){ j*brickSize.x + brickSize.x/2, i*brickSize.y + initialDownPosition };
|
|
||||||
brick[i][j].active = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update game (one frame)
|
|
||||||
void UpdateGame(void)
|
|
||||||
{
|
|
||||||
if (!gameOver)
|
|
||||||
{
|
|
||||||
if (IsKeyPressed('P')) pause = !pause;
|
|
||||||
|
|
||||||
if (!pause)
|
|
||||||
{
|
|
||||||
// Player movement logic
|
|
||||||
if (IsKeyDown(KEY_LEFT)) player.position.x -= 5;
|
|
||||||
if ((player.position.x - player.size.x/2) <= 0) player.position.x = player.size.x/2;
|
|
||||||
if (IsKeyDown(KEY_RIGHT)) player.position.x += 5;
|
|
||||||
if ((player.position.x + player.size.x/2) >= screenWidth) player.position.x = screenWidth - player.size.x/2;
|
|
||||||
|
|
||||||
// Ball launching logic
|
|
||||||
if (!ball.active)
|
|
||||||
{
|
|
||||||
if (IsKeyPressed(KEY_SPACE))
|
|
||||||
{
|
|
||||||
ball.active = true;
|
|
||||||
ball.speed = (Vector2){ 0, -5 };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ball movement logic
|
|
||||||
if (ball.active)
|
|
||||||
{
|
|
||||||
ball.position.x += ball.speed.x;
|
|
||||||
ball.position.y += ball.speed.y;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ball.position = (Vector2){ player.position.x, screenHeight*7/8 - 30 };
|
|
||||||
}
|
|
||||||
|
|
||||||
// Collision logic: ball vs walls
|
|
||||||
if (((ball.position.x + ball.radius) >= screenWidth) || ((ball.position.x - ball.radius) <= 0)) ball.speed.x *= -1;
|
|
||||||
if ((ball.position.y - ball.radius) <= 0) ball.speed.y *= -1;
|
|
||||||
if ((ball.position.y + ball.radius) >= screenHeight)
|
|
||||||
{
|
|
||||||
ball.speed = (Vector2){ 0, 0 };
|
|
||||||
ball.active = false;
|
|
||||||
|
|
||||||
player.life--;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Collision logic: ball vs player
|
|
||||||
if (CheckCollisionCircleRec(ball.position, ball.radius,
|
|
||||||
(Rectangle){ player.position.x - player.size.x/2, player.position.y - player.size.y/2, player.size.x, player.size.y}))
|
|
||||||
{
|
|
||||||
if (ball.speed.y > 0)
|
|
||||||
{
|
|
||||||
ball.speed.y *= -1;
|
|
||||||
ball.speed.x = (ball.position.x - player.position.x)/(player.size.x/2)*5;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Collision logic: ball vs bricks
|
|
||||||
for (int i = 0; i < LINES_OF_BRICKS; i++)
|
|
||||||
{
|
|
||||||
for (int j = 0; j < BRICKS_PER_LINE; j++)
|
|
||||||
{
|
|
||||||
if (brick[i][j].active)
|
|
||||||
{
|
|
||||||
// Hit below
|
|
||||||
if (((ball.position.y - ball.radius) <= (brick[i][j].position.y + brickSize.y/2)) &&
|
|
||||||
((ball.position.y - ball.radius) > (brick[i][j].position.y + brickSize.y/2 + ball.speed.y)) &&
|
|
||||||
((fabs(ball.position.x - brick[i][j].position.x)) < (brickSize.x/2 + ball.radius*2/3)) && (ball.speed.y < 0))
|
|
||||||
{
|
|
||||||
brick[i][j].active = false;
|
|
||||||
ball.speed.y *= -1;
|
|
||||||
}
|
|
||||||
// Hit above
|
|
||||||
else if (((ball.position.y + ball.radius) >= (brick[i][j].position.y - brickSize.y/2)) &&
|
|
||||||
((ball.position.y + ball.radius) < (brick[i][j].position.y - brickSize.y/2 + ball.speed.y)) &&
|
|
||||||
((fabs(ball.position.x - brick[i][j].position.x)) < (brickSize.x/2 + ball.radius*2/3)) && (ball.speed.y > 0))
|
|
||||||
{
|
|
||||||
brick[i][j].active = false;
|
|
||||||
ball.speed.y *= -1;
|
|
||||||
}
|
|
||||||
// Hit left
|
|
||||||
else if (((ball.position.x + ball.radius) >= (brick[i][j].position.x - brickSize.x/2)) &&
|
|
||||||
((ball.position.x + ball.radius) < (brick[i][j].position.x - brickSize.x/2 + ball.speed.x)) &&
|
|
||||||
((fabs(ball.position.y - brick[i][j].position.y)) < (brickSize.y/2 + ball.radius*2/3)) && (ball.speed.x > 0))
|
|
||||||
{
|
|
||||||
brick[i][j].active = false;
|
|
||||||
ball.speed.x *= -1;
|
|
||||||
}
|
|
||||||
// Hit right
|
|
||||||
else if (((ball.position.x - ball.radius) <= (brick[i][j].position.x + brickSize.x/2)) &&
|
|
||||||
((ball.position.x - ball.radius) > (brick[i][j].position.x + brickSize.x/2 + ball.speed.x)) &&
|
|
||||||
((fabs(ball.position.y - brick[i][j].position.y)) < (brickSize.y/2 + ball.radius*2/3)) && (ball.speed.x < 0))
|
|
||||||
{
|
|
||||||
brick[i][j].active = false;
|
|
||||||
ball.speed.x *= -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Game over logic
|
|
||||||
if (player.life <= 0) gameOver = true;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
gameOver = true;
|
|
||||||
|
|
||||||
for (int i = 0; i < LINES_OF_BRICKS; i++)
|
|
||||||
{
|
|
||||||
for (int j = 0; j < BRICKS_PER_LINE; j++)
|
|
||||||
{
|
|
||||||
if (brick[i][j].active) gameOver = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (IsKeyPressed(KEY_ENTER))
|
|
||||||
{
|
|
||||||
InitGame();
|
|
||||||
gameOver = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Draw game (one frame)
|
|
||||||
void DrawGame(void)
|
|
||||||
{
|
|
||||||
BeginDrawing();
|
|
||||||
|
|
||||||
ClearBackground(RAYWHITE);
|
|
||||||
|
|
||||||
if (!gameOver)
|
|
||||||
{
|
|
||||||
// Draw player bar
|
|
||||||
DrawRectangle(player.position.x - player.size.x/2, player.position.y - player.size.y/2, player.size.x, player.size.y, BLACK);
|
|
||||||
|
|
||||||
// Draw player lives
|
|
||||||
for (int i = 0; i < player.life; i++) DrawRectangle(20 + 40*i, screenHeight - 30, 35, 10, LIGHTGRAY);
|
|
||||||
|
|
||||||
// Draw ball
|
|
||||||
DrawCircleV(ball.position, ball.radius, MAROON);
|
|
||||||
|
|
||||||
// Draw bricks
|
|
||||||
for (int i = 0; i < LINES_OF_BRICKS; i++)
|
|
||||||
{
|
|
||||||
for (int j = 0; j < BRICKS_PER_LINE; j++)
|
|
||||||
{
|
|
||||||
if (brick[i][j].active)
|
|
||||||
{
|
|
||||||
if ((i + j) % 2 == 0) DrawRectangle(brick[i][j].position.x - brickSize.x/2, brick[i][j].position.y - brickSize.y/2, brickSize.x, brickSize.y, GRAY);
|
|
||||||
else DrawRectangle(brick[i][j].position.x - brickSize.x/2, brick[i][j].position.y - brickSize.y/2, brickSize.x, brickSize.y, DARKGRAY);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pause) DrawText("GAME PAUSED", screenWidth/2 - MeasureText("GAME PAUSED", 40)/2, screenHeight/2 - 40, 40, GRAY);
|
|
||||||
}
|
|
||||||
else DrawText("PRESS [ENTER] TO PLAY AGAIN", GetScreenWidth()/2 - MeasureText("PRESS [ENTER] TO PLAY AGAIN", 20)/2, GetScreenHeight()/2 - 50, 20, GRAY);
|
|
||||||
|
|
||||||
EndDrawing();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unload game variables
|
|
||||||
void UnloadGame(void)
|
|
||||||
{
|
|
||||||
// TODO: Unload all dynamic loaded data (textures, sounds, models...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update and Draw (one frame)
|
|
||||||
void UpdateDrawFrame(void)
|
|
||||||
{
|
|
||||||
UpdateGame();
|
|
||||||
DrawGame();
|
|
||||||
}
|
|
||||||
|
|
@ -1,565 +0,0 @@
|
||||||
/*******************************************************************************************
|
|
||||||
*
|
|
||||||
* raylib - sample game: asteroids
|
|
||||||
*
|
|
||||||
* Sample game developed by Ian Eito, Albert Martos and Ramon Santamaria
|
|
||||||
*
|
|
||||||
* This game has been created using raylib v1.3 (www.raylib.com)
|
|
||||||
* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
|
|
||||||
*
|
|
||||||
* Copyright (c) 2015 Ramon Santamaria (@raysan5)
|
|
||||||
*
|
|
||||||
********************************************************************************************/
|
|
||||||
|
|
||||||
#include "raylib.h"
|
|
||||||
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#if defined(PLATFORM_WEB)
|
|
||||||
#include <emscripten/emscripten.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
// Some Defines
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
#define PLAYER_BASE_SIZE 20.0f
|
|
||||||
#define PLAYER_SPEED 6.0f
|
|
||||||
#define PLAYER_MAX_SHOOTS 10
|
|
||||||
|
|
||||||
#define METEORS_SPEED 2
|
|
||||||
#define MAX_BIG_METEORS 4
|
|
||||||
#define MAX_MEDIUM_METEORS 8
|
|
||||||
#define MAX_SMALL_METEORS 16
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
// Types and Structures Definition
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
typedef struct Player {
|
|
||||||
Vector2 position;
|
|
||||||
Vector2 speed;
|
|
||||||
float acceleration;
|
|
||||||
float rotation;
|
|
||||||
Vector3 collider;
|
|
||||||
Color color;
|
|
||||||
} Player;
|
|
||||||
|
|
||||||
typedef struct Shoot {
|
|
||||||
Vector2 position;
|
|
||||||
Vector2 speed;
|
|
||||||
float radius;
|
|
||||||
float rotation;
|
|
||||||
int lifeSpawn;
|
|
||||||
bool active;
|
|
||||||
Color color;
|
|
||||||
} Shoot;
|
|
||||||
|
|
||||||
typedef struct Meteor {
|
|
||||||
Vector2 position;
|
|
||||||
Vector2 speed;
|
|
||||||
float radius;
|
|
||||||
bool active;
|
|
||||||
Color color;
|
|
||||||
} Meteor;
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
// Global Variables Declaration
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
static const int screenWidth = 800;
|
|
||||||
static const int screenHeight = 450;
|
|
||||||
|
|
||||||
static bool gameOver = false;
|
|
||||||
static bool pause = false;
|
|
||||||
static bool victory = false;
|
|
||||||
|
|
||||||
// NOTE: Defined triangle is isosceles with common angles of 70 degrees.
|
|
||||||
static float shipHeight = 0.0f;
|
|
||||||
|
|
||||||
static Player player = { 0 };
|
|
||||||
static Shoot shoot[PLAYER_MAX_SHOOTS] = { 0 };
|
|
||||||
static Meteor bigMeteor[MAX_BIG_METEORS] = { 0 };
|
|
||||||
static Meteor mediumMeteor[MAX_MEDIUM_METEORS] = { 0 };
|
|
||||||
static Meteor smallMeteor[MAX_SMALL_METEORS] = { 0 };
|
|
||||||
|
|
||||||
static int midMeteorsCount = 0;
|
|
||||||
static int smallMeteorsCount = 0;
|
|
||||||
static int destroyedMeteorsCount = 0;
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
// Module Functions Declaration (local)
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
static void InitGame(void); // Initialize game
|
|
||||||
static void UpdateGame(void); // Update game (one frame)
|
|
||||||
static void DrawGame(void); // Draw game (one frame)
|
|
||||||
static void UnloadGame(void); // Unload game
|
|
||||||
static void UpdateDrawFrame(void); // Update and Draw (one frame)
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
// Program main entry point
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
// Initialization (Note windowTitle is unused on Android)
|
|
||||||
//---------------------------------------------------------
|
|
||||||
InitWindow(screenWidth, screenHeight, "sample game: asteroids");
|
|
||||||
|
|
||||||
InitGame();
|
|
||||||
|
|
||||||
#if defined(PLATFORM_WEB)
|
|
||||||
emscripten_set_main_loop(UpdateDrawFrame, 0, 1);
|
|
||||||
#else
|
|
||||||
SetTargetFPS(60);
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Main game loop
|
|
||||||
while (!WindowShouldClose()) // Detect window close button or ESC key
|
|
||||||
{
|
|
||||||
// Update and Draw
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
UpdateDrawFrame();
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
// De-Initialization
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
UnloadGame(); // Unload loaded data (textures, sounds, models...)
|
|
||||||
|
|
||||||
CloseWindow(); // Close window and OpenGL context
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
// Module Functions Definitions (local)
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Initialize game variables
|
|
||||||
void InitGame(void)
|
|
||||||
{
|
|
||||||
int posx, posy;
|
|
||||||
int velx, vely;
|
|
||||||
bool correctRange = false;
|
|
||||||
victory = false;
|
|
||||||
pause = false;
|
|
||||||
|
|
||||||
shipHeight = (PLAYER_BASE_SIZE/2)/tanf(20*DEG2RAD);
|
|
||||||
|
|
||||||
// Initialization player
|
|
||||||
player.position = (Vector2){screenWidth/2, screenHeight/2 - shipHeight/2};
|
|
||||||
player.speed = (Vector2){0, 0};
|
|
||||||
player.acceleration = 0;
|
|
||||||
player.rotation = 0;
|
|
||||||
player.collider = (Vector3){player.position.x + sin(player.rotation*DEG2RAD)*(shipHeight/2.5f), player.position.y - cos(player.rotation*DEG2RAD)*(shipHeight/2.5f), 12};
|
|
||||||
player.color = LIGHTGRAY;
|
|
||||||
|
|
||||||
destroyedMeteorsCount = 0;
|
|
||||||
|
|
||||||
// Initialization shoot
|
|
||||||
for (int i = 0; i < PLAYER_MAX_SHOOTS; i++)
|
|
||||||
{
|
|
||||||
shoot[i].position = (Vector2){0, 0};
|
|
||||||
shoot[i].speed = (Vector2){0, 0};
|
|
||||||
shoot[i].radius = 2;
|
|
||||||
shoot[i].active = false;
|
|
||||||
shoot[i].lifeSpawn = 0;
|
|
||||||
shoot[i].color = WHITE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < MAX_BIG_METEORS; i++)
|
|
||||||
{
|
|
||||||
posx = GetRandomValue(0, screenWidth);
|
|
||||||
|
|
||||||
while(!correctRange)
|
|
||||||
{
|
|
||||||
if (posx > screenWidth/2 - 150 && posx < screenWidth/2 + 150) posx = GetRandomValue(0, screenWidth);
|
|
||||||
else correctRange = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
correctRange = false;
|
|
||||||
|
|
||||||
posy = GetRandomValue(0, screenHeight);
|
|
||||||
|
|
||||||
while(!correctRange)
|
|
||||||
{
|
|
||||||
if (posy > screenHeight/2 - 150 && posy < screenHeight/2 + 150) posy = GetRandomValue(0, screenHeight);
|
|
||||||
else correctRange = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bigMeteor[i].position = (Vector2){posx, posy};
|
|
||||||
|
|
||||||
correctRange = false;
|
|
||||||
velx = GetRandomValue(-METEORS_SPEED, METEORS_SPEED);
|
|
||||||
vely = GetRandomValue(-METEORS_SPEED, METEORS_SPEED);
|
|
||||||
|
|
||||||
while(!correctRange)
|
|
||||||
{
|
|
||||||
if (velx == 0 && vely == 0)
|
|
||||||
{
|
|
||||||
velx = GetRandomValue(-METEORS_SPEED, METEORS_SPEED);
|
|
||||||
vely = GetRandomValue(-METEORS_SPEED, METEORS_SPEED);
|
|
||||||
}
|
|
||||||
else correctRange = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bigMeteor[i].speed = (Vector2){velx, vely};
|
|
||||||
bigMeteor[i].radius = 40;
|
|
||||||
bigMeteor[i].active = true;
|
|
||||||
bigMeteor[i].color = BLUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < MAX_MEDIUM_METEORS; i++)
|
|
||||||
{
|
|
||||||
mediumMeteor[i].position = (Vector2){-100, -100};
|
|
||||||
mediumMeteor[i].speed = (Vector2){0,0};
|
|
||||||
mediumMeteor[i].radius = 20;
|
|
||||||
mediumMeteor[i].active = false;
|
|
||||||
mediumMeteor[i].color = BLUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < MAX_SMALL_METEORS; i++)
|
|
||||||
{
|
|
||||||
smallMeteor[i].position = (Vector2){-100, -100};
|
|
||||||
smallMeteor[i].speed = (Vector2){0,0};
|
|
||||||
smallMeteor[i].radius = 10;
|
|
||||||
smallMeteor[i].active = false;
|
|
||||||
smallMeteor[i].color = BLUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
midMeteorsCount = 0;
|
|
||||||
smallMeteorsCount = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update game (one frame)
|
|
||||||
void UpdateGame(void)
|
|
||||||
{
|
|
||||||
if (!gameOver)
|
|
||||||
{
|
|
||||||
if (IsKeyPressed('P')) pause = !pause;
|
|
||||||
|
|
||||||
if (!pause)
|
|
||||||
{
|
|
||||||
// Player logic: rotation
|
|
||||||
if (IsKeyDown(KEY_LEFT)) player.rotation -= 5;
|
|
||||||
if (IsKeyDown(KEY_RIGHT)) player.rotation += 5;
|
|
||||||
|
|
||||||
// Player logic: speed
|
|
||||||
player.speed.x = sin(player.rotation*DEG2RAD)*PLAYER_SPEED;
|
|
||||||
player.speed.y = cos(player.rotation*DEG2RAD)*PLAYER_SPEED;
|
|
||||||
|
|
||||||
// Player logic: acceleration
|
|
||||||
if (IsKeyDown(KEY_UP))
|
|
||||||
{
|
|
||||||
if (player.acceleration < 1) player.acceleration += 0.04f;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (player.acceleration > 0) player.acceleration -= 0.02f;
|
|
||||||
else if (player.acceleration < 0) player.acceleration = 0;
|
|
||||||
}
|
|
||||||
if (IsKeyDown(KEY_DOWN))
|
|
||||||
{
|
|
||||||
if (player.acceleration > 0) player.acceleration -= 0.04f;
|
|
||||||
else if (player.acceleration < 0) player.acceleration = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Player logic: movement
|
|
||||||
player.position.x += (player.speed.x*player.acceleration);
|
|
||||||
player.position.y -= (player.speed.y*player.acceleration);
|
|
||||||
|
|
||||||
// Collision logic: player vs walls
|
|
||||||
if (player.position.x > screenWidth + shipHeight) player.position.x = -(shipHeight);
|
|
||||||
else if (player.position.x < -(shipHeight)) player.position.x = screenWidth + shipHeight;
|
|
||||||
if (player.position.y > (screenHeight + shipHeight)) player.position.y = -(shipHeight);
|
|
||||||
else if (player.position.y < -(shipHeight)) player.position.y = screenHeight + shipHeight;
|
|
||||||
|
|
||||||
// Player shoot logic
|
|
||||||
if (IsKeyPressed(KEY_SPACE))
|
|
||||||
{
|
|
||||||
for (int i = 0; i < PLAYER_MAX_SHOOTS; i++)
|
|
||||||
{
|
|
||||||
if (!shoot[i].active)
|
|
||||||
{
|
|
||||||
shoot[i].position = (Vector2){ player.position.x + sin(player.rotation*DEG2RAD)*(shipHeight), player.position.y - cos(player.rotation*DEG2RAD)*(shipHeight) };
|
|
||||||
shoot[i].active = true;
|
|
||||||
shoot[i].speed.x = 1.5*sin(player.rotation*DEG2RAD)*PLAYER_SPEED;
|
|
||||||
shoot[i].speed.y = 1.5*cos(player.rotation*DEG2RAD)*PLAYER_SPEED;
|
|
||||||
shoot[i].rotation = player.rotation;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shoot life timer
|
|
||||||
for (int i = 0; i < PLAYER_MAX_SHOOTS; i++)
|
|
||||||
{
|
|
||||||
if (shoot[i].active) shoot[i].lifeSpawn++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shot logic
|
|
||||||
for (int i = 0; i < PLAYER_MAX_SHOOTS; i++)
|
|
||||||
{
|
|
||||||
if (shoot[i].active)
|
|
||||||
{
|
|
||||||
// Movement
|
|
||||||
shoot[i].position.x += shoot[i].speed.x;
|
|
||||||
shoot[i].position.y -= shoot[i].speed.y;
|
|
||||||
|
|
||||||
// Collision logic: shoot vs walls
|
|
||||||
if (shoot[i].position.x > screenWidth + shoot[i].radius)
|
|
||||||
{
|
|
||||||
shoot[i].active = false;
|
|
||||||
shoot[i].lifeSpawn = 0;
|
|
||||||
}
|
|
||||||
else if (shoot[i].position.x < 0 - shoot[i].radius)
|
|
||||||
{
|
|
||||||
shoot[i].active = false;
|
|
||||||
shoot[i].lifeSpawn = 0;
|
|
||||||
}
|
|
||||||
if (shoot[i].position.y > screenHeight + shoot[i].radius)
|
|
||||||
{
|
|
||||||
shoot[i].active = false;
|
|
||||||
shoot[i].lifeSpawn = 0;
|
|
||||||
}
|
|
||||||
else if (shoot[i].position.y < 0 - shoot[i].radius)
|
|
||||||
{
|
|
||||||
shoot[i].active = false;
|
|
||||||
shoot[i].lifeSpawn = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Life of shoot
|
|
||||||
if (shoot[i].lifeSpawn >= 60)
|
|
||||||
{
|
|
||||||
shoot[i].position = (Vector2){0, 0};
|
|
||||||
shoot[i].speed = (Vector2){0, 0};
|
|
||||||
shoot[i].lifeSpawn = 0;
|
|
||||||
shoot[i].active = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Collision logic: player vs meteors
|
|
||||||
player.collider = (Vector3){player.position.x + sin(player.rotation*DEG2RAD)*(shipHeight/2.5f), player.position.y - cos(player.rotation*DEG2RAD)*(shipHeight/2.5f), 12};
|
|
||||||
|
|
||||||
for (int a = 0; a < MAX_BIG_METEORS; a++)
|
|
||||||
{
|
|
||||||
if (CheckCollisionCircles((Vector2){player.collider.x, player.collider.y}, player.collider.z, bigMeteor[a].position, bigMeteor[a].radius) && bigMeteor[a].active) gameOver = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int a = 0; a < MAX_MEDIUM_METEORS; a++)
|
|
||||||
{
|
|
||||||
if (CheckCollisionCircles((Vector2){player.collider.x, player.collider.y}, player.collider.z, mediumMeteor[a].position, mediumMeteor[a].radius) && mediumMeteor[a].active) gameOver = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int a = 0; a < MAX_SMALL_METEORS; a++)
|
|
||||||
{
|
|
||||||
if (CheckCollisionCircles((Vector2){player.collider.x, player.collider.y}, player.collider.z, smallMeteor[a].position, smallMeteor[a].radius) && smallMeteor[a].active) gameOver = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Meteors logic: big meteors
|
|
||||||
for (int i = 0; i < MAX_BIG_METEORS; i++)
|
|
||||||
{
|
|
||||||
if (bigMeteor[i].active)
|
|
||||||
{
|
|
||||||
// Movement
|
|
||||||
bigMeteor[i].position.x += bigMeteor[i].speed.x;
|
|
||||||
bigMeteor[i].position.y += bigMeteor[i].speed.y;
|
|
||||||
|
|
||||||
// Collision logic: meteor vs wall
|
|
||||||
if (bigMeteor[i].position.x > screenWidth + bigMeteor[i].radius) bigMeteor[i].position.x = -(bigMeteor[i].radius);
|
|
||||||
else if (bigMeteor[i].position.x < 0 - bigMeteor[i].radius) bigMeteor[i].position.x = screenWidth + bigMeteor[i].radius;
|
|
||||||
if (bigMeteor[i].position.y > screenHeight + bigMeteor[i].radius) bigMeteor[i].position.y = -(bigMeteor[i].radius);
|
|
||||||
else if (bigMeteor[i].position.y < 0 - bigMeteor[i].radius) bigMeteor[i].position.y = screenHeight + bigMeteor[i].radius;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Meteors logic: medium meteors
|
|
||||||
for (int i = 0; i < MAX_MEDIUM_METEORS; i++)
|
|
||||||
{
|
|
||||||
if (mediumMeteor[i].active)
|
|
||||||
{
|
|
||||||
// Movement
|
|
||||||
mediumMeteor[i].position.x += mediumMeteor[i].speed.x;
|
|
||||||
mediumMeteor[i].position.y += mediumMeteor[i].speed.y;
|
|
||||||
|
|
||||||
// Collision logic: meteor vs wall
|
|
||||||
if (mediumMeteor[i].position.x > screenWidth + mediumMeteor[i].radius) mediumMeteor[i].position.x = -(mediumMeteor[i].radius);
|
|
||||||
else if (mediumMeteor[i].position.x < 0 - mediumMeteor[i].radius) mediumMeteor[i].position.x = screenWidth + mediumMeteor[i].radius;
|
|
||||||
if (mediumMeteor[i].position.y > screenHeight + mediumMeteor[i].radius) mediumMeteor[i].position.y = -(mediumMeteor[i].radius);
|
|
||||||
else if (mediumMeteor[i].position.y < 0 - mediumMeteor[i].radius) mediumMeteor[i].position.y = screenHeight + mediumMeteor[i].radius;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Meteors logic: small meteors
|
|
||||||
for (int i = 0; i < MAX_SMALL_METEORS; i++)
|
|
||||||
{
|
|
||||||
if (smallMeteor[i].active)
|
|
||||||
{
|
|
||||||
// Movement
|
|
||||||
smallMeteor[i].position.x += smallMeteor[i].speed.x;
|
|
||||||
smallMeteor[i].position.y += smallMeteor[i].speed.y;
|
|
||||||
|
|
||||||
// Collision logic: meteor vs wall
|
|
||||||
if (smallMeteor[i].position.x > screenWidth + smallMeteor[i].radius) smallMeteor[i].position.x = -(smallMeteor[i].radius);
|
|
||||||
else if (smallMeteor[i].position.x < 0 - smallMeteor[i].radius) smallMeteor[i].position.x = screenWidth + smallMeteor[i].radius;
|
|
||||||
if (smallMeteor[i].position.y > screenHeight + smallMeteor[i].radius) smallMeteor[i].position.y = -(smallMeteor[i].radius);
|
|
||||||
else if (smallMeteor[i].position.y < 0 - smallMeteor[i].radius) smallMeteor[i].position.y = screenHeight + smallMeteor[i].radius;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Collision logic: player-shoots vs meteors
|
|
||||||
for (int i = 0; i < PLAYER_MAX_SHOOTS; i++)
|
|
||||||
{
|
|
||||||
if ((shoot[i].active))
|
|
||||||
{
|
|
||||||
for (int a = 0; a < MAX_BIG_METEORS; a++)
|
|
||||||
{
|
|
||||||
if (bigMeteor[a].active && CheckCollisionCircles(shoot[i].position, shoot[i].radius, bigMeteor[a].position, bigMeteor[a].radius))
|
|
||||||
{
|
|
||||||
shoot[i].active = false;
|
|
||||||
shoot[i].lifeSpawn = 0;
|
|
||||||
bigMeteor[a].active = false;
|
|
||||||
destroyedMeteorsCount++;
|
|
||||||
|
|
||||||
for (int j = 0; j < 2; j ++)
|
|
||||||
{
|
|
||||||
if (midMeteorsCount%2 == 0)
|
|
||||||
{
|
|
||||||
mediumMeteor[midMeteorsCount].position = (Vector2){bigMeteor[a].position.x, bigMeteor[a].position.y};
|
|
||||||
mediumMeteor[midMeteorsCount].speed = (Vector2){cos(shoot[i].rotation*DEG2RAD)*METEORS_SPEED*-1, sin(shoot[i].rotation*DEG2RAD)*METEORS_SPEED*-1};
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
mediumMeteor[midMeteorsCount].position = (Vector2){bigMeteor[a].position.x, bigMeteor[a].position.y};
|
|
||||||
mediumMeteor[midMeteorsCount].speed = (Vector2){cos(shoot[i].rotation*DEG2RAD)*METEORS_SPEED, sin(shoot[i].rotation*DEG2RAD)*METEORS_SPEED};
|
|
||||||
}
|
|
||||||
|
|
||||||
mediumMeteor[midMeteorsCount].active = true;
|
|
||||||
midMeteorsCount ++;
|
|
||||||
}
|
|
||||||
//bigMeteor[a].position = (Vector2){-100, -100};
|
|
||||||
bigMeteor[a].color = RED;
|
|
||||||
a = MAX_BIG_METEORS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int b = 0; b < MAX_MEDIUM_METEORS; b++)
|
|
||||||
{
|
|
||||||
if (mediumMeteor[b].active && CheckCollisionCircles(shoot[i].position, shoot[i].radius, mediumMeteor[b].position, mediumMeteor[b].radius))
|
|
||||||
{
|
|
||||||
shoot[i].active = false;
|
|
||||||
shoot[i].lifeSpawn = 0;
|
|
||||||
mediumMeteor[b].active = false;
|
|
||||||
destroyedMeteorsCount++;
|
|
||||||
|
|
||||||
for (int j = 0; j < 2; j ++)
|
|
||||||
{
|
|
||||||
if (smallMeteorsCount%2 == 0)
|
|
||||||
{
|
|
||||||
smallMeteor[smallMeteorsCount].position = (Vector2){mediumMeteor[b].position.x, mediumMeteor[b].position.y};
|
|
||||||
smallMeteor[smallMeteorsCount].speed = (Vector2){cos(shoot[i].rotation*DEG2RAD)*METEORS_SPEED*-1, sin(shoot[i].rotation*DEG2RAD)*METEORS_SPEED*-1};
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
smallMeteor[smallMeteorsCount].position = (Vector2){mediumMeteor[b].position.x, mediumMeteor[b].position.y};
|
|
||||||
smallMeteor[smallMeteorsCount].speed = (Vector2){cos(shoot[i].rotation*DEG2RAD)*METEORS_SPEED, sin(shoot[i].rotation*DEG2RAD)*METEORS_SPEED};
|
|
||||||
}
|
|
||||||
|
|
||||||
smallMeteor[smallMeteorsCount].active = true;
|
|
||||||
smallMeteorsCount ++;
|
|
||||||
}
|
|
||||||
//mediumMeteor[b].position = (Vector2){-100, -100};
|
|
||||||
mediumMeteor[b].color = GREEN;
|
|
||||||
b = MAX_MEDIUM_METEORS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int c = 0; c < MAX_SMALL_METEORS; c++)
|
|
||||||
{
|
|
||||||
if (smallMeteor[c].active && CheckCollisionCircles(shoot[i].position, shoot[i].radius, smallMeteor[c].position, smallMeteor[c].radius))
|
|
||||||
{
|
|
||||||
shoot[i].active = false;
|
|
||||||
shoot[i].lifeSpawn = 0;
|
|
||||||
smallMeteor[c].active = false;
|
|
||||||
destroyedMeteorsCount++;
|
|
||||||
smallMeteor[c].color = YELLOW;
|
|
||||||
// smallMeteor[c].position = (Vector2){-100, -100};
|
|
||||||
c = MAX_SMALL_METEORS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (destroyedMeteorsCount == MAX_BIG_METEORS + MAX_MEDIUM_METEORS + MAX_SMALL_METEORS) victory = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (IsKeyPressed(KEY_ENTER))
|
|
||||||
{
|
|
||||||
InitGame();
|
|
||||||
gameOver = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Draw game (one frame)
|
|
||||||
void DrawGame(void)
|
|
||||||
{
|
|
||||||
BeginDrawing();
|
|
||||||
|
|
||||||
ClearBackground(RAYWHITE);
|
|
||||||
|
|
||||||
if (!gameOver)
|
|
||||||
{
|
|
||||||
// Draw spaceship
|
|
||||||
Vector2 v1 = { player.position.x + sinf(player.rotation*DEG2RAD)*(shipHeight), player.position.y - cosf(player.rotation*DEG2RAD)*(shipHeight) };
|
|
||||||
Vector2 v2 = { player.position.x - cosf(player.rotation*DEG2RAD)*(PLAYER_BASE_SIZE/2), player.position.y - sinf(player.rotation*DEG2RAD)*(PLAYER_BASE_SIZE/2) };
|
|
||||||
Vector2 v3 = { player.position.x + cosf(player.rotation*DEG2RAD)*(PLAYER_BASE_SIZE/2), player.position.y + sinf(player.rotation*DEG2RAD)*(PLAYER_BASE_SIZE/2) };
|
|
||||||
DrawTriangle(v1, v2, v3, MAROON);
|
|
||||||
|
|
||||||
// Draw meteors
|
|
||||||
for (int i = 0; i < MAX_BIG_METEORS; i++)
|
|
||||||
{
|
|
||||||
if (bigMeteor[i].active) DrawCircleV(bigMeteor[i].position, bigMeteor[i].radius, DARKGRAY);
|
|
||||||
else DrawCircleV(bigMeteor[i].position, bigMeteor[i].radius, Fade(LIGHTGRAY, 0.3f));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < MAX_MEDIUM_METEORS; i++)
|
|
||||||
{
|
|
||||||
if (mediumMeteor[i].active) DrawCircleV(mediumMeteor[i].position, mediumMeteor[i].radius, GRAY);
|
|
||||||
else DrawCircleV(mediumMeteor[i].position, mediumMeteor[i].radius, Fade(LIGHTGRAY, 0.3f));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < MAX_SMALL_METEORS; i++)
|
|
||||||
{
|
|
||||||
if (smallMeteor[i].active) DrawCircleV(smallMeteor[i].position, smallMeteor[i].radius, GRAY);
|
|
||||||
else DrawCircleV(smallMeteor[i].position, smallMeteor[i].radius, Fade(LIGHTGRAY, 0.3f));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Draw shoot
|
|
||||||
for (int i = 0; i < PLAYER_MAX_SHOOTS; i++)
|
|
||||||
{
|
|
||||||
if (shoot[i].active) DrawCircleV(shoot[i].position, shoot[i].radius, BLACK);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (victory) DrawText("VICTORY", screenWidth/2 - MeasureText("VICTORY", 20)/2, screenHeight/2, 20, LIGHTGRAY);
|
|
||||||
|
|
||||||
if (pause) DrawText("GAME PAUSED", screenWidth/2 - MeasureText("GAME PAUSED", 40)/2, screenHeight/2 - 40, 40, GRAY);
|
|
||||||
}
|
|
||||||
else DrawText("PRESS [ENTER] TO PLAY AGAIN", GetScreenWidth()/2 - MeasureText("PRESS [ENTER] TO PLAY AGAIN", 20)/2, GetScreenHeight()/2 - 50, 20, GRAY);
|
|
||||||
|
|
||||||
EndDrawing();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unload game variables
|
|
||||||
void UnloadGame(void)
|
|
||||||
{
|
|
||||||
// TODO: Unload all dynamic loaded data (textures, sounds, models...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update and Draw (one frame)
|
|
||||||
void UpdateDrawFrame(void)
|
|
||||||
{
|
|
||||||
UpdateGame();
|
|
||||||
DrawGame();
|
|
||||||
}
|
|
||||||
|
|
@ -1,375 +0,0 @@
|
||||||
/*******************************************************************************************
|
|
||||||
*
|
|
||||||
* raylib - sample game: asteroids survival
|
|
||||||
*
|
|
||||||
* Sample game developed by Ian Eito, Albert Martos and Ramon Santamaria
|
|
||||||
*
|
|
||||||
* This game has been created using raylib v1.3 (www.raylib.com)
|
|
||||||
* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
|
|
||||||
*
|
|
||||||
* Copyright (c) 2015 Ramon Santamaria (@raysan5)
|
|
||||||
*
|
|
||||||
********************************************************************************************/
|
|
||||||
|
|
||||||
#include "raylib.h"
|
|
||||||
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#if defined(PLATFORM_WEB)
|
|
||||||
#include <emscripten/emscripten.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
// Some Defines
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
#define PLAYER_BASE_SIZE 20.0f
|
|
||||||
#define PLAYER_SPEED 6.0f
|
|
||||||
#define PLAYER_MAX_SHOOTS 10
|
|
||||||
|
|
||||||
#define METEORS_SPEED 2
|
|
||||||
#define MAX_MEDIUM_METEORS 8
|
|
||||||
#define MAX_SMALL_METEORS 16
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
// Types and Structures Definition
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
typedef struct Player {
|
|
||||||
Vector2 position;
|
|
||||||
Vector2 speed;
|
|
||||||
float acceleration;
|
|
||||||
float rotation;
|
|
||||||
Vector3 collider;
|
|
||||||
Color color;
|
|
||||||
} Player;
|
|
||||||
|
|
||||||
typedef struct Meteor {
|
|
||||||
Vector2 position;
|
|
||||||
Vector2 speed;
|
|
||||||
float radius;
|
|
||||||
bool active;
|
|
||||||
Color color;
|
|
||||||
} Meteor;
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
// Global Variables Declaration
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
static const int screenWidth = 800;
|
|
||||||
static const int screenHeight = 450;
|
|
||||||
|
|
||||||
static int framesCounter = 0;
|
|
||||||
static bool gameOver = false;
|
|
||||||
static bool pause = false;
|
|
||||||
|
|
||||||
// NOTE: Defined triangle is isosceles with common angles of 70 degrees.
|
|
||||||
static float shipHeight = 0.0f;
|
|
||||||
|
|
||||||
static Player player = { 0 };
|
|
||||||
static Meteor mediumMeteor[MAX_MEDIUM_METEORS] = { 0 };
|
|
||||||
static Meteor smallMeteor[MAX_SMALL_METEORS] = { 0 };
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
// Module Functions Declaration (local)
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
static void InitGame(void); // Initialize game
|
|
||||||
static void UpdateGame(void); // Update game (one frame)
|
|
||||||
static void DrawGame(void); // Draw game (one frame)
|
|
||||||
static void UnloadGame(void); // Unload game
|
|
||||||
static void UpdateDrawFrame(void); // Update and Draw (one frame)
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
// Program main entry point
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
// Initialization (Note windowTitle is unused on Android)
|
|
||||||
//---------------------------------------------------------
|
|
||||||
InitWindow(screenWidth, screenHeight, "sample game: asteroids survival");
|
|
||||||
|
|
||||||
InitGame();
|
|
||||||
|
|
||||||
#if defined(PLATFORM_WEB)
|
|
||||||
emscripten_set_main_loop(UpdateDrawFrame, 0, 1);
|
|
||||||
#else
|
|
||||||
SetTargetFPS(60);
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Main game loop
|
|
||||||
while (!WindowShouldClose()) // Detect window close button or ESC key
|
|
||||||
{
|
|
||||||
// Update and Draw
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
UpdateDrawFrame();
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
// De-Initialization
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
UnloadGame(); // Unload loaded data (textures, sounds, models...)
|
|
||||||
|
|
||||||
CloseWindow(); // Close window and OpenGL context
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
// Module Functions Definitions (local)
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Initialize game variables
|
|
||||||
void InitGame(void)
|
|
||||||
{
|
|
||||||
int posx, posy;
|
|
||||||
int velx, vely;
|
|
||||||
bool correctRange = false;
|
|
||||||
|
|
||||||
pause = false;
|
|
||||||
|
|
||||||
framesCounter = 0;
|
|
||||||
|
|
||||||
shipHeight = (PLAYER_BASE_SIZE/2)/tanf(20*DEG2RAD);
|
|
||||||
|
|
||||||
// Initialization player
|
|
||||||
player.position = (Vector2){screenWidth/2, screenHeight/2 - shipHeight/2};
|
|
||||||
player.speed = (Vector2){0, 0};
|
|
||||||
player.acceleration = 0;
|
|
||||||
player.rotation = 0;
|
|
||||||
player.collider = (Vector3){player.position.x + sin(player.rotation*DEG2RAD)*(shipHeight/2.5f), player.position.y - cos(player.rotation*DEG2RAD)*(shipHeight/2.5f), 12};
|
|
||||||
player.color = LIGHTGRAY;
|
|
||||||
|
|
||||||
for (int i = 0; i < MAX_MEDIUM_METEORS; i++)
|
|
||||||
{
|
|
||||||
posx = GetRandomValue(0, screenWidth);
|
|
||||||
|
|
||||||
while(!correctRange)
|
|
||||||
{
|
|
||||||
if (posx > screenWidth/2 - 150 && posx < screenWidth/2 + 150) posx = GetRandomValue(0, screenWidth);
|
|
||||||
else correctRange = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
correctRange = false;
|
|
||||||
|
|
||||||
posy = GetRandomValue(0, screenHeight);
|
|
||||||
|
|
||||||
while(!correctRange)
|
|
||||||
{
|
|
||||||
if (posy > screenHeight/2 - 150 && posy < screenHeight/2 + 150) posy = GetRandomValue(0, screenHeight);
|
|
||||||
else correctRange = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
correctRange = false;
|
|
||||||
velx = GetRandomValue(-METEORS_SPEED, METEORS_SPEED);
|
|
||||||
vely = GetRandomValue(-METEORS_SPEED, METEORS_SPEED);
|
|
||||||
|
|
||||||
while(!correctRange)
|
|
||||||
{
|
|
||||||
if (velx == 0 && vely == 0)
|
|
||||||
{
|
|
||||||
velx = GetRandomValue(-METEORS_SPEED, METEORS_SPEED);
|
|
||||||
vely = GetRandomValue(-METEORS_SPEED, METEORS_SPEED);
|
|
||||||
}
|
|
||||||
else correctRange = true;
|
|
||||||
}
|
|
||||||
mediumMeteor[i].position = (Vector2){posx, posy};
|
|
||||||
mediumMeteor[i].speed = (Vector2){velx, vely};
|
|
||||||
mediumMeteor[i].radius = 20;
|
|
||||||
mediumMeteor[i].active = true;
|
|
||||||
mediumMeteor[i].color = GREEN;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < MAX_SMALL_METEORS; i++)
|
|
||||||
{
|
|
||||||
posx = GetRandomValue(0, screenWidth);
|
|
||||||
|
|
||||||
while(!correctRange)
|
|
||||||
{
|
|
||||||
if (posx > screenWidth/2 - 150 && posx < screenWidth/2 + 150) posx = GetRandomValue(0, screenWidth);
|
|
||||||
else correctRange = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
correctRange = false;
|
|
||||||
|
|
||||||
posy = GetRandomValue(0, screenHeight);
|
|
||||||
|
|
||||||
while(!correctRange)
|
|
||||||
{
|
|
||||||
if (posy > screenHeight/2 - 150 && posy < screenHeight/2 + 150) posy = GetRandomValue(0, screenHeight);
|
|
||||||
else correctRange = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
correctRange = false;
|
|
||||||
velx = GetRandomValue(-METEORS_SPEED, METEORS_SPEED);
|
|
||||||
vely = GetRandomValue(-METEORS_SPEED, METEORS_SPEED);
|
|
||||||
|
|
||||||
while(!correctRange)
|
|
||||||
{
|
|
||||||
if (velx == 0 && vely == 0)
|
|
||||||
{
|
|
||||||
velx = GetRandomValue(-METEORS_SPEED, METEORS_SPEED);
|
|
||||||
vely = GetRandomValue(-METEORS_SPEED, METEORS_SPEED);
|
|
||||||
}
|
|
||||||
else correctRange = true;
|
|
||||||
}
|
|
||||||
smallMeteor[i].position = (Vector2){posx, posy};
|
|
||||||
smallMeteor[i].speed = (Vector2){velx, vely};
|
|
||||||
smallMeteor[i].radius = 10;
|
|
||||||
smallMeteor[i].active = true;
|
|
||||||
smallMeteor[i].color = YELLOW;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update game (one frame)
|
|
||||||
void UpdateGame(void)
|
|
||||||
{
|
|
||||||
if (!gameOver)
|
|
||||||
{
|
|
||||||
if (IsKeyPressed('P')) pause = !pause;
|
|
||||||
|
|
||||||
if (!pause)
|
|
||||||
{
|
|
||||||
framesCounter++;
|
|
||||||
|
|
||||||
// Player logic
|
|
||||||
|
|
||||||
// Rotation
|
|
||||||
if (IsKeyDown(KEY_LEFT)) player.rotation -= 5;
|
|
||||||
if (IsKeyDown(KEY_RIGHT)) player.rotation += 5;
|
|
||||||
|
|
||||||
// Speed
|
|
||||||
player.speed.x = sin(player.rotation*DEG2RAD)*PLAYER_SPEED;
|
|
||||||
player.speed.y = cos(player.rotation*DEG2RAD)*PLAYER_SPEED;
|
|
||||||
|
|
||||||
// Controller
|
|
||||||
if (IsKeyDown(KEY_UP))
|
|
||||||
{
|
|
||||||
if (player.acceleration < 1) player.acceleration += 0.04f;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (player.acceleration > 0) player.acceleration -= 0.02f;
|
|
||||||
else if (player.acceleration < 0) player.acceleration = 0;
|
|
||||||
}
|
|
||||||
if (IsKeyDown(KEY_DOWN))
|
|
||||||
{
|
|
||||||
if (player.acceleration > 0) player.acceleration -= 0.04f;
|
|
||||||
else if (player.acceleration < 0) player.acceleration = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Movement
|
|
||||||
player.position.x += (player.speed.x*player.acceleration);
|
|
||||||
player.position.y -= (player.speed.y*player.acceleration);
|
|
||||||
|
|
||||||
// Wall behaviour for player
|
|
||||||
if (player.position.x > screenWidth + shipHeight) player.position.x = -(shipHeight);
|
|
||||||
else if (player.position.x < -(shipHeight)) player.position.x = screenWidth + shipHeight;
|
|
||||||
if (player.position.y > (screenHeight + shipHeight)) player.position.y = -(shipHeight);
|
|
||||||
else if (player.position.y < -(shipHeight)) player.position.y = screenHeight + shipHeight;
|
|
||||||
|
|
||||||
// Collision Player to meteors
|
|
||||||
player.collider = (Vector3){player.position.x + sin(player.rotation*DEG2RAD)*(shipHeight/2.5f), player.position.y - cos(player.rotation*DEG2RAD)*(shipHeight/2.5f), 12};
|
|
||||||
|
|
||||||
for (int a = 0; a < MAX_MEDIUM_METEORS; a++)
|
|
||||||
{
|
|
||||||
if (CheckCollisionCircles((Vector2){player.collider.x, player.collider.y}, player.collider.z, mediumMeteor[a].position, mediumMeteor[a].radius) && mediumMeteor[a].active) gameOver = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int a = 0; a < MAX_SMALL_METEORS; a++)
|
|
||||||
{
|
|
||||||
if (CheckCollisionCircles((Vector2){player.collider.x, player.collider.y}, player.collider.z, smallMeteor[a].position, smallMeteor[a].radius) && smallMeteor[a].active) gameOver = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Meteor logic
|
|
||||||
|
|
||||||
for (int i = 0; i < MAX_MEDIUM_METEORS; i++)
|
|
||||||
{
|
|
||||||
if (mediumMeteor[i].active)
|
|
||||||
{
|
|
||||||
// movement
|
|
||||||
mediumMeteor[i].position.x += mediumMeteor[i].speed.x;
|
|
||||||
mediumMeteor[i].position.y += mediumMeteor[i].speed.y;
|
|
||||||
|
|
||||||
// wall behaviour
|
|
||||||
if (mediumMeteor[i].position.x > screenWidth + mediumMeteor[i].radius) mediumMeteor[i].position.x = -(mediumMeteor[i].radius);
|
|
||||||
else if (mediumMeteor[i].position.x < 0 - mediumMeteor[i].radius) mediumMeteor[i].position.x = screenWidth + mediumMeteor[i].radius;
|
|
||||||
if (mediumMeteor[i].position.y > screenHeight + mediumMeteor[i].radius) mediumMeteor[i].position.y = -(mediumMeteor[i].radius);
|
|
||||||
else if (mediumMeteor[i].position.y < 0 - mediumMeteor[i].radius) mediumMeteor[i].position.y = screenHeight + mediumMeteor[i].radius;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < MAX_SMALL_METEORS; i++)
|
|
||||||
{
|
|
||||||
if (smallMeteor[i].active)
|
|
||||||
{
|
|
||||||
// movement
|
|
||||||
smallMeteor[i].position.x += smallMeteor[i].speed.x;
|
|
||||||
smallMeteor[i].position.y += smallMeteor[i].speed.y;
|
|
||||||
|
|
||||||
// wall behaviour
|
|
||||||
if (smallMeteor[i].position.x > screenWidth + smallMeteor[i].radius) smallMeteor[i].position.x = -(smallMeteor[i].radius);
|
|
||||||
else if (smallMeteor[i].position.x < 0 - smallMeteor[i].radius) smallMeteor[i].position.x = screenWidth + smallMeteor[i].radius;
|
|
||||||
if (smallMeteor[i].position.y > screenHeight + smallMeteor[i].radius) smallMeteor[i].position.y = -(smallMeteor[i].radius);
|
|
||||||
else if (smallMeteor[i].position.y < 0 - smallMeteor[i].radius) smallMeteor[i].position.y = screenHeight + smallMeteor[i].radius;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (IsKeyPressed(KEY_ENTER))
|
|
||||||
{
|
|
||||||
InitGame();
|
|
||||||
gameOver = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Draw game (one frame)
|
|
||||||
void DrawGame(void)
|
|
||||||
{
|
|
||||||
BeginDrawing();
|
|
||||||
|
|
||||||
ClearBackground(RAYWHITE);
|
|
||||||
|
|
||||||
if (!gameOver)
|
|
||||||
{
|
|
||||||
// Draw spaceship
|
|
||||||
Vector2 v1 = { player.position.x + sinf(player.rotation*DEG2RAD)*(shipHeight), player.position.y - cosf(player.rotation*DEG2RAD)*(shipHeight) };
|
|
||||||
Vector2 v2 = { player.position.x - cosf(player.rotation*DEG2RAD)*(PLAYER_BASE_SIZE/2), player.position.y - sinf(player.rotation*DEG2RAD)*(PLAYER_BASE_SIZE/2) };
|
|
||||||
Vector2 v3 = { player.position.x + cosf(player.rotation*DEG2RAD)*(PLAYER_BASE_SIZE/2), player.position.y + sinf(player.rotation*DEG2RAD)*(PLAYER_BASE_SIZE/2) };
|
|
||||||
DrawTriangle(v1, v2, v3, MAROON);
|
|
||||||
|
|
||||||
// Draw meteor
|
|
||||||
for (int i = 0;i < MAX_MEDIUM_METEORS; i++)
|
|
||||||
{
|
|
||||||
if (mediumMeteor[i].active) DrawCircleV(mediumMeteor[i].position, mediumMeteor[i].radius, GRAY);
|
|
||||||
else DrawCircleV(mediumMeteor[i].position, mediumMeteor[i].radius, Fade(LIGHTGRAY, 0.3f));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0;i < MAX_SMALL_METEORS; i++)
|
|
||||||
{
|
|
||||||
if (smallMeteor[i].active) DrawCircleV(smallMeteor[i].position, smallMeteor[i].radius, DARKGRAY);
|
|
||||||
else DrawCircleV(smallMeteor[i].position, smallMeteor[i].radius, Fade(LIGHTGRAY, 0.3f));
|
|
||||||
}
|
|
||||||
|
|
||||||
DrawText(TextFormat("TIME: %.02f", (float)framesCounter/60), 10, 10, 20, BLACK);
|
|
||||||
|
|
||||||
if (pause) DrawText("GAME PAUSED", screenWidth/2 - MeasureText("GAME PAUSED", 40)/2, screenHeight/2 - 40, 40, GRAY);
|
|
||||||
}
|
|
||||||
else DrawText("PRESS [ENTER] TO PLAY AGAIN", GetScreenWidth()/2 - MeasureText("PRESS [ENTER] TO PLAY AGAIN", 20)/2, GetScreenHeight()/2 - 50, 20, GRAY);
|
|
||||||
|
|
||||||
EndDrawing();
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unload game variables
|
|
||||||
void UnloadGame(void)
|
|
||||||
{
|
|
||||||
// TODO: Unload all dynamic loaded data (textures, sounds, models...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update and Draw (one frame)
|
|
||||||
void UpdateDrawFrame(void)
|
|
||||||
{
|
|
||||||
UpdateGame();
|
|
||||||
DrawGame();
|
|
||||||
}
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
|
|
||||||
This game sources are licensed under an unmodified zlib/libpng license,
|
|
||||||
which is an OSI-certified, BSD-like license:
|
|
||||||
|
|
||||||
Copyright (c) 2013-2019 Ramon Santamaria (@raysan5)
|
|
||||||
|
|
||||||
This software is provided "as-is", without any express or implied warranty. In no event
|
|
||||||
will the authors be held liable for any damages arising from the use of this software.
|
|
||||||
|
|
||||||
Permission is granted to anyone to use this software for any purpose, including commercial
|
|
||||||
applications, and to alter it and redistribute it freely, subject to the following restrictions:
|
|
||||||
|
|
||||||
1. The origin of this software must not be misrepresented; you must not claim that you
|
|
||||||
wrote the original software. If you use this software in a product, an acknowledgment
|
|
||||||
in the product documentation would be appreciated but is not required.
|
|
||||||
|
|
||||||
2. Altered source versions must be plainly marked as such, and must not be misrepresented
|
|
||||||
as being the original software.
|
|
||||||
|
|
||||||
3. This notice may not be removed or altered from any source distribution.
|
|
||||||
|
|
@ -1,406 +0,0 @@
|
||||||
#**************************************************************************************************
|
|
||||||
#
|
|
||||||
# raylib makefile for Desktop platforms, Raspberry Pi, Android and HTML5
|
|
||||||
#
|
|
||||||
# Copyright (c) 2013-2020 Ramon Santamaria (@raysan5)
|
|
||||||
#
|
|
||||||
# This software is provided "as-is", without any express or implied warranty. In no event
|
|
||||||
# will the authors be held liable for any damages arising from the use of this software.
|
|
||||||
#
|
|
||||||
# Permission is granted to anyone to use this software for any purpose, including commercial
|
|
||||||
# applications, and to alter it and redistribute it freely, subject to the following restrictions:
|
|
||||||
#
|
|
||||||
# 1. The origin of this software must not be misrepresented; you must not claim that you
|
|
||||||
# wrote the original software. If you use this software in a product, an acknowledgment
|
|
||||||
# in the product documentation would be appreciated but is not required.
|
|
||||||
#
|
|
||||||
# 2. Altered source versions must be plainly marked as such, and must not be misrepresented
|
|
||||||
# as being the original software.
|
|
||||||
#
|
|
||||||
# 3. This notice may not be removed or altered from any source distribution.
|
|
||||||
#
|
|
||||||
#**************************************************************************************************
|
|
||||||
|
|
||||||
.PHONY: all clean
|
|
||||||
|
|
||||||
# Define required raylib variables
|
|
||||||
PROJECT_NAME ?= roomba
|
|
||||||
RAYLIB_VERSION ?= 3.0.0
|
|
||||||
RAYLIB_API_VERSION ?= 3
|
|
||||||
RAYLIB_PATH ?= C:\GitHub\raylib
|
|
||||||
|
|
||||||
# Define default options
|
|
||||||
|
|
||||||
# One of PLATFORM_DESKTOP, PLATFORM_RPI, PLATFORM_ANDROID, PLATFORM_WEB
|
|
||||||
PLATFORM ?= PLATFORM_DESKTOP
|
|
||||||
|
|
||||||
# Locations of your newly installed library and associated headers. See ../src/Makefile
|
|
||||||
# On Linux, if you have installed raylib but cannot compile the examples, check that
|
|
||||||
# the *_INSTALL_PATH values here are the same as those in src/Makefile or point to known locations.
|
|
||||||
# To enable system-wide compile-time and runtime linking to libraylib.so, run ../src/$ sudo make install RAYLIB_LIBTYPE_SHARED.
|
|
||||||
# To enable compile-time linking to a special version of libraylib.so, change these variables here.
|
|
||||||
# To enable runtime linking to a special version of libraylib.so, see EXAMPLE_RUNTIME_PATH below.
|
|
||||||
# If there is a libraylib in both EXAMPLE_RUNTIME_PATH and RAYLIB_INSTALL_PATH, at runtime,
|
|
||||||
# the library at EXAMPLE_RUNTIME_PATH, if present, will take precedence over the one at RAYLIB_INSTALL_PATH.
|
|
||||||
# RAYLIB_INSTALL_PATH should be the desired full path to libraylib. No relative paths.
|
|
||||||
DESTDIR ?= /usr/local
|
|
||||||
RAYLIB_INSTALL_PATH ?= $(DESTDIR)/lib
|
|
||||||
# RAYLIB_H_INSTALL_PATH locates the installed raylib header and associated source files.
|
|
||||||
RAYLIB_H_INSTALL_PATH ?= $(DESTDIR)/include
|
|
||||||
|
|
||||||
# Library type used for raylib: STATIC (.a) or SHARED (.so/.dll)
|
|
||||||
RAYLIB_LIBTYPE ?= STATIC
|
|
||||||
|
|
||||||
# Build mode for project: DEBUG or RELEASE
|
|
||||||
BUILD_MODE ?= RELEASE
|
|
||||||
|
|
||||||
# Use external GLFW library instead of rglfw module
|
|
||||||
# TODO: Review usage on Linux. Target version of choice. Switch on -lglfw or -lglfw3
|
|
||||||
USE_EXTERNAL_GLFW ?= FALSE
|
|
||||||
|
|
||||||
# Use Wayland display server protocol on Linux desktop
|
|
||||||
# by default it uses X11 windowing system
|
|
||||||
USE_WAYLAND_DISPLAY ?= FALSE
|
|
||||||
|
|
||||||
# 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
|
|
||||||
else
|
|
||||||
UNAMEOS=$(shell uname)
|
|
||||||
ifeq ($(UNAMEOS),Linux)
|
|
||||||
PLATFORM_OS=LINUX
|
|
||||||
endif
|
|
||||||
ifeq ($(UNAMEOS),FreeBSD)
|
|
||||||
PLATFORM_OS=BSD
|
|
||||||
endif
|
|
||||||
ifeq ($(UNAMEOS),OpenBSD)
|
|
||||||
PLATFORM_OS=BSD
|
|
||||||
endif
|
|
||||||
ifeq ($(UNAMEOS),NetBSD)
|
|
||||||
PLATFORM_OS=BSD
|
|
||||||
endif
|
|
||||||
ifeq ($(UNAMEOS),DragonFly)
|
|
||||||
PLATFORM_OS=BSD
|
|
||||||
endif
|
|
||||||
ifeq ($(UNAMEOS),Darwin)
|
|
||||||
PLATFORM_OS=OSX
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_RPI)
|
|
||||||
UNAMEOS=$(shell uname)
|
|
||||||
ifeq ($(UNAMEOS),Linux)
|
|
||||||
PLATFORM_OS=LINUX
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# RAYLIB_PATH adjustment for different platforms.
|
|
||||||
# If using GNU make, we can get the full path to the top of the tree. Windows? BSD?
|
|
||||||
# Required for ldconfig or other tools that do not perform path expansion.
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
|
||||||
ifeq ($(PLATFORM_OS),LINUX)
|
|
||||||
RAYLIB_PREFIX ?= ..
|
|
||||||
RAYLIB_PATH = $(realpath $(RAYLIB_PREFIX))
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
# Default path for raylib on Raspberry Pi, if installed in different path, update it!
|
|
||||||
# This is not currently used by src/Makefile. Not sure of its origin or usage. Refer to wiki.
|
|
||||||
# TODO: update install: target in src/Makefile for RPI, consider relation to LINUX.
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_RPI)
|
|
||||||
RAYLIB_PATH ?= /home/pi/raylib
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_WEB)
|
|
||||||
# Emscripten required variables
|
|
||||||
EMSDK_PATH ?= C:/emsdk
|
|
||||||
EMSCRIPTEN_PATH ?= $(EMSDK_PATH)/fastcomp/emscripten
|
|
||||||
CLANG_PATH = $(EMSDK_PATH)/fastcomp/bin
|
|
||||||
PYTHON_PATH = $(EMSDK_PATH)/python/2.7.13.1_64bit/python-2.7.13.amd64
|
|
||||||
NODE_PATH = $(EMSDK_PATH)/node/12.9.1_64bit/bin
|
|
||||||
export PATH = $(EMSDK_PATH);$(EMSCRIPTEN_PATH);$(CLANG_PATH);$(NODE_PATH);$(PYTHON_PATH);C:\raylib\MinGW\bin:$$(PATH)
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Define raylib release directory for compiled library.
|
|
||||||
# RAYLIB_RELEASE_PATH points to provided binaries or your freshly built version
|
|
||||||
RAYLIB_RELEASE_PATH ?= $(RAYLIB_PATH)/src
|
|
||||||
|
|
||||||
# EXAMPLE_RUNTIME_PATH embeds a custom runtime location of libraylib.so or other desired libraries
|
|
||||||
# into each example binary compiled with RAYLIB_LIBTYPE=SHARED. It defaults to RAYLIB_RELEASE_PATH
|
|
||||||
# so that these examples link at runtime with your version of libraylib.so in ../release/libs/linux
|
|
||||||
# without formal installation from ../src/Makefile. It aids portability and is useful if you have
|
|
||||||
# multiple versions of raylib, have raylib installed to a non-standard location, or want to
|
|
||||||
# bundle libraylib.so with your game. Change it to your liking.
|
|
||||||
# NOTE: If, at runtime, there is a libraylib.so at both EXAMPLE_RUNTIME_PATH and RAYLIB_INSTALL_PATH,
|
|
||||||
# The library at EXAMPLE_RUNTIME_PATH, if present, will take precedence over RAYLIB_INSTALL_PATH,
|
|
||||||
# Implemented for LINUX below with CFLAGS += -Wl,-rpath,$(EXAMPLE_RUNTIME_PATH)
|
|
||||||
# To see the result, run readelf -d core/core_basic_window; looking at the RPATH or RUNPATH attribute.
|
|
||||||
# To see which libraries a built example is linking to, ldd core/core_basic_window;
|
|
||||||
# Look for libraylib.so.1 => $(RAYLIB_INSTALL_PATH)/libraylib.so.1 or similar listing.
|
|
||||||
EXAMPLE_RUNTIME_PATH ?= $(RAYLIB_RELEASE_PATH)
|
|
||||||
|
|
||||||
# Define default C compiler: gcc
|
|
||||||
# NOTE: define g++ compiler if using C++
|
|
||||||
CC = gcc
|
|
||||||
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
|
||||||
ifeq ($(PLATFORM_OS),OSX)
|
|
||||||
# OSX default compiler
|
|
||||||
CC = clang
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM_OS),BSD)
|
|
||||||
# FreeBSD, OpenBSD, NetBSD, DragonFly default compiler
|
|
||||||
CC = clang
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_RPI)
|
|
||||||
ifeq ($(USE_RPI_CROSS_COMPILER),TRUE)
|
|
||||||
# Define RPI cross-compiler
|
|
||||||
#CC = armv6j-hardfloat-linux-gnueabi-gcc
|
|
||||||
CC = $(RPI_TOOLCHAIN)/bin/arm-linux-gnueabihf-gcc
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_WEB)
|
|
||||||
# HTML5 emscripten compiler
|
|
||||||
# WARNING: To compile to HTML5, code must be redesigned
|
|
||||||
# to use emscripten.h and emscripten_set_main_loop()
|
|
||||||
CC = emcc
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Define default make program: Mingw32-make
|
|
||||||
MAKE = mingw32-make
|
|
||||||
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
|
||||||
ifeq ($(PLATFORM_OS),LINUX)
|
|
||||||
MAKE = make
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Define compiler flags:
|
|
||||||
# -O1 defines optimization level
|
|
||||||
# -g include debug information on compilation
|
|
||||||
# -s strip unnecessary data from build
|
|
||||||
# -Wall turns on most, but not all, compiler warnings
|
|
||||||
# -std=c99 defines C language mode (standard C from 1999 revision)
|
|
||||||
# -std=gnu99 defines C language mode (GNU C from 1999 revision)
|
|
||||||
# -Wno-missing-braces ignore invalid warning (GCC bug 53119)
|
|
||||||
# -D_DEFAULT_SOURCE use with -std=c99 on Linux and PLATFORM_WEB, required for timespec
|
|
||||||
CFLAGS += -Wall -std=c99 -D_DEFAULT_SOURCE -Wno-missing-braces
|
|
||||||
|
|
||||||
ifeq ($(BUILD_MODE),DEBUG)
|
|
||||||
CFLAGS += -g
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_WEB)
|
|
||||||
CFLAGS += -s ASSERTIONS=1 --profiling
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_WEB)
|
|
||||||
CFLAGS += -Os
|
|
||||||
else
|
|
||||||
CFLAGS += -s -O1
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Additional flags for compiler (if desired)
|
|
||||||
#CFLAGS += -Wextra -Wmissing-prototypes -Wstrict-prototypes
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
|
||||||
ifeq ($(PLATFORM_OS),LINUX)
|
|
||||||
ifeq ($(RAYLIB_LIBTYPE),STATIC)
|
|
||||||
CFLAGS += -D_DEFAULT_SOURCE
|
|
||||||
endif
|
|
||||||
ifeq ($(RAYLIB_LIBTYPE),SHARED)
|
|
||||||
# Explicitly enable runtime link to libraylib.so
|
|
||||||
CFLAGS += -Wl,-rpath,$(EXAMPLE_RUNTIME_PATH)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_RPI)
|
|
||||||
CFLAGS += -std=gnu99
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_WEB)
|
|
||||||
# -Os # size optimization
|
|
||||||
# -O2 # optimization level 2, if used, also set --memory-init-file 0
|
|
||||||
# -s USE_GLFW=3 # Use glfw3 library (context/input management)
|
|
||||||
# -s ALLOW_MEMORY_GROWTH=1 # to allow memory resizing -> WARNING: Audio buffers could FAIL!
|
|
||||||
# -s TOTAL_MEMORY=16777216 # to specify heap memory size (default = 16MB)
|
|
||||||
# -s USE_PTHREADS=1 # multithreading support
|
|
||||||
# -s WASM=0 # disable Web Assembly, emitted by default
|
|
||||||
# -s EMTERPRETIFY=1 # enable emscripten code interpreter (very slow)
|
|
||||||
# -s EMTERPRETIFY_ASYNC=1 # support synchronous loops by emterpreter
|
|
||||||
# -s FORCE_FILESYSTEM=1 # force filesystem to load/save files data
|
|
||||||
# -s ASSERTIONS=1 # enable runtime checks for common memory allocation errors (-O1 and above turn it off)
|
|
||||||
# --profiling # include information for code profiling
|
|
||||||
# --memory-init-file 0 # to avoid an external memory initialization code file (.mem)
|
|
||||||
# --preload-file resources # specify a resources folder for data compilation
|
|
||||||
CFLAGS += -s USE_GLFW=3 -s TOTAL_MEMORY=16777216 --preload-file resources
|
|
||||||
|
|
||||||
# Define a custom shell .html and output extension
|
|
||||||
CFLAGS += --shell-file $(RAYLIB_PATH)/src/shell.html
|
|
||||||
EXT = .html
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Define include paths for required headers
|
|
||||||
# NOTE: Several external required libraries (stb and others)
|
|
||||||
INCLUDE_PATHS = -I. -I$(RAYLIB_PATH)/src -I$(RAYLIB_PATH)/src/external
|
|
||||||
|
|
||||||
# Define additional directories containing required header files
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_RPI)
|
|
||||||
# RPI required libraries
|
|
||||||
INCLUDE_PATHS += -I/opt/vc/include
|
|
||||||
INCLUDE_PATHS += -I/opt/vc/include/interface/vmcs_host/linux
|
|
||||||
INCLUDE_PATHS += -I/opt/vc/include/interface/vcos/pthreads
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
|
||||||
ifeq ($(PLATFORM_OS),BSD)
|
|
||||||
# Consider -L$(RAYLIB_H_INSTALL_PATH)
|
|
||||||
INCLUDE_PATHS += -I/usr/local/include
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM_OS),LINUX)
|
|
||||||
# Reset everything.
|
|
||||||
# Precedence: immediately local, installed version, raysan5 provided libs -I$(RAYLIB_H_INSTALL_PATH) -I$(RAYLIB_PATH)/release/include
|
|
||||||
INCLUDE_PATHS = -I$(RAYLIB_H_INSTALL_PATH) -isystem. -isystem$(RAYLIB_PATH)/src -isystem$(RAYLIB_PATH)/release/include -isystem$(RAYLIB_PATH)/src/external
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Define library paths containing required libs.
|
|
||||||
LDFLAGS = -L. -L$(RAYLIB_RELEASE_PATH) -L$(RAYLIB_PATH)/src
|
|
||||||
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
|
||||||
ifeq ($(PLATFORM_OS),WINDOWS)
|
|
||||||
# resource file contains windows executable icon and properties
|
|
||||||
LDFLAGS += $(RAYLIB_PATH)/src/raylib.rc.data
|
|
||||||
# -Wl,--subsystem,windows hides the console window
|
|
||||||
ifeq ($(BUILD_MODE), RELEASE)
|
|
||||||
LDFLAGS += -Wl,--subsystem,windows
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM_OS),BSD)
|
|
||||||
# Consider -L$(RAYLIB_INSTALL_PATH)
|
|
||||||
LDFLAGS += -L. -Lsrc -L/usr/local/lib
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM_OS),LINUX)
|
|
||||||
# Reset everything.
|
|
||||||
# Precedence: immediately local, installed version, raysan5 provided libs
|
|
||||||
LDFLAGS = -L. -L$(RAYLIB_INSTALL_PATH) -L$(RAYLIB_RELEASE_PATH)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_RPI)
|
|
||||||
LDFLAGS += -L/opt/vc/lib
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Define any libraries required on linking
|
|
||||||
# if you want to link libraries (libname.so or libname.a), use the -lname
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
|
||||||
ifeq ($(PLATFORM_OS),WINDOWS)
|
|
||||||
# Libraries for Windows desktop compilation
|
|
||||||
# NOTE: WinMM library required to set high-res timer resolution
|
|
||||||
LDLIBS = -lraylib -lopengl32 -lgdi32 -lwinmm
|
|
||||||
# Required for physac examples
|
|
||||||
LDLIBS += -static -lpthread
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM_OS),LINUX)
|
|
||||||
# Libraries for Debian GNU/Linux desktop compiling
|
|
||||||
# NOTE: Required packages: libegl1-mesa-dev
|
|
||||||
LDLIBS = -lraylib -lGL -lm -lpthread -ldl -lrt
|
|
||||||
|
|
||||||
# On X11 requires also below libraries
|
|
||||||
LDLIBS += -lX11
|
|
||||||
# NOTE: It seems additional libraries are not required any more, latest GLFW just dlopen them
|
|
||||||
#LDLIBS += -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor
|
|
||||||
|
|
||||||
# On Wayland windowing system, additional libraries requires
|
|
||||||
ifeq ($(USE_WAYLAND_DISPLAY),TRUE)
|
|
||||||
LDLIBS += -lwayland-client -lwayland-cursor -lwayland-egl -lxkbcommon
|
|
||||||
endif
|
|
||||||
# Explicit link to libc
|
|
||||||
ifeq ($(RAYLIB_LIBTYPE),SHARED)
|
|
||||||
LDLIBS += -lc
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM_OS),OSX)
|
|
||||||
# Libraries for OSX 10.9 desktop compiling
|
|
||||||
# NOTE: Required packages: libopenal-dev libegl1-mesa-dev
|
|
||||||
LDLIBS = -lraylib -framework OpenGL -framework Cocoa -framework IOKit -framework CoreAudio -framework CoreVideo
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM_OS),BSD)
|
|
||||||
# Libraries for FreeBSD, OpenBSD, NetBSD, DragonFly desktop compiling
|
|
||||||
# NOTE: Required packages: mesa-libs
|
|
||||||
LDLIBS = -lraylib -lGL -lpthread -lm
|
|
||||||
|
|
||||||
# On XWindow requires also below libraries
|
|
||||||
LDLIBS += -lX11 -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor
|
|
||||||
endif
|
|
||||||
ifeq ($(USE_EXTERNAL_GLFW),TRUE)
|
|
||||||
# NOTE: It could require additional packages installed: libglfw3-dev
|
|
||||||
LDLIBS += -lglfw
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_RPI)
|
|
||||||
# Libraries for Raspberry Pi compiling
|
|
||||||
# NOTE: Required packages: libasound2-dev (ALSA)
|
|
||||||
LDLIBS = -lraylib -lbrcmGLESv2 -lbrcmEGL -lpthread -lrt -lm -lbcm_host -ldl
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_WEB)
|
|
||||||
# Libraries for web (HTML5) compiling
|
|
||||||
LDLIBS = $(RAYLIB_RELEASE_PATH)/libraylib.bc
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Define all source files required
|
|
||||||
PROJECT_SOURCE_FILES ?= \
|
|
||||||
roomba.c \
|
|
||||||
screens/screen_logo.c \
|
|
||||||
screens/screen_title.c \
|
|
||||||
screens/screen_gameplay.c \
|
|
||||||
screens/screen_ending.c
|
|
||||||
|
|
||||||
# Define all object files from source files
|
|
||||||
OBJS = $(patsubst %.c, %.o, $(PROJECT_SOURCE_FILES))
|
|
||||||
|
|
||||||
# For Android platform we call a custom Makefile.Android
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_ANDROID)
|
|
||||||
MAKEFILE_PARAMS = -f Makefile.Android
|
|
||||||
export PROJECT_NAME
|
|
||||||
export PROJECT_SOURCE_FILES
|
|
||||||
else
|
|
||||||
MAKEFILE_PARAMS = $(PROJECT_NAME)
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Default target entry
|
|
||||||
# NOTE: We call this Makefile target or Makefile.Android target
|
|
||||||
all:
|
|
||||||
$(MAKE) $(MAKEFILE_PARAMS)
|
|
||||||
|
|
||||||
# Project target defined by PROJECT_NAME
|
|
||||||
$(PROJECT_NAME): $(OBJS)
|
|
||||||
$(CC) -o $(PROJECT_NAME)$(EXT) $(OBJS) $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
|
|
||||||
|
|
||||||
# Compile source files
|
|
||||||
# NOTE: This pattern will compile every module defined on $(OBJS)
|
|
||||||
%.o: %.c
|
|
||||||
$(CC) -c $< -o $@ $(CFLAGS) $(INCLUDE_PATHS) -D$(PLATFORM)
|
|
||||||
|
|
||||||
# Clean everything
|
|
||||||
clean:
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
|
||||||
ifeq ($(PLATFORM_OS),WINDOWS)
|
|
||||||
del *.o *.exe /s
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM_OS),LINUX)
|
|
||||||
find -type f -executable | xargs file -i | grep -E 'x-object|x-archive|x-sharedlib|x-executable|x-pie-executable' | rev | cut -d ':' -f 2- | rev | xargs rm -fv
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM_OS),OSX)
|
|
||||||
find . -type f -perm +ugo+x -delete
|
|
||||||
rm -f *.o
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_RPI)
|
|
||||||
find . -type f -executable -delete
|
|
||||||
rm -fv *.o
|
|
||||||
endif
|
|
||||||
ifeq ($(PLATFORM),PLATFORM_WEB)
|
|
||||||
del *.o *.html *.js
|
|
||||||
endif
|
|
||||||
@echo Cleaning done
|
|
||||||
|
|
||||||
|
|
@ -1,300 +0,0 @@
|
||||||
#**************************************************************************************************
|
|
||||||
#
|
|
||||||
# raylib makefile for Android project (APK building)
|
|
||||||
#
|
|
||||||
# Copyright (c) 2017 Ramon Santamaria (@raysan5)
|
|
||||||
#
|
|
||||||
# This software is provided "as-is", without any express or implied warranty. In no event
|
|
||||||
# will the authors be held liable for any damages arising from the use of this software.
|
|
||||||
#
|
|
||||||
# Permission is granted to anyone to use this software for any purpose, including commercial
|
|
||||||
# applications, and to alter it and redistribute it freely, subject to the following restrictions:
|
|
||||||
#
|
|
||||||
# 1. The origin of this software must not be misrepresented; you must not claim that you
|
|
||||||
# wrote the original software. If you use this software in a product, an acknowledgment
|
|
||||||
# in the product documentation would be appreciated but is not required.
|
|
||||||
#
|
|
||||||
# 2. Altered source versions must be plainly marked as such, and must not be misrepresented
|
|
||||||
# as being the original software.
|
|
||||||
#
|
|
||||||
# 3. This notice may not be removed or altered from any source distribution.
|
|
||||||
#
|
|
||||||
#**************************************************************************************************
|
|
||||||
|
|
||||||
# Define required raylib variables
|
|
||||||
PLATFORM ?= PLATFORM_ANDROID
|
|
||||||
RAYLIB_PATH ?= ..\..
|
|
||||||
|
|
||||||
# Define Android architecture (armeabi-v7a, arm64-v8a, x86, x86-64) and API version
|
|
||||||
ANDROID_ARCH ?= ARM
|
|
||||||
ANDROID_API_VERSION = 21
|
|
||||||
ifeq ($(ANDROID_ARCH),ARM)
|
|
||||||
ANDROID_ARCH_NAME = armeabi-v7a
|
|
||||||
endif
|
|
||||||
ifeq ($(ANDROID_ARCH),ARM64)
|
|
||||||
ANDROID_ARCH_NAME = arm64-v8a
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Required path variables
|
|
||||||
# NOTE: JAVA_HOME must be set to JDK
|
|
||||||
JAVA_HOME ?= C:/JavaJDK
|
|
||||||
ANDROID_HOME = C:/android-sdk
|
|
||||||
ANDROID_TOOLCHAIN = C:/android_toolchain_$(ANDROID_ARCH)_API$(ANDROID_API_VERSION)
|
|
||||||
ANDROID_BUILD_TOOLS = $(ANDROID_HOME)/build-tools/28.0.1
|
|
||||||
ANDROID_PLATFORM_TOOLS = $(ANDROID_HOME)/platform-tools
|
|
||||||
|
|
||||||
# Android project configuration variables
|
|
||||||
PROJECT_NAME ?= raylib_game
|
|
||||||
PROJECT_LIBRARY_NAME ?= main
|
|
||||||
PROJECT_BUILD_PATH ?= android.$(PROJECT_NAME)
|
|
||||||
PROJECT_RESOURCES_PATH ?= resources
|
|
||||||
PROJECT_SOURCE_FILES ?= raylib_game.c
|
|
||||||
|
|
||||||
# Some source files are placed in directories, when compiling to some
|
|
||||||
# output directory other than source, that directory must pre-exist.
|
|
||||||
# Here we get a list of required folders that need to be created on
|
|
||||||
# code output folder $(PROJECT_BUILD_PATH)\obj to avoid GCC errors.
|
|
||||||
PROJECT_SOURCE_DIRS = $(sort $(dir $(PROJECT_SOURCE_FILES)))
|
|
||||||
|
|
||||||
# Android app configuration variables
|
|
||||||
APP_LABEL_NAME ?= rGame
|
|
||||||
APP_COMPANY_NAME ?= raylib
|
|
||||||
APP_PRODUCT_NAME ?= rgame
|
|
||||||
APP_VERSION_CODE ?= 1
|
|
||||||
APP_VERSION_NAME ?= 1.0
|
|
||||||
APP_ICON_LDPI ?= $(RAYLIB_PATH)\logo\raylib_36x36.png
|
|
||||||
APP_ICON_MDPI ?= $(RAYLIB_PATH)\logo\raylib_48x48.png
|
|
||||||
APP_ICON_HDPI ?= $(RAYLIB_PATH)\logo\raylib_72x72.png
|
|
||||||
APP_SCREEN_ORIENTATION ?= landscape
|
|
||||||
APP_KEYSTORE_PASS ?= raylib
|
|
||||||
|
|
||||||
# Library type used for raylib: STATIC (.a) or SHARED (.so/.dll)
|
|
||||||
RAYLIB_LIBTYPE ?= STATIC
|
|
||||||
|
|
||||||
# Library path for libraylib.a/libraylib.so
|
|
||||||
RAYLIB_LIB_PATH = $(RAYLIB_PATH)\src
|
|
||||||
|
|
||||||
# Shared libs must be added to APK if required
|
|
||||||
# NOTE: Generated NativeLoader.java automatically load those libraries
|
|
||||||
ifeq ($(RAYLIB_LIBTYPE),SHARED)
|
|
||||||
PROJECT_SHARED_LIBS = lib/$(ANDROID_ARCH_NAME)/libraylib.so
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Compiler and archiver
|
|
||||||
# NOTE: GCC is being deprecated in Android NDK r16
|
|
||||||
ifeq ($(ANDROID_ARCH),ARM)
|
|
||||||
CC = $(ANDROID_TOOLCHAIN)/bin/arm-linux-androideabi-clang
|
|
||||||
AR = $(ANDROID_TOOLCHAIN)/bin/arm-linux-androideabi-ar
|
|
||||||
endif
|
|
||||||
ifeq ($(ANDROID_ARCH),ARM64)
|
|
||||||
CC = $(ANDROID_TOOLCHAIN)/bin/aarch64-linux-android-clang
|
|
||||||
AR = $(ANDROID_TOOLCHAIN)/bin/aarch64-linux-android-ar
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Compiler flags for arquitecture
|
|
||||||
ifeq ($(ANDROID_ARCH),ARM)
|
|
||||||
CFLAGS = -std=c99 -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16
|
|
||||||
endif
|
|
||||||
ifeq ($(ANDROID_ARCH),ARM64)
|
|
||||||
CFLAGS = -std=c99 -target aarch64 -mfix-cortex-a53-835769
|
|
||||||
endif
|
|
||||||
# Compilation functions attributes options
|
|
||||||
CFLAGS += -ffunction-sections -funwind-tables -fstack-protector-strong -fPIC
|
|
||||||
# Compiler options for the linker
|
|
||||||
CFLAGS += -Wall -Wa,--noexecstack -Wformat -Werror=format-security -no-canonical-prefixes
|
|
||||||
# Preprocessor macro definitions
|
|
||||||
CFLAGS += -DANDROID -DPLATFORM_ANDROID -D__ANDROID_API__=$(ANDROID_API_VERSION)
|
|
||||||
|
|
||||||
# Paths containing required header files
|
|
||||||
INCLUDE_PATHS = -I. -I$(RAYLIB_PATH)/src -I$(RAYLIB_PATH)/src/external/android/native_app_glue
|
|
||||||
|
|
||||||
# Linker options
|
|
||||||
LDFLAGS = -Wl,-soname,lib$(PROJECT_LIBRARY_NAME).so -Wl,--exclude-libs,libatomic.a
|
|
||||||
LDFLAGS += -Wl,--build-id -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--warn-shared-textrel -Wl,--fatal-warnings
|
|
||||||
# Force linking of library module to define symbol
|
|
||||||
LDFLAGS += -u ANativeActivity_onCreate
|
|
||||||
# Library paths containing required libs
|
|
||||||
LDFLAGS += -L. -L$(PROJECT_BUILD_PATH)/obj -L$(PROJECT_BUILD_PATH)/lib/$(ANDROID_ARCH_NAME) -L$(ANDROID_TOOLCHAIN)\sysroot\usr\lib
|
|
||||||
|
|
||||||
# Define any libraries to link into executable
|
|
||||||
# if you want to link libraries (libname.so or libname.a), use the -lname
|
|
||||||
LDLIBS = -lm -lc -lraylib -llog -landroid -lEGL -lGLESv2 -lOpenSLES -ldl
|
|
||||||
|
|
||||||
# Generate target objects list from PROJECT_SOURCE_FILES
|
|
||||||
OBJS = $(patsubst %.c, $(PROJECT_BUILD_PATH)/obj/%.o, $(PROJECT_SOURCE_FILES))
|
|
||||||
|
|
||||||
# Android APK building process... some steps required...
|
|
||||||
# NOTE: typing 'make' will invoke the default target entry called 'all',
|
|
||||||
all: create_temp_project_dirs \
|
|
||||||
copy_project_required_libs \
|
|
||||||
copy_project_resources \
|
|
||||||
generate_loader_script \
|
|
||||||
generate_android_manifest \
|
|
||||||
generate_apk_keystore \
|
|
||||||
config_project_package \
|
|
||||||
compile_project_code \
|
|
||||||
compile_project_class \
|
|
||||||
compile_project_class_dex \
|
|
||||||
create_project_apk_package \
|
|
||||||
sign_project_apk_package \
|
|
||||||
zipalign_project_apk_package
|
|
||||||
|
|
||||||
# Create required temp directories for APK building
|
|
||||||
create_temp_project_dirs:
|
|
||||||
if not exist $(PROJECT_BUILD_PATH) mkdir $(PROJECT_BUILD_PATH)
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\obj mkdir $(PROJECT_BUILD_PATH)\obj
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\src mkdir $(PROJECT_BUILD_PATH)\src
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\src\com mkdir $(PROJECT_BUILD_PATH)\src\com
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\src\com\$(APP_COMPANY_NAME) mkdir $(PROJECT_BUILD_PATH)\src\com\$(APP_COMPANY_NAME)
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\src\com\$(APP_COMPANY_NAME)\$(APP_PRODUCT_NAME) mkdir $(PROJECT_BUILD_PATH)\src\com\$(APP_COMPANY_NAME)\$(APP_PRODUCT_NAME)
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\lib mkdir $(PROJECT_BUILD_PATH)\lib
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\lib\$(ANDROID_ARCH_NAME) mkdir $(PROJECT_BUILD_PATH)\lib\$(ANDROID_ARCH_NAME)
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\bin mkdir $(PROJECT_BUILD_PATH)\bin
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\res mkdir $(PROJECT_BUILD_PATH)\res
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\res\drawable-ldpi mkdir $(PROJECT_BUILD_PATH)\res\drawable-ldpi
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\res\drawable-mdpi mkdir $(PROJECT_BUILD_PATH)\res\drawable-mdpi
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\res\drawable-hdpi mkdir $(PROJECT_BUILD_PATH)\res\drawable-hdpi
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\res\values mkdir $(PROJECT_BUILD_PATH)\res\values
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\assets mkdir $(PROJECT_BUILD_PATH)\assets
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\assets\$(PROJECT_RESOURCES_PATH) mkdir $(PROJECT_BUILD_PATH)\assets\$(PROJECT_RESOURCES_PATH)
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\obj\screens mkdir $(PROJECT_BUILD_PATH)\obj\screens
|
|
||||||
$(foreach dir, $(PROJECT_SOURCE_DIRS), $(call create_dir, $(dir)))
|
|
||||||
|
|
||||||
define create_dir
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)\obj\$(1) mkdir $(PROJECT_BUILD_PATH)\obj\$(1)
|
|
||||||
endef
|
|
||||||
|
|
||||||
# Copy required shared libs for integration into APK
|
|
||||||
# NOTE: If using shared libs they are loaded by generated NativeLoader.java
|
|
||||||
copy_project_required_libs:
|
|
||||||
ifeq ($(RAYLIB_LIBTYPE),SHARED)
|
|
||||||
copy /Y $(RAYLIB_LIB_PATH)\libraylib.so $(PROJECT_BUILD_PATH)\lib\$(ANDROID_ARCH_NAME)\libraylib.so
|
|
||||||
endif
|
|
||||||
ifeq ($(RAYLIB_LIBTYPE),STATIC)
|
|
||||||
copy /Y $(RAYLIB_LIB_PATH)\libraylib.a $(PROJECT_BUILD_PATH)\lib\$(ANDROID_ARCH_NAME)\libraylib.a
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Copy project required resources: strings.xml, icon.png, assets
|
|
||||||
# NOTE: Required strings.xml is generated and game resources are copied to assets folder
|
|
||||||
# TODO: Review xcopy usage, it can not be found in some systems!
|
|
||||||
copy_project_resources:
|
|
||||||
copy $(APP_ICON_LDPI) $(PROJECT_BUILD_PATH)\res\drawable-ldpi\icon.png /Y
|
|
||||||
copy $(APP_ICON_MDPI) $(PROJECT_BUILD_PATH)\res\drawable-mdpi\icon.png /Y
|
|
||||||
copy $(APP_ICON_HDPI) $(PROJECT_BUILD_PATH)\res\drawable-hdpi\icon.png /Y
|
|
||||||
@echo ^<?xml version="1.0" encoding="utf-8"^?^> > $(PROJECT_BUILD_PATH)/res/values/strings.xml
|
|
||||||
@echo ^<resources^>^<string name="app_name"^>$(APP_LABEL_NAME)^</string^>^</resources^> >> $(PROJECT_BUILD_PATH)/res/values/strings.xml
|
|
||||||
if exist $(PROJECT_RESOURCES_PATH) C:\Windows\System32\xcopy $(PROJECT_RESOURCES_PATH) $(PROJECT_BUILD_PATH)\assets\$(PROJECT_RESOURCES_PATH) /Y /E /F
|
|
||||||
|
|
||||||
# Generate NativeLoader.java to load required shared libraries
|
|
||||||
# NOTE: Probably not the bet way to generate this file... but it works.
|
|
||||||
generate_loader_script:
|
|
||||||
@echo package com.$(APP_COMPANY_NAME).$(APP_PRODUCT_NAME); > $(PROJECT_BUILD_PATH)/src/com/$(APP_COMPANY_NAME)/$(APP_PRODUCT_NAME)/NativeLoader.java
|
|
||||||
@echo. >> $(PROJECT_BUILD_PATH)/src/com/$(APP_COMPANY_NAME)/$(APP_PRODUCT_NAME)/NativeLoader.java
|
|
||||||
@echo public class NativeLoader extends android.app.NativeActivity { >> $(PROJECT_BUILD_PATH)/src/com/$(APP_COMPANY_NAME)/$(APP_PRODUCT_NAME)/NativeLoader.java
|
|
||||||
@echo static { >> $(PROJECT_BUILD_PATH)/src/com/$(APP_COMPANY_NAME)/$(APP_PRODUCT_NAME)/NativeLoader.java
|
|
||||||
ifeq ($(RAYLIB_LIBTYPE),SHARED)
|
|
||||||
@echo System.loadLibrary("raylib"); >> $(PROJECT_BUILD_PATH)/src/com/$(APP_COMPANY_NAME)/$(APP_PRODUCT_NAME)/NativeLoader.java
|
|
||||||
endif
|
|
||||||
@echo System.loadLibrary("$(PROJECT_LIBRARY_NAME)"); >> $(PROJECT_BUILD_PATH)/src/com/$(APP_COMPANY_NAME)/$(APP_PRODUCT_NAME)/NativeLoader.java
|
|
||||||
@echo } >> $(PROJECT_BUILD_PATH)/src/com/$(APP_COMPANY_NAME)/$(APP_PRODUCT_NAME)/NativeLoader.java
|
|
||||||
@echo } >> $(PROJECT_BUILD_PATH)/src/com/$(APP_COMPANY_NAME)/$(APP_PRODUCT_NAME)/NativeLoader.java
|
|
||||||
|
|
||||||
# Generate AndroidManifest.xml with all the required options
|
|
||||||
# NOTE: Probably not the bet way to generate this file... but it works.
|
|
||||||
generate_android_manifest:
|
|
||||||
@echo ^<?xml version="1.0" encoding="utf-8"^?^> > $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo ^<manifest xmlns:android="http://schemas.android.com/apk/res/android" >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo package="com.$(APP_COMPANY_NAME).$(APP_PRODUCT_NAME)" >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo android:versionCode="$(APP_VERSION_CODE)" android:versionName="$(APP_VERSION_NAME)" ^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo ^<uses-sdk android:minSdkVersion="$(ANDROID_API_VERSION)" /^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo ^<uses-feature android:glEsVersion="0x00020000" android:required="true" /^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo ^<application android:allowBackup="false" android:label="@string/app_name" android:icon="@drawable/icon" ^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo ^<activity android:name="com.$(APP_COMPANY_NAME).$(APP_PRODUCT_NAME).NativeLoader" >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo android:configChanges="orientation|keyboardHidden|screenSize" >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo android:screenOrientation="$(APP_SCREEN_ORIENTATION)" android:launchMode="singleTask" >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo android:clearTaskOnLaunch="true"^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo ^<meta-data android:name="android.app.lib_name" android:value="$(PROJECT_LIBRARY_NAME)" /^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo ^<intent-filter^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo ^<action android:name="android.intent.action.MAIN" /^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo ^<category android:name="android.intent.category.LAUNCHER" /^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo ^</intent-filter^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo ^</activity^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo ^</application^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
@echo ^</manifest^> >> $(PROJECT_BUILD_PATH)/AndroidManifest.xml
|
|
||||||
|
|
||||||
# Generate storekey for APK signing: $(PROJECT_NAME).keystore
|
|
||||||
# NOTE: Configure here your Distinguished Names (-dname) if required!
|
|
||||||
generate_apk_keystore:
|
|
||||||
if not exist $(PROJECT_BUILD_PATH)/$(PROJECT_NAME).keystore $(JAVA_HOME)/bin/keytool -genkeypair -validity 1000 -dname "CN=$(APP_COMPANY_NAME),O=Android,C=ES" -keystore $(PROJECT_BUILD_PATH)/$(PROJECT_NAME).keystore -storepass $(APP_KEYSTORE_PASS) -keypass $(APP_KEYSTORE_PASS) -alias $(PROJECT_NAME)Key -keyalg RSA
|
|
||||||
|
|
||||||
# Config project package and resource using AndroidManifest.xml and res/values/strings.xml
|
|
||||||
# NOTE: Generates resources file: src/com/$(APP_COMPANY_NAME)/$(APP_PRODUCT_NAME)/R.java
|
|
||||||
config_project_package:
|
|
||||||
$(ANDROID_BUILD_TOOLS)/aapt package -f -m -S $(PROJECT_BUILD_PATH)/res -J $(PROJECT_BUILD_PATH)/src -M $(PROJECT_BUILD_PATH)/AndroidManifest.xml -I $(ANDROID_HOME)/platforms/android-$(ANDROID_API_VERSION)/android.jar
|
|
||||||
|
|
||||||
# Compile native_app_glue code as static library: obj/libnative_app_glue.a
|
|
||||||
compile_native_app_glue:
|
|
||||||
$(CC) -c $(RAYLIB_PATH)/src/external/android/native_app_glue/android_native_app_glue.c -o $(PROJECT_BUILD_PATH)/obj/native_app_glue.o $(CFLAGS)
|
|
||||||
$(AR) rcs $(PROJECT_BUILD_PATH)/obj/libnative_app_glue.a $(PROJECT_BUILD_PATH)/obj/native_app_glue.o
|
|
||||||
|
|
||||||
# Compile project code into a shared library: lib/lib$(PROJECT_LIBRARY_NAME).so
|
|
||||||
compile_project_code: $(OBJS)
|
|
||||||
$(CC) -o $(PROJECT_BUILD_PATH)/lib/$(ANDROID_ARCH_NAME)/lib$(PROJECT_LIBRARY_NAME).so $(OBJS) -shared $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS)
|
|
||||||
|
|
||||||
# Compile all .c files required into object (.o) files
|
|
||||||
# NOTE: Those files will be linked into a shared library
|
|
||||||
$(PROJECT_BUILD_PATH)/obj/%.o:%.c
|
|
||||||
$(CC) -c $^ -o $@ $(INCLUDE_PATHS) $(CFLAGS) --sysroot=$(ANDROID_TOOLCHAIN)/sysroot
|
|
||||||
|
|
||||||
# Compile project .java code into .class (Java bytecode)
|
|
||||||
compile_project_class:
|
|
||||||
$(JAVA_HOME)/bin/javac -verbose -source 1.7 -target 1.7 -d $(PROJECT_BUILD_PATH)/obj -bootclasspath $(JAVA_HOME)/jre/lib/rt.jar -classpath $(ANDROID_HOME)/platforms/android-$(ANDROID_API_VERSION)/android.jar;$(PROJECT_BUILD_PATH)/obj -sourcepath $(PROJECT_BUILD_PATH)/src $(PROJECT_BUILD_PATH)/src/com/$(APP_COMPANY_NAME)/$(APP_PRODUCT_NAME)/R.java $(PROJECT_BUILD_PATH)/src/com/$(APP_COMPANY_NAME)/$(APP_PRODUCT_NAME)/NativeLoader.java
|
|
||||||
|
|
||||||
# Compile .class files into Dalvik executable bytecode (.dex)
|
|
||||||
# NOTE: Since Android 5.0, Dalvik interpreter (JIT) has been replaced by ART (AOT)
|
|
||||||
compile_project_class_dex:
|
|
||||||
$(ANDROID_BUILD_TOOLS)/dx --verbose --dex --output=$(PROJECT_BUILD_PATH)/bin/classes.dex $(PROJECT_BUILD_PATH)/obj
|
|
||||||
|
|
||||||
# Create Android APK package: bin/$(PROJECT_NAME).unsigned.apk
|
|
||||||
# NOTE: Requires compiled classes.dex and lib$(PROJECT_LIBRARY_NAME).so
|
|
||||||
# NOTE: Use -A resources to define additional directory in which to find raw asset files
|
|
||||||
create_project_apk_package:
|
|
||||||
$(ANDROID_BUILD_TOOLS)/aapt package -f -M $(PROJECT_BUILD_PATH)/AndroidManifest.xml -S $(PROJECT_BUILD_PATH)/res -A $(PROJECT_BUILD_PATH)/assets -I $(ANDROID_HOME)/platforms/android-$(ANDROID_API_VERSION)/android.jar -F $(PROJECT_BUILD_PATH)/bin/$(PROJECT_NAME).unsigned.apk $(PROJECT_BUILD_PATH)/bin
|
|
||||||
cd $(PROJECT_BUILD_PATH) && $(ANDROID_BUILD_TOOLS)/aapt add bin/$(PROJECT_NAME).unsigned.apk lib/$(ANDROID_ARCH_NAME)/lib$(PROJECT_LIBRARY_NAME).so $(PROJECT_SHARED_LIBS)
|
|
||||||
|
|
||||||
# Create signed APK package using generated Key: bin/$(PROJECT_NAME).signed.apk
|
|
||||||
sign_project_apk_package:
|
|
||||||
$(JAVA_HOME)/bin/jarsigner -keystore $(PROJECT_BUILD_PATH)/$(PROJECT_NAME).keystore -storepass $(APP_KEYSTORE_PASS) -keypass $(APP_KEYSTORE_PASS) -signedjar $(PROJECT_BUILD_PATH)/bin/$(PROJECT_NAME).signed.apk $(PROJECT_BUILD_PATH)/bin/$(PROJECT_NAME).unsigned.apk $(PROJECT_NAME)Key
|
|
||||||
|
|
||||||
# Create zip-aligned APK package: $(PROJECT_NAME).apk
|
|
||||||
zipalign_project_apk_package:
|
|
||||||
$(ANDROID_BUILD_TOOLS)/zipalign -f 4 $(PROJECT_BUILD_PATH)/bin/$(PROJECT_NAME).signed.apk $(PROJECT_NAME).apk
|
|
||||||
|
|
||||||
# Install $(PROJECT_NAME).apk to default emulator/device
|
|
||||||
# NOTE: Use -e (emulator) or -d (device) parameters if required
|
|
||||||
install:
|
|
||||||
$(ANDROID_PLATFORM_TOOLS)/adb install --abi $(ANDROID_ARCH_NAME) -rds $(PROJECT_NAME).apk
|
|
||||||
|
|
||||||
# Check supported ABI for the device (armeabi-v7a, arm64-v8a, x86, x86_64)
|
|
||||||
check_device_abi:
|
|
||||||
$(ANDROID_PLATFORM_TOOLS)/adb shell getprop ro.product.cpu.abi
|
|
||||||
|
|
||||||
# Monitorize output log coming from device, only raylib tag
|
|
||||||
logcat:
|
|
||||||
$(ANDROID_PLATFORM_TOOLS)/adb logcat -c
|
|
||||||
$(ANDROID_PLATFORM_TOOLS)/adb logcat raylib:V *:S
|
|
||||||
|
|
||||||
# Install and monitorize $(PROJECT_NAME).apk to default emulator/device
|
|
||||||
deploy:
|
|
||||||
$(ANDROID_PLATFORM_TOOLS)/adb install -r $(PROJECT_NAME).apk
|
|
||||||
$(ANDROID_PLATFORM_TOOLS)/adb logcat -c
|
|
||||||
$(ANDROID_PLATFORM_TOOLS)/adb logcat raylib:V *:S
|
|
||||||
|
|
||||||
#$(ANDROID_PLATFORM_TOOLS)/adb logcat *:W
|
|
||||||
|
|
||||||
# Clean everything
|
|
||||||
clean:
|
|
||||||
del $(PROJECT_BUILD_PATH)\* /f /s /q
|
|
||||||
rmdir $(PROJECT_BUILD_PATH) /s /q
|
|
||||||
@echo Cleaning done
|
|
||||||
Binary file not shown.
File diff suppressed because it is too large
Load diff
Binary file not shown.
|
Before Width: | Height: | Size: 2.2 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,16 +0,0 @@
|
||||||
1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,
|
|
||||||
1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,
|
|
||||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
|
||||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
|
||||||
0,0,1,1,1,1,2,2,2,1,1,1,0,0,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,
|
|
||||||
0,0,1,1,1,1,2,2,2,1,1,1,0,0,1,1,1,2,2,2,1,1,1,1,0,0,1,1,1,1,0,0,
|
|
||||||
0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,0,0,1,1,1,1,0,0,
|
|
||||||
0,0,1,1,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,1,1,1,0,0,0,0,0,0,0,0,
|
|
||||||
1,1,1,1,2,2,2,2,2,2,2,2,0,0,1,1,1,2,2,2,1,1,1,1,0,0,0,0,0,0,0,0,
|
|
||||||
1,1,1,1,2,2,2,2,2,2,2,2,0,0,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,
|
|
||||||
1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
|
||||||
1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,1,2,2,2,2,2,2,1,1,
|
|
||||||
0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,2,2,2,2,2,2,1,1,
|
|
||||||
0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,1,1,
|
|
||||||
0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,1,1,
|
|
||||||
0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,1,1,0,0,1,2,2,2,2,2,2,2,2,0,0
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 883 B |
Binary file not shown.
|
Before Width: | Height: | Size: 4.8 KiB |
|
|
@ -1,34 +0,0 @@
|
||||||
.furniture
|
|
||||||
.state: 0-Block, 1-Alpha, 2-Breakable
|
|
||||||
.f setId cellX cellY state counter
|
|
||||||
.puff and sits
|
|
||||||
f 3 0 4 0 0
|
|
||||||
f 3 13 0 0 0
|
|
||||||
f 3 22 0 0 0
|
|
||||||
f 3 21 11 0 0
|
|
||||||
f 2 19 15 0 0
|
|
||||||
f 2 30 5 0 0
|
|
||||||
f 4 12 4 0 0
|
|
||||||
.wood pieces
|
|
||||||
f 26 3 0 0 0
|
|
||||||
f 27 4 10 0 0
|
|
||||||
f 27 24 7 0 0
|
|
||||||
f 17 30 15 0 0
|
|
||||||
.kitchen
|
|
||||||
f 11 0 15 0 0
|
|
||||||
f 13 0 12 0 0
|
|
||||||
.sofa and bed (alpha)
|
|
||||||
f 14 4 7 1 0
|
|
||||||
f 10 24 11 1 0
|
|
||||||
.glass and tables (alpha)
|
|
||||||
f 9 17 4 1 0
|
|
||||||
f 16 6 4 1 0
|
|
||||||
f 16 10 15 1 0
|
|
||||||
f 15 22 15 1 0
|
|
||||||
.plants (breakable)
|
|
||||||
f 6 0 6 2 1800
|
|
||||||
f 6 12 10 2 1800
|
|
||||||
f 7 17 0 2 1200
|
|
||||||
f 7 15 15 2 1200
|
|
||||||
f 8 13 15 2 2000
|
|
||||||
f 8 24 5 2 2000
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 96 KiB |
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue