add glew support; fixed cmake to pack game

This commit is contained in:
VisualGMQ 2022-02-18 16:33:24 +08:00
parent fe12fb4c70
commit e3278bea9b
10 changed files with 96 additions and 26 deletions

View File

@ -12,7 +12,6 @@ set(ENGINE_NAME tinyengine)
aux_source_directory(src/tinyengine ENGINE_SRC) aux_source_directory(src/tinyengine ENGINE_SRC)
aux_source_directory(src/component ENGINE_SRC) aux_source_directory(src/component ENGINE_SRC)
aux_source_directory(src/tinyengine/ecs ENGINE_SRC) aux_source_directory(src/tinyengine/ecs ENGINE_SRC)
aux_source_directory(libs/glad/src ENGINE_SRC)
aux_source_directory(libs/stb_image ENGINE_SRC) aux_source_directory(libs/stb_image ENGINE_SRC)
aux_source_directory(libs/miniaudio/ ENGINE_SRC) aux_source_directory(libs/miniaudio/ ENGINE_SRC)
@ -25,9 +24,36 @@ add_subdirectory(libs/glfw)
target_include_directories( target_include_directories(
${ENGINE_NAME} ${ENGINE_NAME}
PUBLIC include libs/glad/include libs/stb_image libs/miniaudio # /usr/local/Cellar/glm/0.9.9.8/include PUBLIC include libs/stb_image libs/miniaudio
) )
option(USE_GLEW "use glew rather than glad" OFF)
if (USE_GLEW)
message(STATUS "use glew to load opengl functions")
set(GLEW_USE_STATIC_LIBS ON)
find_package(GLEW REQUIRED)
target_link_libraries(
${ENGINE_NAME}
PUBLIC GLEW::GLEW
)
target_compile_definitions(
${ENGINE_NAME}
PUBLIC $<$<BOOL:"${USE_GLEW}">:TINYENGINE_USE_GLEW>
)
else()
message(STATUS "use glad to load opengl functions, this only work on MacOS")
target_include_directories(
${ENGINE_NAME}
PUBLIC libs/glad/include
)
aux_source_directory(libs/glad/src GLAD_SRC)
target_sources(
${ENGINE_NAME}
PUBLIC ${GLAD_SRC}
)
endif()
target_link_libraries( target_link_libraries(
${ENGINE_NAME} ${ENGINE_NAME}
PUBLIC glfw PUBLIC glfw
@ -75,6 +101,22 @@ add_custom_target(
VERBATIM VERBATIM
) )
add_custom_target(
Pack
COMMAND ${CMAKE_COMMAND} -E remove_directory output
COMMAND ${CMAKE_COMMAND} -E make_directory output
COMMAND ${CMAKE_COMMAND} -E make_directory output/game
COMMAND ${CMAKE_COMMAND} -E copy ./build/${PROJECT_NAME} output/game/${PROJECT_NAME}
COMMAND ${CMAKE_COMMAND} -E copy_directory ./assets output/game/assets
COMMAND ${CMAKE_COMMAND} -E remove_directory ./output/game/assets/test
COMMAND ${CMAKE_COMMAND} -E copy ./HowToPlay.md output/
COMMAND ${CMAKE_COMMAND} -E copy_directory ./snapshot output/snapshot
DEPENDS ${PROJECT_NAME}
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMENT "pack games"
VERBATIM
)
############# #############
# unit test # unit test
############# #############

View File

@ -1,29 +1,46 @@
# SpaceSector # SpaceWar
为1MGames游戏开发赛制作的游戏。 为1MGames游戏开发赛制作的游戏。
## 编译方法 ## 编译方法
使用CMake 3.20及以上进行编译。目前只能在Mac平台下编译因为我用的glad是Mac专属你也可以将你平台的glad替换`libs/glad`文件夹来编译glad指定OpenGL3.3 Core版本 编译平台为MacOS在MacOS Big Sur 11.6中编译成功且结果在1M以下也可以使用`glew`或平台相关`glad`在其他平台编译,编译结果**不保证在1M以下**,仅仅是为了方便不同平台进行编译。
使用CMake 3.20及以上进行编译。
```bash ```bash
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build cmake --build build
``` ```
如果想要使用`glew`,可以通过以下命令:
```bash
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DUSE_GLEW=ON
cmake --build build
```
cmake会在你的电脑上寻找`glew`。
也可以将你平台的glad替换`libs/glad`文件夹来使用`glad`编译glad请指定OpenGL3.3 Core版本。
如果想要压缩文件至1M以下你需要有`strip`程序和`upx`程序,并执行: 如果想要压缩文件至1M以下你需要有`strip`程序和`upx`程序,并执行:
```bash ```bash
cmake --build build --target CompressExe cmake --build build --target CompressExe
``` ```
编译好后执行pack程序打包 编译好后执行pack命令打包
```bash ```bash
pack.sh cmakd --build build --target Pack
``` ```
最终的结果在`output`文件夹下。 最终的结果在`output`文件夹下:
* game包含了游戏本体
* snapshot包含了游戏的截图
* HowToPlay.md游戏说明
## 游戏截图 ## 游戏截图
@ -33,6 +50,8 @@ pack.sh
![gaming](./snapshot/gaming.png) ![gaming](./snapshot/gaming.png)
![gaming2](./snapshot/gaming2.png)
## 游戏操作 ## 游戏操作
[游戏操作](./HowToPlay.md) [游戏操作](./HowToPlay.md)

View File

@ -63,8 +63,6 @@ public:
float liveTime; float liveTime;
}; };
class SpaceshipWeaponCmpt: public Component { class SpaceshipWeaponCmpt: public Component {
public: public:
enum Type { enum Type {

View File

@ -1,6 +1,11 @@
#pragma once #pragma once
#include "glad/gl.h" #ifdef TINYENGINE_USE_GLEW
#include "GL/glew.h"
#else
#include "glad/gl.h"
#endif
#include "GLFW/glfw3.h" #include "GLFW/glfw3.h"
#include <string> #include <string>

12
pack.sh
View File

@ -1,12 +0,0 @@
#!/bin/bash
if [ -d "./output" ]; then
rm -r ./output
fi
mkdir output
cp ./build/SpaceWar output
cp -r ./assets output
rm -rf ./output/assets/test
cp ./HowToPlay.md output/
cp -r ./snapshot output

View File

@ -4,6 +4,11 @@
void SpaceScence::OnInit() { void SpaceScence::OnInit() {
Renderer::SetClearColor(Color{0, 0, 0, 255}); Renderer::SetClearColor(Color{0, 0, 0, 255});
Log("Entities size = %ld", Entities.Size());
Log("Bullets size = %ld", Bullets.Size());
for (int i = 0; i < 4; i++) {
Log("Group %d size = %ld", i, Groups[i].Size());
}
mode_ = Gaming; mode_ = Gaming;
@ -189,7 +194,7 @@ void SpaceScence::renderGUI() {
Renderer::SetCamera(guiCamera_); Renderer::SetCamera(guiCamera_);
int life = 0; int life = 0;
if (PlayerSpaceship && PlayerSpaceship->IsAlive()) { if (PlayerSpaceship && PlayerSpaceship->IsAlive() && PlayerSpaceship->Has<LifeCmpt>()) {
life = PlayerSpaceship->Get<LifeCmpt>()->hp; life = PlayerSpaceship->Get<LifeCmpt>()->hp;
} }
float xOffset = 16 * life; float xOffset = 16 * life;
@ -203,10 +208,12 @@ void SpaceScence::renderGUI() {
if (PlayerSpaceship->Has<FreightShipCmpt>()) { if (PlayerSpaceship->Has<FreightShipCmpt>()) {
renderWeapons(PlayerSpaceship->Get<FreightShipCmpt>()->weapon, nullptr); renderWeapons(PlayerSpaceship->Get<FreightShipCmpt>()->weapon, nullptr);
} else { } else {
if (PlayerSpaceship->Has<FightShipCmpt>()) {
auto fightShip = PlayerSpaceship->Get<FightShipCmpt>(); auto fightShip = PlayerSpaceship->Get<FightShipCmpt>();
renderWeapons(fightShip->weapon1, fightShip->weapon2); renderWeapons(fightShip->weapon1, fightShip->weapon2);
} }
} }
}
drawGroupHp(); drawGroupHp();
} }
@ -246,6 +253,7 @@ void SpaceScence::renderMiniMap() {
for (auto& entity: Entities) { for (auto& entity: Entities) {
if (entity != PlayerSpaceship) { if (entity != PlayerSpaceship) {
if (!entity->Has<MoveCmpt>()) continue;
const auto& pos = entity->Get<MoveCmpt>()->position; const auto& pos = entity->Get<MoveCmpt>()->position;
Point entityOnMapPos = (pos - PlayerSpaceship->Get<MoveCmpt>()->position) * Size{mapRect.w, mapRect.h} / (GameWindowSize * 8) + Point entityOnMapPos = (pos - PlayerSpaceship->Get<MoveCmpt>()->position) * Size{mapRect.w, mapRect.h} / (GameWindowSize * 8) +
Point{mapRect.x, mapRect.y} + Size{mapRect.w, mapRect.h} / 2; Point{mapRect.x, mapRect.y} + Size{mapRect.w, mapRect.h} / 2;
@ -257,6 +265,9 @@ void SpaceScence::renderMiniMap() {
} }
} }
} }
Renderer::SetDrawColor(Color{1, 1, 1, 1});
Renderer::FillRect(Rect{mapRect.x + mapRect.w / 2, mapRect.y + mapRect.h / 2,
2, 2});
} }
void SpaceScence::renderWeapons(SpaceshipWeaponCmpt* weapon1, SpaceshipWeaponCmpt* weapon2) { void SpaceScence::renderWeapons(SpaceshipWeaponCmpt* weapon1, SpaceshipWeaponCmpt* weapon2) {

View File

@ -31,10 +31,17 @@ void Engine::Init(const std::string& title, const Size& size, Scence* scence) {
glfwSetFramebufferSizeCallback(window_, OnWindowResize); glfwSetFramebufferSizeCallback(window_, OnWindowResize);
glfwSetMouseButtonCallback(window_, MouseBtnCallback); glfwSetMouseButtonCallback(window_, MouseBtnCallback);
#ifdef TINYENGINE_USE_GLEW
if (GLEW_OK != glewInit()) {
glfwTerminate();
FATAL_ERROR("glew init failed");
}
#else
if (!gladLoadGL(glfwGetProcAddress)) { if (!gladLoadGL(glfwGetProcAddress)) {
glfwTerminate(); glfwTerminate();
FATAL_ERROR("glad load failed"); FATAL_ERROR("glad load failed");
} }
#endif
int width, height; int width, height;
glfwGetFramebufferSize(GetWindow(), &width, &height); glfwGetFramebufferSize(GetWindow(), &width, &height);