接上一节内容:cocos2dx - 生成怪物及AI

 本节主要讲如何通过创建简单的矩形区域来造成伤害

  在小游戏中简单的碰撞需求应用box2d等引擎会显得过于臃肿复杂,且功能不是根据需求定制,还要封装,为此本节讲述一下如何自己实现简单的碰撞,来达到伤害效果。

这里先看下效果图:

 cocos2dx - 伤害实现

cocos2dx - 伤害实现

一、定义小组类别

  定义如下:

// 组别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__
View Code

相关文章: