application separation

This commit is contained in:
veclav talica 2024-07-30 01:20:30 +03:00
parent 922e521867
commit a99cb340d8
23 changed files with 147 additions and 34 deletions

8
.gitignore vendored
View File

@ -1,3 +1,11 @@
# ignore executables
*
!*.*
!*/
!Makefile
**/*.exe
.vs/ .vs/
.vscode/ .vscode/
.idea/ .idea/

View File

@ -7,14 +7,16 @@ list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# dependencies # dependencies
find_package(SDL2 REQUIRED) find_package(SDL2 REQUIRED GLOBAL)
find_package(SDL2_image REQUIRED) find_package(SDL2_image REQUIRED GLOBAL)
find_package(SDL2_ttf REQUIRED) find_package(SDL2_ttf REQUIRED GLOBAL)
if (NOT CMAKE_BUILD_TYPE) if (NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Debug) set(CMAKE_BUILD_TYPE Debug)
endif () endif ()
set(TOWNENGINE_TARGET townengine CACHE INTERNAL "")
set(TOWNENGINE_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE INTERNAL "")
set(PHYSFS_BUILD_SHARED FALSE) set(PHYSFS_BUILD_SHARED FALSE)
set(PHYSFS_DISABLE_INSTALL TRUE) set(PHYSFS_DISABLE_INSTALL TRUE)
@ -49,26 +51,13 @@ set(TOWNENGINE_SOURCE_FILES
${SYSTEM_SOURCE_FILES} ${SYSTEM_SOURCE_FILES}
) )
list(TRANSFORM TOWNENGINE_SOURCE_FILES PREPEND ${TOWNENGINE_DIR}/)
set(GAME_SOURCE_FILES
src/game_api.h
src/game/game.c src/game/game.h
src/game/state.h
src/game/player.c src/game/player.h
src/game/world.c src/game/world.h
src/game/scenes/scene.c src/game/scenes/scene.h
src/game/scenes/title.c src/game/scenes/title.h
src/game/scenes/ingame.c src/game/scenes/ingame.h
)
# base engine code, reused for games and tools # base engine code, reused for games and tools
add_library(${PROJECT_NAME} ${TOWNENGINE_SOURCE_FILES}) add_library(${TOWNENGINE_TARGET} ${TOWNENGINE_SOURCE_FILES})
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${TOWNENGINE_SOURCE_FILES}) source_group(TREE ${TOWNENGINE_DIR} FILES ${TOWNENGINE_SOURCE_FILES})
set_target_properties(${PROJECT_NAME} PROPERTIES set_target_properties(${TOWNENGINE_TARGET} PROPERTIES
C_STANDARD 11 C_STANDARD 11
C_STANDARD_REQUIRED ON C_STANDARD_REQUIRED ON
C_EXTENSIONS ON) # extensions are required by stb_ds.h C_EXTENSIONS ON) # extensions are required by stb_ds.h
@ -161,18 +150,18 @@ endfunction()
function(link_and_include_deps target) function(link_and_include_deps target)
# header-only libraries should be marked as "system includes" # header-only libraries should be marked as "system includes"
# to suppress compiler warnings in their code (it's not my problem after all) # to suppress compiler warnings in their code (it's not my problem after all)
target_include_directories(${target} set(THIRD_PARTY_INCLUDES
SYSTEM
PRIVATE
third-party/physfs/src third-party/physfs/src
third-party/physfs/extras third-party/physfs/extras
third-party/libxm/include third-party/libxm/include
third-party/glad/include third-party/glad/include
third-party/stb third-party/stb
) )
list(TRANSFORM THIRD_PARTY_INCLUDES PREPEND ${TOWNENGINE_DIR}/)
target_include_directories(${target} SYSTEM PRIVATE ${THIRD_PARTY_INCLUDES})
# allow access to headers from any point in source tree # allow access to headers from any point in source tree
target_include_directories(${target} PRIVATE ./) target_include_directories(${target} PRIVATE ${TOWNENGINE_DIR})
target_link_libraries(${target} PUBLIC target_link_libraries(${target} PUBLIC
SDL2::SDL2 SDL2::SDL2
@ -197,7 +186,7 @@ function(use_townengine target)
# third-party libraries # third-party libraries
target_link_libraries(${target} PUBLIC target_link_libraries(${target} PUBLIC
${PROJECT_NAME} ${TOWNENGINE_TARGET}
SDL2::SDL2 SDL2::SDL2
SDL2::SDL2main SDL2::SDL2main
SDL2_image::SDL2_image SDL2_image::SDL2_image
@ -214,11 +203,10 @@ function(use_townengine target)
) )
endfunction() endfunction()
give_options(${PROJECT_NAME}) give_options(${TOWNENGINE_TARGET})
link_and_include_deps(${PROJECT_NAME}) link_and_include_deps(${TOWNENGINE_TARGET})
add_executable(game ${GAME_SOURCE_FILES}) add_subdirectory(apps/testgame)
use_townengine(game)
# zip up assets # zip up assets
# currently, you must run cmake from the project root dir for this to work correctly # currently, you must run cmake from the project root dir for this to work correctly

View File

@ -0,0 +1,23 @@
cmake_minimum_required(VERSION 3.21)
project(template LANGUAGES C)
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Debug)
endif()
# add root townengine cmake file
if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR})
add_subdirectory(../../ ../../../.build)
endif()
set(SOURCE_FILES
game.c game.h
)
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
use_townengine(${PROJECT_NAME})
set_target_properties(${PROJECT_NAME} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)

3
apps/template/build.sh Executable file
View File

@ -0,0 +1,3 @@
#!/bin/env sh
cmake -B .build "$@" && cmake --build .build

26
apps/template/game.c Normal file
View File

@ -0,0 +1,26 @@
#include "townengine/game_api.h"
#include "game.h"
#include "state.h"
#include <malloc.h>
void game_tick(void) {
/* do your initialization on first tick */
if (ctx.tick_count == 0) {
/* application data could be stored in ctx.udata and retrieved anywhere */
ctx.udata = ccalloc(1, sizeof (struct state));
}
/* a lot of data is accessible from `ctx`, look into `townengine/context.h` for more */
struct state *state = ctx.udata;
++state->counter;
}
void game_end(void) {
/* do your deinitialization here */
struct state *state = ctx.udata;
free(state);
}

