接上一节内容:cocos2dx - 生成怪物及AI
本节主要讲如何通过创建简单的矩形区域来造成伤害
在小游戏中简单的碰撞需求应用box2d等引擎会显得过于臃肿复杂,且功能不是根据需求定制,还要封装,为此本节讲述一下如何自己实现简单的碰撞,来达到伤害效果。
这里先看下效果图:
一、定义小组类别
定义如下:
// 组别mask
enum enGroupMask
{
GROUP_NONE = 0x0000,
GROUP_PLAYER = 0x0001,
GROUP_MONSTER = 0x0002,
};
用二进制位来定义小组,方便后面判断用位快速判断。
二、定义CBody类用于碰撞实现
代码如下:
#ifndef __CBody_H__ #define __CBody_H__ #include "IGameDef.h" #include "cocos2d.h" #define DRAW_BODY 1 #ifdef DRAW_BODY #include "GLES-Render.h" #endif USING_NS_CC; class CBody : public Node { public: // implement the "static create()" method manually CREATE_FUNC(CBody); virtual bool init(); void SetRect(float x, float y, float w, float h){ m_cRect = Rect(x,y,w,h); } void SetGroupMask(enGroupMask nGroupMask){ m_nGroupMask = nGroupMask; } enGroupMask GetGroupMask() const{ return m_nGroupMask; } enGroupMask CanContactGroup() const; //判断是否可以碰撞该类别 bool IsGroupCanContact(enGroupMask nGroupMask) const; const Rect GetRect() const; //判断矩形是否交叉 bool IntersectsRect(const Rect& rect) const; void SetContactCallback(const std::function<void(CBody*)>& callback){ m_constactFunc = callback; } // 碰撞回调函数 void OnContact(CBody* pBody); // 绘制矩形区域 #ifdef DRAW_BODY virtual void draw(Renderer *renderer, const Mat4& transform, uint32_t flags); virtual void onDraw(const Mat4 &transform, uint32_t flags); #endif private: CBody(); ~CBody(); #ifdef DRAW_BODY CustomCommand m_pCustomCommand; b2Draw* m_debugDraw; #endif Rect m_cRect; std::function<void(CBody*)> m_constactFunc; enGroupMask m_nGroupMask; }; #endif __CBody_H__