这个项目开始于2019年下半年,也就是大二上长学期的时候,当时申报了一个校级srtp项目,自拟题为“基于瞳孔检测的注意力检测方法研究”,而这一部分是作为最后眼控展示的一个小平台。有趣的是,当时开题答辩第一个上台,被怼得要死,中期答辩也是,好在结题答辩在我一波疯狂舔审核老师的操作后,竟然混了个校级优秀项目,后来还在大学生创新创业成果展贴了咱的展板(我的大头...),不过yysy,现在看起来这项目确实很low哈哈哈哈哈。
这个项目估计会分成三章更完:游戏部分、人脸检测和瞳孔检测部分
以及两个统一的完整展示。下面是第一部分正文:
一、开发平台及辅助工具
开发平台:Visual Studio
编程语言:C++ / C语言
界面开发:EasyX(点击访问)
二、游戏介绍
1、主界面
启动游戏之后主界面如下图所示;

进入游戏应该可以听到游戏音乐,任意时刻点击右上角的喇叭按钮可以 开关音乐;
2、游玩界面
进入游戏之后,操纵方式同前,界面如下:

通过操控玩家飞机进行躲避,可以看到左上角 分数累加;
当玩家与敌机发生碰撞之后,玩家会扣血,当 玩家血量扣完时,游戏结束;
玩家可以按下空格键 发射子弹进行攻击,当敌机与子弹发生碰撞后,敌机会扣血,当 敌机血量扣完时,会从游戏界面中消失;
3、暂停
点击右上角的Pokemon精灵球可以暂停/继续游戏,
4、结束界面
玩家死亡后,结束界面如下,玩家可以选择再来一次或者退出游戏;
当玩家游玩分数高于最高纪录时,在游戏结束时会保存最高分。

三、游戏实现
1、贴图准备
背景图网上随便找的一张,其余贴图都是自己用AI画的(当时暑假留校比较闲,成天没事就搞这些花里胡哨的嘻嘻)
2、参数等预定义
下面这些主要是贴图的一些属性的预定义,而方向键的定义按照习惯还是定义成了wasd等字母按键了,实际上用的还是键盘上的上下左右键:
//贴图属性
#define PlayerBlock 75 //玩家方块大小,等于玩家飞机图像文件大小75x75
#define PlayerBlood 100 //玩家血量
#define PlayerSpeed 3 //玩家移动速度,数值越大越快
#define EnemyBlock 80 //敌机方块大小,等于敌机飞机图像文件大小80x80
#define EnemyBlood 100 //敌机血量
#define EnemySpeed 3 //敌机移动速度,数值越大越快
#define Enemy_NUM 15 //屏幕最多出现的敌机数量
#define BulletBlock 20 //子弹方块大小
#define Bullet_NUM 20 //屏幕最多出现的子弹数量
#define BulletSpeed 5 //子弹移动速度,数值越大越快
//定义方向键
#define LEFT 'a'
#define UP 'w'
#define RIGHT 'd'
#define DOWN 's'
#define L_UP 'q'
#define R_UP 'e'
#define L_DOWN 'z'
#define R_DOWN 'x'
考虑到各个贴图的属性都差不多,这里就定义成一个结构体了,别问为啥不用Class类,问就是喜欢一个个函数,用起来舒服就完事!需要注意的是Block结构体成员point保存的是贴图方块的左上角顶点,这在第8点碰撞检测部分需要特别注意。
完整定义如下:
struct SinglePoint
{
int x = 0;//定义点坐标
int y = 0;
};
struct Block
{
IMAGE image;//图片文件
SinglePoint point;//左顶点
uint8_t aliveflag = 0;//是否显示使能,默认不显示
uint8_t kickedflag = 0;//是否被攻击,默认未被攻击
long alivetime;//存活时间
float blood;//血量
};
3.初始化界面函数
在该函数中,依次进行:游戏背景音乐、子弹音效、死亡音效的装载;根据电脑分辨率动态调整游戏界面尺寸;各贴图装载;玩家飞机位置初始化。