13
apps/template/game.h Normal file
View File

@ -0,0 +1,13 @@
#ifndef GAME_H
#define GAME_H
#include "townengine/game_api.h"
#include <stdint.h>
void game_tick(void);
void game_end(void);
#endif

12
apps/template/state.h Normal file
View File

@ -0,0 +1,12 @@
#ifndef STATE_H
#define STATE_H
#include "townengine/game_api.h"
/* populate it with state information */
struct state {
uint64_t counter;
};
#endif

View File

@ -0,0 +1,31 @@
cmake_minimum_required(VERSION 3.21)
project(testgame LANGUAGES C)
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Debug)
endif()
# add root townengine cmake file
if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR})
add_subdirectory(../../ ../../../.build)
endif()
set(SOURCE_FILES
game.c game.h
state.h
player.c player.h
world.c world.h
scenes/scene.c scenes/scene.h
scenes/title.c scenes/title.h
scenes/ingame.c scenes/ingame.h
)
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
use_townengine(${PROJECT_NAME})
set_target_properties(${PROJECT_NAME} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)

3
apps/testgame/build.sh Executable file
View File

@ -0,0 +1,3 @@
#!/bin/env sh
cmake -B .build "$@" && cmake --build .build

View File

@ -11,12 +11,14 @@ static void ingame_tick(struct state *state) {
world_drawdef(scn->world); world_drawdef(scn->world);
player_calc(scn->player); player_calc(scn->player);
static t_camera cam = { .pos = { 0 }, .target = { 0, 0, -1 }, .up = { 0, -1, 0 } }; static t_camera cam = { .pos = { 0 }, .target = { 0, 0, -1 }, .up = { 0, -1, 0 }, .fov = (float)M_PI_2 };
if (input_is_action_pressed(&ctx.input, "player_left")) if (input_is_action_pressed(&ctx.input, "player_left"))
cam.pos.x -= 0.01f; cam.pos.x -= 0.01f;
if (input_is_action_pressed(&ctx.input, "player_right")) if (input_is_action_pressed(&ctx.input, "player_right"))
cam.pos.x += 0.01f; cam.pos.x += 0.01f;
if (input_is_action_pressed(&ctx.input, "player_jump"))
cam.pos.z -= 0.01f;
push_camera(&cam); push_camera(&cam);

View File

@ -3,7 +3,6 @@
#include "input.h" #include "input.h"
#include "util.h" #include "util.h"
#include "textures.h" #include "textures.h"
#include "game/game.h"
#include "private/audio.h" #include "private/audio.h"
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
@ -20,6 +19,11 @@
#include <limits.h> #include <limits.h>
/* application provided */
extern void game_tick(void);
extern void game_end(void);
static void poll_events(void) { static void poll_events(void) {
SDL_Event e; SDL_Event e;