From e3f74ec8dd6e496db99ae864b2f4bad9d6dcd8f1 Mon Sep 17 00:00:00 2001 From: LazyJazz Date: Sun, 22 Dec 2024 21:00:12 -0800 Subject: [PATCH] Update statement --- README.md | 74 +++++++++-------------- src/battle_game/app/CMakeLists.txt | 2 +- src/battle_game/app/app.cpp | 1 - src/battle_game/core/CMakeLists.txt | 2 + src/battle_game/core/README.md | 22 ------- src/battle_game/core/game_core.h | 6 +- src/battle_game/core/selectable_units.cpp | 10 +-- src/battle_game/core/units/CMakeLists.txt | 14 +++++ src/battle_game/core/units/units.h | 3 - 9 files changed, 46 insertions(+), 88 deletions(-) create mode 100644 src/battle_game/core/units/CMakeLists.txt delete mode 100644 src/battle_game/core/units/units.h diff --git a/README.md b/README.md index 9ff9429b..b9e7a4f9 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,32 @@ # Project 2: Battle Game -[![Linux Build](https://github.com/Yao-class-cpp-studio/battle_game/actions/workflows/linux-build.yml/badge.svg)](https://github.com/Yao-class-cpp-studio/battle_game/actions/workflows/linux-build.yml) +## 前言 + +本课程的 Project 2 的设计主题是团队和创造。希望大家能够通过这个 Project 初步体会到利用 Git 仓库进行团队合作的感觉以及自由发挥创造力感受编程的快乐。 +2022 年我们设计了这个坦克小游戏作为实验性的项目框架发布,那年我们体会到了同学们回馈的热情和创造力。 +因此我们一直希望能够沿着这个思路为同学们提供更好的学习以及娱乐体验,一直在尝试构建一个更加完善的项目框架可以真正地把大家的创意融合成一个完整的作品。 +然而事与愿违,由于 TA 的时间和能力有限,我们的项目框架一直没有得到很好的完善。去年的新项目框架没有能够在团队协作上发挥出更好的效果。 +今年在连续几周的持续工作下,我们很遗憾地发现新的工程进度离理想的项目框架还有很大的差距,在 DDL 面前不得不妥协,复用了 2022 年的初版框架。 +我们深感抱歉,也希望大家能够理解我们的困难,我们会继续努力,争取在未来的课程中完成我们的蓝图。 + +Project 2 的难度并不高,希望大家能在期末结束之后以一个放松地心态完成这个项目。 经过一个学期的学习,我们已经一起学习了许多编程知识,大家的编程技能想必也有了显著的提高。 -这个项目将会给大家一个自由展现自己编程能力的平台,为课程画上一个圆满的句号。 与历次作业和第一次大作业单打独斗的体验不同,这个项目将由参与课程的所有同学共同完成, -你需要和同学们相互配合,让所有人的代码配合到一起,体验共同开发的乐趣。 +你需要为这个代码仓库提交你的贡献,体验共同开发的乐趣。 这个项目的目标是制作一款内容丰富的对战小游戏。 同学们可以自由地发挥自己的创造力,设计各种奇妙有趣的游戏内容,添加绚丽的视觉效果。 -项目结束后,我们的课程团队将会把同学们设计创造的内容进行整合并发布,因此你的设计将有机会被很多人体验到。 -期待大家的成果。 ## 任务 -设计本项目的目的是希望大家通过本项目体验和学习软件工程的思维和流程。 - -### 1、创建分叉(Fork)并提交 PR (Pull Request)【5 pts】 +### 1、创建分叉(Fork)并提交 PR (Pull Request)【10 pts】 在一个团队合作的项目中,每个人提交的每一行代码都可能引发无法预料的后果,你的每一行代码在进入主仓库之前都需要经过严格的审核。 -你不拥有对主仓库写权限,在编写你贡献的新代码之前,你需要先从主仓库创建一个属于你自己的分叉(Fork)。在 GitHub 中, +你不拥有对主仓库的写权限,在编写你贡献的新代码之前,你需要先从主仓库创建一个属于你自己的分叉(Fork)。在 GitHub 中, 实现这个操作只需要点击仓库主页面右上角的 `Fork` 按钮,并根据跳转页面的提示创建你的分叉。 -在你的分叉仓库里,你可以对其进行任意的改动,这些都不会影响到主仓库的内容安全。 +在你的分叉仓库里,你可以对其进行任意的改动,这些都不会影响到主仓库的内容。 在你写完并提交了新的代码后,你可以通过创建 PR (Pull Request)的方式申请将你分叉仓库中新的代码合并到主仓库。 你可以通过仓库页面导航栏的 `Pull requests` 按钮进入 PR 页面。 @@ -30,7 +34,7 @@ 接下来根据页面中的提示和选项,选择你的分叉仓库和你分叉仓库里更新代码的分支(branch)。 在选择完成后,点击 `Create pull request` 按钮提交你的 PR。 -这一子任务不需要你提交有意义的代码,你只需要正确地创建分叉,随意提交一些改动,然后正确提交一个 PR 即可,然后请进入下一个子任务。 +这一子任务不需要你提交有意义的代码,你只需要正确地创建分叉,随意提交一些改动,然后正确提交一个 PR 即可。 ### 2、创建一个新的游戏单位类型 【10 pts】 @@ -50,43 +54,22 @@ 这是你需要做的具体步骤: 1. 在 `src/battle_game/core/units/` 目录下仿照 `tiny_tank.h` 和 `tiny_tank.cpp` 的模式新建一对用于编写你的游戏单位的 `.h` 和 `.cpp` 文件。 你可以自行选取合适的名字。为了避免和他人的命名产生冲突,你可以在文件名中添加带有个人特征的标记,如:常用网名、学号等。 -2. 在你创建的代码文件里,你需要定义一个新的类型,使其继承自 `Unit` 类型。这个类型名可以任意选取。 +2. 重新进行 CMake 配置 (CMake Configuration,即常见情况下调用 `cmake ..` 生成 build 目录下项目结构的命令),使用 IDE 的同学应该可以找到重新配置相关的按钮,CMake 会自动将你新建的文件引用到项目中。 +3. 在你创建的代码文件里,你需要定义一个新的类型,使其继承自 `Unit` 类型。这个类型名可以任意选取。 同样的,你可以添加带有个人特征的标记以避免与其他同学冲突。 -3. 实现功能:如果你希望快速获得这部分分数,你可以参考 `tiny_tank` 的实现完成一个你的坦克的功能。 +4. 实现功能:如果你希望快速获得这部分分数,你可以参考 `tiny_tank` 的实现完成一个你的坦克的功能。 如果你希望设计创造性的单位,你可以参考 `tiny_tank` 的逻辑设计,编写你自己的单位逻辑。 -4. 在实现完成你的单位类型后,给你的作品签上自己的名字吧!你需要重载 `UnitName` 和 `Author` 两个函数, -前者是你创造的单位的名称,后者是作者的名称,也就是你的名字,你可以随意地用真实姓名或者网名。 -5. 最后你需要将定义了你的单位的头文件添加到 `src/battle_game/core/units/units.h` 中, -然后前往 `src/battle_game/core/selectable_units.cpp` 将你的单位添加到可选单位列表。 +5. 在实现完成你的单位类型后,给你的作品签上自己的名字吧!你需要重载 `UnitName` 和 `Author` 两个函数, +前者是你创造的单位的名称,后者是作者的名称,也就是你的名字,你可以随意地用真实姓名或者昵称。 +6. 最后你需要前往 `src/battle_game/core/selectable_units.cpp` 将你的单位添加到可选单位列表。 一切做完后,编译并运行程序,你会看到你的单位已经出现在左上角的可选单位列表中了。你可以从列表中选择你的单位, -用 `自毁` 按钮消灭当前默认创建的单位,等待 5 秒后重生出的新单位就是你的作品了! +用 `自毁` 按钮消灭当前默认创建的单位,等待 5 秒后重生出的新单位就是你的作品! 如果你的单位运行起来一切正常,你可以将你的代码推送到你的分叉仓库中,你之前创建的 PR 会自动同步你更新的内容。 -这时候你就可以找助教验收这个子任务的成果了。 - -如果你发现你的 PR 被 clang-format 检查卡住了,这是因为你的代码风格不标准。 -你不需要手调代码风格,这样会很累。你可以采取如下自动的方式: - -1. 下载 pre-commit: -```shell -pip install pre-commit -``` -2. 将 pre-commit 的钩子加入到 git commit 中 -```shell -pre-commit install # 在仓库主目录下运行 -``` -3. 重新提交你修改的文件: -```shell -git commit -am "Your Comments" -``` -此时 pre-commit 会帮助你自动修改代码风格。 -如果报错了,就将上放指令再敲一遍,直到提交成功。 - -4. 推送到远端仓库 - -### 3、提出一个新功能的想法到 Issues 列表 【5 pts】 + +### 3、提出一个新功能的想法到 Issues 列表 【10 pts】 有时你有一个很好的想法,但是没有办法立刻实现, 或者你发现项目中存在一个 Bug,希望以后去修复。 @@ -99,17 +82,14 @@ git commit -am "Your Comments" 如果前面已经有同学提过类似或者相同的问题,那就不要再重复提交了。 我们不在意你提的问题是复杂还是简单,只要是一个有效的问题,你都可以直接拿到这个子任务的 5 分! -### 4、自由创造 【10 pts】 +### 4、自由创造 【0 pts】 在同学们提出很多好的 idea 后,我们希望能够把他们一一变为现实。 -最后的这 10 分完全由你自行发挥。 你可以从 Issues 列表中选择一个你认为自己可以解决的部分,你可以申领这个 Issue,然后提交 PR 实现并关闭之。 你可以和同学合作完成,在提交 PR 时请说明每个人贡献了哪部分代码。 -每一个被成功解决的 Issue 的所有参与者都可以获得 5 分本子任务的分数,当然,满分 10 分封顶。 你如果希望多做一些贡献那就更好了,毕竟,这个项目就是为了大家能够体会编程的乐趣! Good Luck and Have Fun! -## 后记 +## 验收 -我们希望同学们通过这次作业体会到编程的乐趣,在过程中创造快乐,最终我们会一起呈现一个完整的作品,这离不开每一位同学的贡献。 -你的每一行代码都是重要的,也是有意义的。希望多年以后,这段旅程能够成为同学们共同的美好回忆。 +在 GitHub 上完成以上所有任务后,请在网络学堂提交一个文本文件,包含你提交的 PR 的链接以及你提交的 Issue 的链接。 diff --git a/src/battle_game/app/CMakeLists.txt b/src/battle_game/app/CMakeLists.txt index 4627eb43..fc71ff5e 100644 --- a/src/battle_game/app/CMakeLists.txt +++ b/src/battle_game/app/CMakeLists.txt @@ -4,7 +4,7 @@ list(APPEND LIBRARY_LIST ${lib_name}) add_library(${lib_name}) file(GLOB source_files *.cpp *.h) target_sources(${lib_name} PUBLIC ${source_files}) -target_link_libraries(${lib_name} PUBLIC grassland) +target_link_libraries(${lib_name} PUBLIC grassland battle_game_core_lib) target_include_directories(${lib_name} PUBLIC ${BATTLE_GAME_EXTERNAL_INCLUDE_DIRS} ${BATTLE_GAME_INCLUDE_DIR}) set(LIBRARY_LIST ${LIBRARY_LIST} PARENT_SCOPE) diff --git a/src/battle_game/app/app.cpp b/src/battle_game/app/app.cpp index 7292211c..11ab6e0c 100644 --- a/src/battle_game/app/app.cpp +++ b/src/battle_game/app/app.cpp @@ -301,7 +301,6 @@ void App::UpdateImGui() { auto player = game_core_->GetPlayer(my_player_id_); if (player) { auto selectable_list = game_core_->GetSelectableUnitList(); - auto selectable_list_skill = game_core_->GetSelectableUnitListSkill(); ImGui::Combo(u8"选择你的单位(重生后生效)", &player->SelectedUnit(), selectable_list.data(), selectable_list.size()); if (ImGui::Button(u8"自毁")) { diff --git a/src/battle_game/core/CMakeLists.txt b/src/battle_game/core/CMakeLists.txt index 31eaad75..2733b15f 100644 --- a/src/battle_game/core/CMakeLists.txt +++ b/src/battle_game/core/CMakeLists.txt @@ -7,6 +7,8 @@ target_sources(${lib_name} PUBLIC ${source_files}) target_link_libraries(${lib_name} PUBLIC grassland) target_include_directories(${lib_name} PUBLIC ${BATTLE_GAME_EXTERNAL_INCLUDE_DIRS} ${BATTLE_GAME_INCLUDE_DIR}) +add_subdirectory(units) + set(LIBRARY_LIST ${LIBRARY_LIST} PARENT_SCOPE) target_compile_definitions(${lib_name} PRIVATE BATTLE_GAME_ASSETS_DIR="${BATTLE_GAME_ASSETS_DIR}/") diff --git a/src/battle_game/core/README.md b/src/battle_game/core/README.md index 4d2d4823..30de9f77 100644 --- a/src/battle_game/core/README.md +++ b/src/battle_game/core/README.md @@ -136,29 +136,7 @@ public: 该函数可以帮助你通过只填写新生成的子弹对象的位置、朝向、伤害倍率等关键参数,自动根据单位信息进行补全并添加一个子弹生成事件。 - 实现类似于“开火”一类的技能可以使用该函数 - 函数的实现位于 `src/battle_game/core/game_core.h` 中 -- Skill - - units支持加入技能。 - - 为了方便玩家操作,技能应当使用键盘快捷键完成。特别地,由于本游戏使用W/A/S/D控制转向,为方便起见,技能采用按键E/Q/R完成。我们规定E/Q/R表示的技能强度递增,并建议按照E/Q/R的顺序依次实现技能(可不足3个,但主动技能一般不会超过3个)。此外,P表示被动技能,这一技能不需要用户输入。 - - 用户通常希望从UI界面获取技能的简略信息。因此,如果您不希望技能被展示在UI界面中,请使用ADD_SELECTABLE_UNIT_WITHOUT_SKILL()进行调用(如果您没有设置技能,则不会显示任何信息。因此技能界面向前兼容)。此外,您需要维护一个名称为skill_的信息存储库,它已经是您的units类型中的protected类型。它的格式为std::vector 。其中Skill是一个用于交互的结构体。 - - units支持子弹切换界面显示。一个units可以拥有不止一种射击的子弹,并且子弹切换通常需要一定的冷却时间。如果您不希望展示子弹界面,您只需要留空即可。 如果您希望展示子弹界面,请在skill_里加入type=B的一个元素。如果有不止一个子弹,请不要多次添加,而是填写当前的bullet_type和一共的bullet_total_number。子弹界面对您的输入具有一定的适应性,例如,如果您只有一种子弹,将不会展示切换信息;如果您的冷却时间为0,将不会展示冷却进度。 -``` cpp -enum SkillType { E, Q, R, P, B }; -struct Skill { - std::string name; - std::string description; - std::string src; - uint32_t time_remain; - uint32_t time_total; - uint32_t bullet_type; - uint32_t bullet_total_number; - SkillType type; - std::function function; -}; -``` - - - - 你需要在name中填写技能名称,description为技能简述(若有),src为技能图示路径(若有),time_remain为技能冷却时间,time_total为技能冷却总时间,type为技能类型,function为技能调用的接口(可选择不提供)。若选择提供,使用格式为example.function=SKILL_ADD_FUNCTION(YourUnits::YourFunction)。 - - 使用示例请参考inferno_tank类型。技能显示页面可能会持续更新,但可以承诺skill_这一交互容器会保持不变。也即技能显示页面的更新会自动兼容您的数据,您无须再次编写。如果您发现了显示页面的BUG或者希望增加更多内容(如您可能希望加入用户状态,如加速/灼烧等),欢迎联系XuGW-Kevin。 ## Obstacle 障碍物类声明在 [obstacle.h](obstacle.h) 中,该类对象主要用于组成游戏场景。 diff --git a/src/battle_game/core/game_core.h b/src/battle_game/core/game_core.h index 0e81d8e4..34c4bde1 100644 --- a/src/battle_game/core/game_core.h +++ b/src/battle_game/core/game_core.h @@ -8,13 +8,13 @@ #include "battle_game/core/particles/particles.h" #include "battle_game/core/player.h" #include "battle_game/core/unit.h" -#include "battle_game/core/units/units.h" #include "battle_game/graphics/graphics.h" #include "functional" #include "grassland/grassland.h" #include "map" #include "queue" #include "random" +#include "units.h" #include "vector" namespace battle_game { @@ -32,9 +32,6 @@ class GameCore { void GeneratePrimaryUnitList(); uint32_t AllocatePrimaryUnit(uint32_t player_id); [[nodiscard]] std::vector GetSelectableUnitList() const; - [[nodiscard]] const std::vector &GetSelectableUnitListSkill() const { - return selectable_unit_list_skill_; - } void Update(); void Render(); @@ -215,7 +212,6 @@ class GameCore { std::vector> primary_unit_allocation_functions_; std::vector selectable_unit_list_; - std::vector selectable_unit_list_skill_; }; template diff --git a/src/battle_game/core/selectable_units.cpp b/src/battle_game/core/selectable_units.cpp index ce8abbcc..d3c63f15 100644 --- a/src/battle_game/core/selectable_units.cpp +++ b/src/battle_game/core/selectable_units.cpp @@ -16,15 +16,7 @@ void GameCore::GeneratePrimaryUnitList() { unit = std::make_unique(nullptr, 0, 0); \ AddPrimaryUnitAllocationFunction(); \ selectable_unit_list_.push_back(unit->UnitName() + std::string(" - By ") + \ - unit->Author()); \ - selectable_unit_list_skill_.push_back(true); - -#define ADD_SELECTABLE_UNIT_WITHOUT_SKILL(UnitType) \ - unit = std::make_unique(nullptr, 0, 0); \ - AddPrimaryUnitAllocationFunction(); \ - selectable_unit_list_.push_back(unit->UnitName() + std::string(" - By ") + \ - unit->Author()); \ - selectable_unit_list_skill_.push_back(false); + unit->Author()); /* * TODO: Add Your Unit Here! diff --git a/src/battle_game/core/units/CMakeLists.txt b/src/battle_game/core/units/CMakeLists.txt new file mode 100644 index 00000000..8a0877ac --- /dev/null +++ b/src/battle_game/core/units/CMakeLists.txt @@ -0,0 +1,14 @@ +file(GLOB HEADERS "*.h") + +set(UNITS_HEADER_FILE ${CMAKE_CURRENT_BINARY_DIR}/units.h) + +message(STATUS ${UNITS_HEADER_FILE}) + +file(WRITE ${UNITS_HEADER_FILE} "// This is a generated file\n#pragma once\n") + +foreach (header ${HEADERS}) + get_filename_component(header_name ${header} NAME) + file(APPEND ${UNITS_HEADER_FILE} "#include \"battle_game/core/units/${header_name}\"\n") +endforeach () + +target_include_directories(${lib_name} PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/src/battle_game/core/units/units.h b/src/battle_game/core/units/units.h deleted file mode 100644 index c1193717..00000000 --- a/src/battle_game/core/units/units.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -#include "battle_game/core/units/tiny_tank.h"