上一章中,虽然怪物已经出现了,但是怪物对玩家没有造成任何伤害,所以我们接下来要加入碰撞检测,如果怪物碰到主角,则扣主角的血。
我们给Player类添加点东西,如下代码显示:
Player类新增了以下内容:
(1)hit()函数:怪物碰撞到玩家时调用
(2)getiHP()函数:获取玩家血量
(3)getBoundingBox()函数:获取碰撞范围
(4)int m_iHP变量:记录玩家血量
我们再来看看Player.cpp是如何实现这些函数的,如下:
(要注意,在Player()构造函数中初始化m_iHP)
在hit函数中减少血量,并判断血量是否小于0;
getBoundingBox函数,实际上就是获得player处于界面中的的方形区域坐标集(也就是我们需要的矩形碰撞范围)
接下来,我们要给Monster添加一个检测碰撞的函数,如下代码:
(Monster.h)
(Monster.cpp中实现碰撞检测函数)
逻辑很简单,获取碰撞对象的矩形碰撞范围,判断怪物的坐标是否在这个范围之内即可。
最后修改MonsterManager的update函数:
现在运行的话,会提示错误,因为MonsterManager中没有m_player这个成员变量,所以在MonsterManager.h中要添加如下:
添加了一个绑定player的函数和一个m_player的私有成员变量。下面是bindPlayer函数的实现:
最后的最后,最关键的是,在TollgateScene.cpp中的init中添加:
(初始化MonsterManager中的m_player,不然程序会崩溃)
那么接下来运行一下项目,可以发现,怪物碰撞到主角之后自动消失了。
但是!主角被打中之后没有任何反应,太不给面子了,我们给他加点反应吧。
修改Player.cpp的hit函数,如下:
getBoundingBox函数修改一下:
resetData函数:
扣血飘字效果是写在另外一个类FlowWord里面:
FlowWord.h:
FlowWord.cpp:
要记得在Player.cpp中添加上FlowWord头文件
好了,现在运行项目,当主角被怪物击中后会向后退,并且会有扣血的标记