Сервер: Game — authoritative-тик 20 Гц через uSockets timer, движение/коллизии танков и пуль, разрушаемые кирпичные стены, respawn, победа/поражение/ничья, технический проигрыш при дисконнекте. game.ready запускает матч, когда оба игрока в pvp-комнате готовы. Клиент: заведён Quintus.js (MIT, vendored) — Tank/Bullet/Wall спрайты, рендер по снапшотам game.state, keyboard-инпут (WASD/стрелки/space), экран результата матча. Найден и исправлен use-after-free: колбэк onFinished_ синхронно удалял Game изнутри его же метода — перенесено на uWS::Loop::defer.
50 lines
1.3 KiB
CMake
50 lines
1.3 KiB
CMake
cmake_minimum_required(VERSION 3.16)
|
|
project(cactoz_gameserver CXX C)
|
|
|
|
set(CMAKE_CXX_STANDARD 20)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
|
|
include(FetchContent)
|
|
|
|
FetchContent_Declare(
|
|
uwebsockets
|
|
GIT_REPOSITORY https://github.com/uNetworking/uWebSockets.git
|
|
GIT_TAG v20.79.0
|
|
)
|
|
FetchContent_MakeAvailable(uwebsockets)
|
|
|
|
# uWebSockets pulls uSockets in via a git submodule, which plain FetchContent
|
|
# does not check out. Fetch the exact commit uWebSockets v20.79.0 pins instead.
|
|
FetchContent_Declare(
|
|
usockets_src
|
|
GIT_REPOSITORY https://github.com/uNetworking/uSockets.git
|
|
GIT_TAG 86097c490263ab662d62e8e7b541390bdec7d149
|
|
)
|
|
FetchContent_MakeAvailable(usockets_src)
|
|
|
|
FetchContent_Declare(
|
|
json
|
|
GIT_REPOSITORY https://github.com/nlohmann/json.git
|
|
GIT_TAG v3.12.0
|
|
)
|
|
FetchContent_MakeAvailable(json)
|
|
|
|
file(GLOB USOCKETS_SOURCES
|
|
${usockets_src_SOURCE_DIR}/src/*.c
|
|
${usockets_src_SOURCE_DIR}/src/eventing/*.c
|
|
)
|
|
add_library(usockets STATIC ${USOCKETS_SOURCES})
|
|
target_include_directories(usockets PUBLIC ${usockets_src_SOURCE_DIR}/src)
|
|
target_compile_definitions(usockets PUBLIC LIBUS_NO_SSL LIBUS_USE_EPOLL)
|
|
|
|
add_executable(gameserver
|
|
src/main.cpp
|
|
src/Lobby.cpp
|
|
src/Game.cpp
|
|
)
|
|
target_include_directories(gameserver PRIVATE
|
|
${uwebsockets_SOURCE_DIR}/src
|
|
src
|
|
)
|
|
target_link_libraries(gameserver PRIVATE usockets nlohmann_json::nlohmann_json pthread z)
|