【步兵 cocos2dx】四叉树碰撞算法

【步兵 cocos2dx】四叉树碰撞算法 by EOS.

四叉树碰撞网上例子不少,自己也观摩了一下,然后自己写了一个。
并不是想证明自己写的比别人好,不自己写一遍,总感觉自己不认识它。
写过之后感觉,深入了解,并且自己的代码才是最放心的~

原理部分我就跳过了,直接百度一大票。
阅读下文之前,最好去看一下原理,那样看起代码来会更快更清晰。

徒弟说有图效果更加,最好是看着酷炫的。
感觉好友道理,赶紧补上 ( ̄︶ ̄)
这里写图片描述

这里写图片描述

还有张动态碰撞的。可惜太大了,只支持2M以下的,悲剧了
想看的可以点链接 动态四叉碰撞图


先解说一下头文件

#include <list> 
#include "2d\CCNode.h"

namespace fxcollision
{
    typedef unsigned char litInt; //0-255绝对够用了
    const static litInt MAX_NODES = 5; //最大节点数
    const static litInt MAX_LEVEL = 4; //最多切几次
    const static litInt NO_IN_SUB = 4; //不在子结点上 
    static bool isRectInclude(const cocos2d::Rect& bigRect, const cocos2d::Rect& smallRect)
    {
  //是否是包含关系  --也可以不注意顺序 然后 大小互换递归一次,效率低点
        return bigRect.getMinX() < smallRect.getMinX() && bigRect.getMaxX() > smallRect.getMaxX()
            && bigRect.getMinY() < smallRect.getMinY() && bigRect.getMaxY() > smallRect.getMaxY();
    };
    class FXNode;
    class FXTree;

    class FXNode //继承方便,组合灵活--换平台改动小
    {
    public:
        FXNode(cocos2d::Node* node);
        ~FXNode();
        cocos2d::Rect getBox();
        void update();//动态优化--静态的不需要调用

    public:
        cocos2d::Node* ccNode;
        litInt index;
        FXTree* parentTree;//在哪个树下
    };

    class FXTree 
    {
    public:
        FXTree(litInt l, cocos2d::Rect r);
        ~FXTree();
        void clear();//递归清空
        void split();//切分
        bool hasSub() { return subTree[0] != NULL; };//是否有子树
        litInt getIndex(const cocos2d::Rect& nr);//过去象限
        void push(FXNode* node);//递归插入
        void remove(FXNode* node);//直接从nodeList移除
        void insert(FXNode* node);//直接放入nodeList
        void check(std::list<FXNode*>& retList, FXNode* node);//获取需检测的结点
        void crossCheck(std::list<FXNode*>& retList, FXNode* node);//跨象限检索

        
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值