【步兵 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);//跨象限检索