initial scaffold structure

This commit is contained in:
2026-04-06 13:48:06 -04:00
parent a0a27a665e
commit 36d7da19d1
13 changed files with 641 additions and 0 deletions
+16
View File
@@ -0,0 +1,16 @@
*.d
*.o
*.a
*.lib
*.dll
*.so
*.so.*
*.dylib
*.exe
*.out
*.dSYM/
*.su
*.idb
*.pdb
obj/
bin/
+4
View File
@@ -0,0 +1,4 @@
# scaffold
A game engine template built on skele and stk.
+139
View File
@@ -0,0 +1,139 @@
.include "config.mk"
GL_LIB = -lGL
LDFLAGS_PLAT = -L/usr/local/lib
CFLAGS_PLAT = -I/usr/local/include
SKELE_INC =
SKELE_LIB =
CLIENT_BIN = ${GAME_NAME}_client
GLCLIENT_BIN = ${GAME_NAME}_glclient
SERVER_BIN = ${GAME_NAME}_server
.if ${LINK_TYPE:Ustatic} == "dynamic"
LINK_SKELE = -lskele
LINK_GLSKELE = -lglskele
LINK_SKELESRV = -lskeleserver
LINK_STK = -lstk
.else
LINK_SKELE = -Wl,-Bstatic -lskele -Wl,-Bdynamic
LINK_GLSKELE = -Wl,-Bstatic -lglskele -Wl,-Bdynamic
LINK_SKELESRV = -Wl,-Bstatic -lskeleserver -Wl,-Bdynamic
LINK_STK = -Wl,-Bstatic -lstk -Wl,-Bdynamic
.endif
CFLAGS_BASE = -Wall -Wpedantic -I${.CURDIR}/${INC_DIR} ${SKELE_INC} \
-std=c99 ${CFLAGS_PLAT} ${DEBUG_FLAGS}
SOFT_CLIENT_SRCS = src/client/main.c
GL_CLIENT_SRCS = src/gl_client/main.c
SERVER_SRCS = src/server/main.c
ALL_SOFT_SRCS = ${GAME_SRCS} ${SOFT_CLIENT_SRCS}
ALL_GL_SRCS = ${GAME_SRCS} ${GL_CLIENT_SRCS}
ALL_SERVER_SRCS = ${GAME_SRCS} ${SERVER_SRCS}
SOFT_DEBUG_OBJS = ${ALL_SOFT_SRCS:S/.c$/.o/:S/^/${.CURDIR}\/obj\/debug\/soft\//}
GL_DEBUG_OBJS = ${ALL_GL_SRCS:S/.c$/.o/:S/^/${.CURDIR}\/obj\/debug\/gl\//}
SERVER_DEBUG_OBJS = ${ALL_SERVER_SRCS:S/.c$/.o/:S/^/${.CURDIR}\/obj\/debug\/server\//}
SOFT_RELEASE_OBJS = ${ALL_SOFT_SRCS:S/.c$/.o/:S/^/${.CURDIR}\/obj\/release\/soft\//}
GL_RELEASE_OBJS = ${ALL_GL_SRCS:S/.c$/.o/:S/^/${.CURDIR}\/obj\/release\/gl\//}
SERVER_RELEASE_OBJS = ${ALL_SERVER_SRCS:S/.c$/.o/:S/^/${.CURDIR}\/obj\/release\/server\//}
PREFIX ?= /usr/local
MODE ?= debug
.PHONY: all debug release client glclient server install uninstall clean run run_gl
all: debug
debug: ${.CURDIR}/${BIN_DIR}/debug/${CLIENT_BIN} \
${.CURDIR}/${BIN_DIR}/debug/${GLCLIENT_BIN} \
${.CURDIR}/${BIN_DIR}/debug/${SERVER_BIN}
release: ${.CURDIR}/${BIN_DIR}/release/${CLIENT_BIN} \
${.CURDIR}/${BIN_DIR}/release/${GLCLIENT_BIN} \
${.CURDIR}/${BIN_DIR}/release/${SERVER_BIN}
client: ${.CURDIR}/${BIN_DIR}/debug/${CLIENT_BIN}
glclient: ${.CURDIR}/${BIN_DIR}/debug/${GLCLIENT_BIN}
server: ${.CURDIR}/${BIN_DIR}/debug/${SERVER_BIN}
run: client
${.CURDIR}/${BIN_DIR}/debug/${CLIENT_BIN}
run_gl: glclient
${.CURDIR}/${BIN_DIR}/debug/${GLCLIENT_BIN}
${.CURDIR}/${BIN_DIR}/debug/${CLIENT_BIN}: ${SOFT_DEBUG_OBJS}
@mkdir -p ${.TARGET:H}
${CC} -o ${.TARGET} ${.ALLSRC} ${SKELE_LIB} ${LINK_SKELE} ${LINK_STK} -lSDL3 ${LDFLAGS_PLAT}
${.CURDIR}/${BIN_DIR}/debug/${GLCLIENT_BIN}: ${GL_DEBUG_OBJS}
@mkdir -p ${.TARGET:H}
${CC} -o ${.TARGET} ${.ALLSRC} ${SKELE_LIB} ${LINK_GLSKELE} ${LINK_STK} -lSDL3 ${GL_LIB} ${LDFLAGS_PLAT}
${.CURDIR}/${BIN_DIR}/debug/${SERVER_BIN}: ${SERVER_DEBUG_OBJS}
@mkdir -p ${.TARGET:H}
${CC} -o ${.TARGET} ${.ALLSRC} ${SKELE_LIB} ${LINK_SKELESRV} ${LINK_STK} ${LDFLAGS_PLAT}
${.CURDIR}/${BIN_DIR}/release/${CLIENT_BIN}: ${SOFT_RELEASE_OBJS}
@mkdir -p ${.TARGET:H}
${CC} -s -o ${.TARGET} ${.ALLSRC} ${SKELE_LIB} ${LINK_SKELE} ${LINK_STK} -lSDL3 ${LDFLAGS_PLAT}
${.CURDIR}/${BIN_DIR}/release/${GLCLIENT_BIN}: ${GL_RELEASE_OBJS}
@mkdir -p ${.TARGET:H}
${CC} -s -o ${.TARGET} ${.ALLSRC} ${SKELE_LIB} ${LINK_GLSKELE} ${LINK_STK} -lSDL3 ${GL_LIB} ${LDFLAGS_PLAT}
${.CURDIR}/${BIN_DIR}/release/${SERVER_BIN}: ${SERVER_RELEASE_OBJS}
@mkdir -p ${.TARGET:H}
${CC} -s -o ${.TARGET} ${.ALLSRC} ${SKELE_LIB} ${LINK_SKELESRV} ${LINK_STK} ${LDFLAGS_PLAT}
.for _src in ${ALL_SOFT_SRCS}
${.CURDIR}/obj/debug/soft/${_src:S/.c$/.o/}: ${_src}
@mkdir -p ${.TARGET:H}
${CC} ${CFLAGS_BASE} -g -O0 -MMD -MP -MT ${.TARGET} -MF ${.TARGET:S/.o$/.d/} -c ${.ALLSRC} -o ${.TARGET}
${.CURDIR}/obj/release/soft/${_src:S/.c$/.o/}: ${_src}
@mkdir -p ${.TARGET:H}
${CC} ${CFLAGS_BASE} -O2 -MMD -MP -MT ${.TARGET} -MF ${.TARGET:S/.o$/.d/} -c ${.ALLSRC} -o ${.TARGET}
.endfor
.for _src in ${ALL_GL_SRCS}
${.CURDIR}/obj/debug/gl/${_src:S/.c$/.o/}: ${_src}
@mkdir -p ${.TARGET:H}
${CC} ${CFLAGS_BASE} -g -O0 -MMD -MP -MT ${.TARGET} -MF ${.TARGET:S/.o$/.d/} -c ${.ALLSRC} -o ${.TARGET}
${.CURDIR}/obj/release/gl/${_src:S/.c$/.o/}: ${_src}
@mkdir -p ${.TARGET:H}
${CC} ${CFLAGS_BASE} -O2 -MMD -MP -MT ${.TARGET} -MF ${.TARGET:S/.o$/.d/} -c ${.ALLSRC} -o ${.TARGET}
.endfor
.for _src in ${ALL_SERVER_SRCS}
${.CURDIR}/obj/debug/server/${_src:S/.c$/.o/}: ${_src}
@mkdir -p ${.TARGET:H}
${CC} ${CFLAGS_BASE} -g -O0 -MMD -MP -MT ${.TARGET} -MF ${.TARGET:S/.o$/.d/} -c ${.ALLSRC} -o ${.TARGET}
${.CURDIR}/obj/release/server/${_src:S/.c$/.o/}: ${_src}
@mkdir -p ${.TARGET:H}
${CC} ${CFLAGS_BASE} -O2 -MMD -MP -MT ${.TARGET} -MF ${.TARGET:S/.o$/.d/} -c ${.ALLSRC} -o ${.TARGET}
.endfor
.-include "obj/debug/soft/*.d"
.-include "obj/debug/gl/*.d"
.-include "obj/debug/server/*.d"
.-include "obj/release/soft/*.d"
.-include "obj/release/gl/*.d"
.-include "obj/release/server/*.d"
install:
install -d ${PREFIX}/bin
install -m 755 ${.CURDIR}/${BIN_DIR}/release/${CLIENT_BIN} ${PREFIX}/bin/${CLIENT_BIN}
install -m 755 ${.CURDIR}/${BIN_DIR}/release/${GLCLIENT_BIN} ${PREFIX}/bin/${GLCLIENT_BIN}
install -m 755 ${.CURDIR}/${BIN_DIR}/release/${SERVER_BIN} ${PREFIX}/bin/${SERVER_BIN}
uninstall:
rm -f ${PREFIX}/bin/${CLIENT_BIN}
rm -f ${PREFIX}/bin/${GLCLIENT_BIN}
rm -f ${PREFIX}/bin/${SERVER_BIN}
clean:
rm -rf ${.CURDIR}/${OBJ_DIR} ${.CURDIR}/${BIN_DIR}
+16
View File
@@ -0,0 +1,16 @@
@echo off
if "%1"=="run" (
if "%2"=="" (
make -f gmake.mk run MODE=debug
) else (
make -f gmake.mk run MODE=%2
)
) else if "%1"=="run_gl" (
if "%2"=="" (
make -f gmake.mk run_gl MODE=debug
) else (
make -f gmake.mk run_gl MODE=%2
)
) else (
make -f gmake.mk %*
)
Executable
+51
View File
@@ -0,0 +1,51 @@
#!/bin/sh
OS=$(uname -s | tr '[:upper:]' '[:lower:]')
if [ "$OS" = "freebsd" ]; then
MK_FILE="bmake.mk"
else
MK_FILE="gmake.mk"
fi
if grep -q "Raspberry Pi 5" /proc/device-tree/model 2>/dev/null; then
GL_MAJOR=3
GL_MINOR=1
else
GL_MAJOR=3
GL_MINOR=3
fi
HAS_INSTALL=0
HAS_UNINSTALL=0
for arg in "$@"; do
case "$arg" in
install) HAS_INSTALL=1 ;;
uninstall) HAS_UNINSTALL=1 ;;
esac
done
if [ "$HAS_INSTALL" = "1" ] || [ "$HAS_UNINSTALL" = "1" ]; then
if [ "$HAS_INSTALL" = "1" ]; then
make -f "$MK_FILE" release GL_MAJOR=$GL_MAJOR GL_MINOR=$GL_MINOR
fi
if [ "$(id -u)" = "0" ]; then
PRIV=""
elif command -v doas > /dev/null 2>&1; then
PRIV="doas"
elif command -v sudo > /dev/null 2>&1; then
PRIV="sudo"
else
echo "error: install requires root. neither doas nor sudo found." >&2
exit 1
fi
$PRIV make -f "$MK_FILE" "$@" GL_MAJOR=$GL_MAJOR GL_MINOR=$GL_MINOR
elif [ "$1" = "run" ]; then
make -f "$MK_FILE" run GL_MAJOR=$GL_MAJOR GL_MINOR=$GL_MINOR
elif [ "$1" = "run_gl" ]; then
make -f "$MK_FILE" run_gl GL_MAJOR=$GL_MAJOR GL_MINOR=$GL_MINOR
else
make -f "$MK_FILE" "$@" GL_MAJOR=$GL_MAJOR GL_MINOR=$GL_MINOR
fi
+6
View File
@@ -0,0 +1,6 @@
-std=c99
-Wall
-Wpedantic
-Iinclude
-I/usr/include/skele
-I/usr/local/include/skele
+13
View File
@@ -0,0 +1,13 @@
GAME_NAME = game
SRC_DIR = src
INC_DIR = include
OBJ_DIR = obj
BIN_DIR = bin
LINK_TYPE ?= static
GAME_SRCS = \
src/game.c
DEBUG_FLAGS ?=
+174
View File
@@ -0,0 +1,174 @@
ifeq ($(OS),Windows_NT)
CLOCK_SRC := src/platform/clock/win32.c
else
CLOCK_SRC := src/platform/clock/posix.c
endif
include config.mk
ifeq ($(OS),Windows_NT)
SHELL := cmd.exe
GL_LIB := -lopengl32
LDFLAGS_PLAT :=
CFLAGS_PLAT :=
SKELE_INC := -I"C:/mingw64/include"
SKELE_LIB := -L"C:/mingw64/lib"
CLIENT_BIN := $(GAME_NAME)_client.exe
GLCLIENT_BIN := $(GAME_NAME)_glclient.exe
SERVER_BIN := $(GAME_NAME)_server.exe
MKDIR = if not exist $(subst /,\,$(1)) mkdir $(subst /,\,$(1))
RMDIR = if exist $(subst /,\,$(1)) rd /s /q $(subst /,\,$(1))
else ifeq ($(shell uname),FreeBSD)
GL_LIB := -lGL
LDFLAGS_PLAT := -L/usr/local/lib
CFLAGS_PLAT := -I/usr/local/include
SKELE_INC :=
SKELE_LIB :=
CLIENT_BIN := $(GAME_NAME)_client
GLCLIENT_BIN := $(GAME_NAME)_glclient
SERVER_BIN := $(GAME_NAME)_server
MKDIR = mkdir -p $(1)
RMDIR = rm -rf $(1)
else
GL_LIB := -lGL
LDFLAGS_PLAT :=
CFLAGS_PLAT :=
SKELE_INC :=
SKELE_LIB :=
CLIENT_BIN := $(GAME_NAME)_client
GLCLIENT_BIN := $(GAME_NAME)_glclient
SERVER_BIN := $(GAME_NAME)_server
MKDIR = mkdir -p $(1)
RMDIR = rm -rf $(1)
endif
# linking
ifeq ($(LINK_TYPE),dynamic)
LINK_SKELE := -lskele
LINK_GLSKELE := -lglskele
LINK_SKELESRV := -lskeleserver
LINK_STK := -lstk
else
LINK_SKELE := -Wl,-Bstatic -lskele -Wl,-Bdynamic
LINK_GLSKELE := -Wl,-Bstatic -lglskele -Wl,-Bdynamic
LINK_SKELESRV := -Wl,-Bstatic -lskeleserver -Wl,-Bdynamic
LINK_STK := -Wl,-Bstatic -lstk -Wl,-Bdynamic
endif
RELEASE_LDFLAGS := -s
CFLAGS_BASE := -Wall -Wpedantic -I$(INC_DIR) -Iskele/include $(SKELE_INC) \
-std=c99 $(CFLAGS_PLAT) $(DEBUG_FLAGS)
SOFT_CLIENT_SRCS := src/client/main.c
GL_CLIENT_SRCS := src/gl_client/main.c
SERVER_SRCS := src/server/main.c
ALL_SOFT_SRCS := $(GAME_SRCS) $(SOFT_CLIENT_SRCS)
ALL_GL_SRCS := $(GAME_SRCS) $(GL_CLIENT_SRCS)
ALL_SERVER_SRCS := $(GAME_SRCS) $(SERVER_SRCS)
SOFT_DEBUG_OBJS := $(ALL_SOFT_SRCS:%.c=obj/debug/soft/%.o)
GL_DEBUG_OBJS := $(ALL_GL_SRCS:%.c=obj/debug/gl/%.o)
SERVER_DEBUG_OBJS := $(ALL_SERVER_SRCS:%.c=obj/debug/server/%.o)
SOFT_RELEASE_OBJS := $(ALL_SOFT_SRCS:%.c=obj/release/soft/%.o)
GL_RELEASE_OBJS := $(ALL_GL_SRCS:%.c=obj/release/gl/%.o)
SERVER_RELEASE_OBJS := $(ALL_SERVER_SRCS:%.c=obj/release/server/%.o)
PREFIX ?= /usr
MODE ?= debug
.PHONY: all debug release client glclient server \
install uninstall clean run run_gl
all: debug
debug: \
$(BIN_DIR)/debug/$(CLIENT_BIN) \
$(BIN_DIR)/debug/$(GLCLIENT_BIN) \
$(BIN_DIR)/debug/$(SERVER_BIN)
release: \
$(BIN_DIR)/release/$(CLIENT_BIN) \
$(BIN_DIR)/release/$(GLCLIENT_BIN) \
$(BIN_DIR)/release/$(SERVER_BIN)
client: $(BIN_DIR)/debug/$(CLIENT_BIN)
glclient: $(BIN_DIR)/debug/$(GLCLIENT_BIN)
server: $(BIN_DIR)/debug/$(SERVER_BIN)
run: client
$(BIN_DIR)/debug/$(CLIENT_BIN)
run_gl: glclient
$(BIN_DIR)/debug/$(GLCLIENT_BIN)
$(BIN_DIR)/debug/$(CLIENT_BIN): $(SOFT_DEBUG_OBJS)
@$(call MKDIR,$(@D))
$(CC) -o $@ $^ $(SKELE_LIB) $(LINK_SKELE) $(LINK_STK) -lSDL3 $(LDFLAGS_PLAT)
$(BIN_DIR)/debug/$(GLCLIENT_BIN): $(GL_DEBUG_OBJS)
@$(call MKDIR,$(@D))
$(CC) -o $@ $^ $(SKELE_LIB) $(LINK_GLSKELE) $(LINK_STK) -lSDL3 $(GL_LIB) $(LDFLAGS_PLAT)
$(BIN_DIR)/debug/$(SERVER_BIN): $(SERVER_DEBUG_OBJS)
@$(call MKDIR,$(@D))
$(CC) -o $@ $^ $(SKELE_LIB) $(LINK_SKELESRV) $(LINK_STK) $(LDFLAGS_PLAT)
$(BIN_DIR)/release/$(CLIENT_BIN): $(SOFT_RELEASE_OBJS)
@$(call MKDIR,$(@D))
$(CC) $(RELEASE_LDFLAGS) -o $@ $^ $(SKELE_LIB) $(LINK_SKELE) $(LINK_STK) -lSDL3 $(LDFLAGS_PLAT)
$(BIN_DIR)/release/$(GLCLIENT_BIN): $(GL_RELEASE_OBJS)
@$(call MKDIR,$(@D))
$(CC) $(RELEASE_LDFLAGS) -o $@ $^ $(SKELE_LIB) $(LINK_GLSKELE) $(LINK_STK) -lSDL3 $(GL_LIB) $(LDFLAGS_PLAT)
$(BIN_DIR)/release/$(SERVER_BIN): $(SERVER_RELEASE_OBJS)
@$(call MKDIR,$(@D))
$(CC) $(RELEASE_LDFLAGS) -o $@ $^ $(SKELE_LIB) $(LINK_SKELESRV) $(LINK_STK) $(LDFLAGS_PLAT)
obj/debug/soft/%.o: %.c
@$(call MKDIR,$(@D))
$(CC) $(CFLAGS_BASE) -g -O0 -MMD -MP -c $< -o $@
obj/debug/gl/%.o: %.c
@$(call MKDIR,$(@D))
$(CC) $(CFLAGS_BASE) -g -O0 -MMD -MP -c $< -o $@
obj/debug/server/%.o: %.c
@$(call MKDIR,$(@D))
$(CC) $(CFLAGS_BASE) -g -O0 -MMD -MP -c $< -o $@
obj/release/soft/%.o: %.c
@$(call MKDIR,$(@D))
$(CC) $(CFLAGS_BASE) -O2 -MMD -MP -c $< -o $@
obj/release/gl/%.o: %.c
@$(call MKDIR,$(@D))
$(CC) $(CFLAGS_BASE) -O2 -MMD -MP -c $< -o $@
obj/release/server/%.o: %.c
@$(call MKDIR,$(@D))
$(CC) $(CFLAGS_BASE) -O2 -MMD -MP -c $< -o $@
-include $(wildcard obj/debug/soft/*.d)
-include $(wildcard obj/debug/gl/*.d)
-include $(wildcard obj/debug/server/*.d)
-include $(wildcard obj/release/soft/*.d)
-include $(wildcard obj/release/gl/*.d)
-include $(wildcard obj/release/server/*.d)
install:
install -d $(PREFIX)/bin
install -m 755 $(BIN_DIR)/release/$(CLIENT_BIN) $(PREFIX)/bin/$(CLIENT_BIN)
install -m 755 $(BIN_DIR)/release/$(GLCLIENT_BIN) $(PREFIX)/bin/$(GLCLIENT_BIN)
install -m 755 $(BIN_DIR)/release/$(SERVER_BIN) $(PREFIX)/bin/$(SERVER_BIN)
uninstall:
rm -f $(PREFIX)/bin/$(CLIENT_BIN)
rm -f $(PREFIX)/bin/$(GLCLIENT_BIN)
rm -f $(PREFIX)/bin/$(SERVER_BIN)
clean:
@$(call RMDIR,$(OBJ_DIR))
@$(call RMDIR,$(BIN_DIR))
+18
View File
@@ -0,0 +1,18 @@
#ifndef GAME_H
#define GAME_H
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
uint8_t game_init(void);
void game_shutdown(void);
void game_tick(void);
#ifdef __cplusplus
}
#endif
#endif /* GAME_H */
+75
View File
@@ -0,0 +1,75 @@
#include "game.h"
#include <skele/client/input.h>
#include <skele/client/video.h>
#include <skele/clock.h>
#include <skele/skele.h>
#include <stk/stk.h>
static uint8_t running = 1;
static void on_signal(void) { running = 0; }
int main(int argc, char *argv[])
{
skele_video_config_t video_cfg;
uint64_t last, now, elapsed;
(void)argc;
(void)argv;
skele_clock_init(on_signal);
if (skele_stk_setup() != SKELE_INIT_SUCCESS)
return 1;
if (skele_init() != SKELE_INIT_SUCCESS) {
skele_stk_teardown();
return 1;
}
video_cfg.render_width = SKELE_DEFAULT_RENDER_WIDTH;
video_cfg.render_height = SKELE_DEFAULT_RENDER_HEIGHT;
video_cfg.window_width = 0;
video_cfg.window_height = 0;
video_cfg.flags = 0;
if (skele_video_init(video_cfg) != SKELE_INIT_SUCCESS) {
skele_stk_teardown();
skele_shutdown();
return 1;
}
skele_video_set_title("game");
if (!game_init()) {
skele_video_shutdown();
skele_stk_teardown();
skele_shutdown();
return 1;
}
last = skele_time_ns();
while (running) {
if (!skele_input_poll())
break;
stk_poll();
now = skele_time_ns();
elapsed = now - last;
if (elapsed >= skele_tick_ns) {
game_tick();
last = now;
}
skele_video_present();
}
game_shutdown();
skele_video_shutdown();
skele_stk_teardown();
skele_shutdown();
return 0;
}
+5
View File
@@ -0,0 +1,5 @@
#include "game.h"
uint8_t game_init(void) { return 1; }
void game_shutdown(void) {}
void game_tick(void) {}
+75
View File
@@ -0,0 +1,75 @@
#include "game.h"
#include <skele/client/input.h>
#include <skele/client/video.h>
#include <skele/clock.h>
#include <skele/skele.h>
#include <stk/stk.h>
static uint8_t running = 1;
static void on_signal(void) { running = 0; }
int main(int argc, char *argv[])
{
skele_video_config_t video_cfg;
uint64_t last, now, elapsed;
(void)argc;
(void)argv;
skele_clock_init(on_signal);
if (skele_stk_setup() != SKELE_INIT_SUCCESS)
return 1;
if (skele_init() != SKELE_INIT_SUCCESS) {
skele_stk_teardown();
return 1;
}
video_cfg.render_width = SKELE_DEFAULT_RENDER_WIDTH;
video_cfg.render_height = SKELE_DEFAULT_RENDER_HEIGHT;
video_cfg.window_width = 0;
video_cfg.window_height = 0;
video_cfg.flags = 0;
if (skele_video_init(video_cfg) != SKELE_INIT_SUCCESS) {
skele_stk_teardown();
skele_shutdown();
return 1;
}
skele_video_set_title("game");
if (!game_init()) {
skele_video_shutdown();
skele_stk_teardown();
skele_shutdown();
return 1;
}
last = skele_time_ns();
while (running) {
if (!skele_input_poll())
break;
stk_poll();
now = skele_time_ns();
elapsed = now - last;
if (elapsed >= skele_tick_ns) {
game_tick();
last = now;
}
skele_video_present();
}
game_shutdown();
skele_video_shutdown();
skele_stk_teardown();
skele_shutdown();
return 0;
}
+49
View File
@@ -0,0 +1,49 @@
#include "game.h"
#include <skele/clock.h>
#include <skele/skele.h>
#include <stk/stk.h>
static uint8_t running = 1;
static void on_signal(void) { running = 0; }
int main(int argc, char *argv[])
{
uint64_t tick_start;
uint64_t elapsed;
(void)argc;
(void)argv;
skele_clock_init(on_signal);
if (skele_stk_setup() != SKELE_INIT_SUCCESS)
return 1;
if (skele_init() != SKELE_INIT_SUCCESS) {
skele_stk_teardown();
return 1;
}
if (!game_init()) {
skele_stk_teardown();
skele_shutdown();
return 1;
}
while (running) {
tick_start = skele_time_ns();
stk_poll();
game_tick();
elapsed = skele_time_ns() - tick_start;
if (elapsed < skele_tick_ns)
skele_sleep_ns(skele_tick_ns - elapsed);
}
game_shutdown();
skele_stk_teardown();
skele_shutdown();
return 0;
}