相信很多朋友学习《计算机图形学》是为了有朝一日做出自己喜欢的游戏,不过我们看到现在市面上很多游戏画面都非常精细机游戏的机制也是非常的复杂,不借助游戏引擎可能都无法做出一款像样的游戏。可以使用游戏引擎也存在问题,那就是对游戏引擎的底层代码逻辑不够了解,在优化时经常犯难,而且游戏引擎也不是万能的,还是有很多图形学方面问题需要开发者自己编写代码来完成。可是《计算机图形学》理论性很强,如果不做一些项目出来难免会感到很无聊,很容易放弃,实在是遗憾,所以笔者用刚学到的基础知识制作了一个推箱子这个小游戏,足够简单,也能够检查自己的学习情况。
获取项目
项目网址:推箱子小游戏
直接克隆该项目,克隆好以后直接点击GenerateProject.bat就可以直接生成 visual studio 2022解决方案(请注意读者使用的系统要是windows系统,因为程序里面调用的windows提供的API),没有visual studio 2022 也没关系,可以修改GenerateProject.bat当中的代码生成对应IDE的解决方案。
点击GenerateProject.bat
生成对应的IDE的解决方案
游戏介绍
我们直接将整个程序运行起来,进入到游戏当中。
游戏UI介绍
游戏UI时使用ImGui这个轻量化的GUI框架来实现的。整个界面有开始界面,暂停界面,过关界面,通关界面
游戏开始界面
暂停界面
过关界面
通关界面
游戏介绍
游戏规则
推箱子这个游戏相信大家以前或多或少都玩过,这里还是简单介绍一下,玩家控制角色,将箱子推动到指定位置,就算成功,角色不能拉动箱子,墙壁也是无法被推动的。
游戏设计介绍
角色:
粉色的方块(玩家),绿色的方块(箱子),橙色的方块(目的地),蓝色的方块(空地,可以在上面进行移动),白色方块(墙壁)。所有的游戏关卡都有前面这些元素构成
移动方式:
键盘w向上移动,键盘s向下移动,键盘a向左移动,键盘d向右移动。
游戏关卡的扩展
笔者在游戏当中只设计了两个关卡,也只为了方便测试而已,读者难道程序过后可以设计更多的关卡添加在其中。
关卡设计时的注意事项
1、关卡的设计要保证时json文本格式
2、关卡一定要是方阵,并且标注是几行几列的方阵
3、只使用 .符号 空格符号,o符号,p符号,#符号来设计管卡(.表示目的地,o表示箱子,p表示玩家,#表示墙壁)如下图所示
设计好关卡后放在chapter文件夹当中,并且在Game.cpp当中的构造函数当中增加设计关卡
Game::Game():x_playerPosition(0),y_playerPosition(0),dx(0),dy(0),
m_window(nullptr),m_Ruing(true),isNewChapter(true),inGame(false),isPause(false),
complateChapter(false), canInput(false), m_GameRender(nullptr) {
//确保Game实例只有一个
ASSERT(!m_Game);
charMape2Object['#'] = OBJ_WALL;
charMape2Object[' '] = OBJ_SPACE;
charMape2Object['p'] = OBJ_MAN_ON_SPACE;
charMape2Object['P'] = OBJ_MAN_ON_GOAL;
charMape2Object['.'] = OBJ_GOAL;
charMape2Object['o'] = OBJ_BLOCK_ON_SPACE;
charMape2Object['O'] = OBJ_BLOCK_ON_GOAL;
width_window = GetSystemMetrics(SM_CXSCREEN)/4*3;
height_window = GetSystemMetrics(SM_CYSCREEN)/4*3;
width_block = static_cast<float>(height_window) / (4.0f * 3.0f);
height_block = static_cast<float>(height_window) / (4.0f * 3.0f);
//可以增加自己设计关卡
chapters.push_back("src/rec/chapter/chapter1.json");
chapters.push_back("src/rec/chapter/chapter2.json");
itChapter = chapters.begin();
m_Game = this;
}
注意事项
因为笔者设计的方块的长宽是窗口的1/12,所以关卡设计时行列最好不好超过12。
其他事项
虽然推箱子只是一个很简单的游戏,但是不依靠游戏引擎很多事情就需要自己去亲力亲为,当中还有很多的程序笔者没有介绍,不过这里就不去长篇大论了。如果对这个项目整个的是逻辑很感兴趣,可以给笔者留言。