这是一个基于OpenGL的2D打砖块游戏,代码参考了LearnOpenGL教程的2D游戏实战部分。本项目对原项目做了一些结构性调整。 原文地址: LearnOpenGL-Breakout
该项目除了着色器渲染以及纹理贴图外还实现了如下功能:
- 音乐播放
- 碰撞检测
- 游戏状态切换
- 游戏道具(Buff,Debuff)
- 地图加载/关卡切换
项目主要分为三个部分,分别为GameUtil, Game, Application。
- GameUtil为游戏工具类,包括一些游戏相关的辅助函数。
- Game包含具体的游戏对象,它一般继承自GameUtil中的一些类型。
- Application为游戏应用类,初始化一些基本文件路径以及一些游戏运行时需要的变量,并确定游戏逻辑。
对于GameUtil部分,游戏与窗口之间的设计是分离的。对于游戏窗口,默认是使用的glfw创建,在GameUtil/GameWindow.h
文件中定义了GameUtil::GlfwGameWindow
类型,它继承自GameUtil::GameWindow
并封装了一些glfw所用到的基本函数。如果你不想使用glfw,可以继承GameUtil::GameWindow
类型并重载它的虚方法,并在Application/main.cpp
的GameUtil::GameWindow GetGameWindow(GameUtil::Game* game)
方法中返回该类型。
默认情况下,它应该是这样的。
GameUtil::GameWindow *GameUtil::GetGameWindow(GameUtil::Game *game)
{
return (GameUtil::GameWindow *)(new GameUtil::GlfwGameWindow(800, 600, "Breakout", game));
}
对于游戏类型,它被声明在GameUtil/Game.h
中,它主要被用于创建游戏本体,并指定各项参数,如游戏状态等。你应该在Application/main.cpp
中定义你的继承自GameUtil::Game
的游戏类型,并在GameUtil::Game *GameUtil::GetGame()
函数中返回它。
GameUtil::Game *GameUtil::GetGame()
{
return (GameUtil::Game *)(new GameCore(800, 600, "G:/my_program/cpp/Breakout/resource/"));
}
本项目有一个有趣的地方,你并不能在Application/main.cpp
中看到main函数,它实际上是被隐藏到GameUtil/EntryPoint.h
中了。在设计上,我们希望它能够像一个游戏引擎一样,一些基本功能如纹理、着色器、精灵等仅通过调用GameUtil
模块的接口来加载,而游戏逻辑交给外部实现。
目前仅在Windows下测试过,不过所用的库都是跨平台的,理论上解决依赖问题后可以在Linux和OSX下通过编译。
另外需要注意,本项目使用了YSE音频库,它通过MSVC编译。由于MSVC与其它编译器的ABI有所差异,这要求在Windows下你同样需要用MSVC来编译本项目。
除了YSE库之外,还需要FreeType库。你可以通过本项目的git子模块从相应的仓库获取它们的源代码,然后手动编译它们或者从网络上下载已经编译好的库文件,并将它们放到与项目相同的目录下。
关于其它依赖项,如GLFW和glad,构建系统已经将它们添加到编译过程中,一般情况下不需要手动安装它们。
在Windows下你需要执行以下命令,创建Visual Studio解决方案后使用VS的MSVC进行编译。
mkdir build
cd build
cmake ..
未经过测试。
mkdir build
cd build
cmake ..
make
图片与音乐素材来源自LearnOpenGL文档,并对部分文件格式做了转换(如.mp3
转换成了.ogg
)。
字体下载自下载自网络。
请遵循素材的版权许可,本项目并不对这些内容提供额外授权。