5.C++ EGE图形库推箱子游戏进阶

1.前言

本项目可以看作是本站另一门入门教程《C语言:推箱子小游戏》的进阶教程。

如果本文看起来过于困难的话,可以尝试先去阅读基础版本的,里面介绍的会更加详细。

项目整体演示可以观看视频:推箱子小游戏项目演示

2.项目准备

还是老规矩,先在原解决方案中,新建一个项目,项目名为:day5--BoxMan,设置为启动项,并添加一个main.cpp的文件:

image-20231129064140790

既然是写游戏,用控制台肯定不行,太难看了,同时为了兼顾从没有接触过图形编程的新手,所以我打算采用EGE图形库

这个库的使用非常简单,体积也很小,非常适合新手学习,下载地址:Easy Graphics Engine

然后点击下图所示进行下载:

image-20231129064242636

下载并解压后如下图:

image-20231129064508505

image-20231129064553875

include文件夹和graphics64.lib拷贝到今天的项目中:

image-20231129064717665

然后回到项目,写下代码,运行一下,不报错即成功:

#include"include/graphics.h"
#pragma comment(lib,"graphics64.lib")
int main() {
}

自此,我们的准备工作就完成了!

下面,我开始对上面的步骤进行解释:

  • 首先,为什么我只复制include文件夹和VS2019文件夹下的graphics64.lib

因为include文件夹下是ege库的所有头文件,就和我们使用C/C++的头文件iostream一样,既然我们要使用它,就必须得包含它。

而之所以使用VS2019下的库文件,只是因为ege目前还没有更新VS2022版本,只能暂时用VS2019凑合,但区别也不大。

至于其它文件夹中的内容,主要是一些使用该库的示例,以及其它开发环境用的库,有兴趣的可以自己看一看。

  • include是头文件,前面学过我明白,那graphics64.lib是什么东西?

这个文件被称为静态库,前面我们提到过,一般我们写函数或者类的时候,都是将声明定义放在同名的两个文件里面,一个叫做头文件,一个叫做源文件,这样如果别人想要使用我写的代码,就可以直接把这两个文件复制给对方。

但是这有一个问题,就是对方能看到我们写的代码!

如果是付费的产品,别人如果都拿到了你写的源代码,以后还会找你吗?直接自己改不就行了!

这种时候,我们是想让对方用,但我们又不能将源代码给对方,而这就可以用到静态库,它就像.cpp文件一样,需要配合.h文件使用。

但好处是,此时对方就不能看到你源代码了,因为你的源码都被打包成了.lib的库文件!后面章节我也会教大家如何打包自己的库文件。

总结一句话就是:graphics64.lib文件就是用来代替.cpp文件的,要结合对应的.h文件使用,而所有的.h文件都在include文件夹里面。

需要注意的是,由于我一直以来都是使用的x64平台,这也是未来的趋势,所以选择的是x64文件夹中的库文件,如果你非要使用x86,那就请使用x86文件夹下的库文件。

而使用这个库文件,就需要用该语句#pragma comment(lib,"graphics64.lib"),如果是其它库,就换个名字就行了,这也没啥讲究,直接复制就行了。

  • 代码中包含头文件的方式怎么这么奇怪?

这是由于VS默认是在当前项目文件夹中寻找头文件的,如果你的头文件在include文件夹中,那就得先输入文件夹include,然后vs会自动给你弹出该文件夹下有哪些头文件,然后包含对应的头文件即可。

3.游戏属性

有了前面的准备,现在我们就可以开始写代码了,但首先还是要先确定一下我们目前的思路:

  1. 为避免过于复杂,我们只要一个游戏窗口,用来显示游戏就行了。
  2. 但我们还得有选择关卡,选择英雄,选择地图等功能,这一部分就直接用控制台完成。

所以我们的代码总体逻辑就是:点开游戏之后,可以通过控制台输入的方式来选择一些游戏特性,然后通过游戏窗口来显示游戏。

所以我们先来写一个显示选择属性的控制台界面函数:

#define SHOW_CONSOLE  //必须定义这个宏在 ege的两个头文件前面,才能使用控制台
#include"include/graphics.h"
#include<iostream>
#pragma comment(lib,"graphics64.lib")
using std::cout;  //输出
using std::cin;  //输入
using std::endl; //换行,与 \n 类似

int hero;	//保存用户保存的英雄
int pce;	//选择用户保存的场景地图
void ChooseAttribute(); //游戏开始前,选择属性的函数