顺便问一下为何我帧动画的碰撞区总是出现在原点。。。但是骨骼动画的碰撞区正常跟随移动
由于物理引擎的限制,当序列帧动画更换图片的速度过快时就会被限制而导致碰撞区混乱。
建议使用序列帧动画时采取程序设置碰撞区方式。
…好的。。。
…请教一下程序里面怎么弄,能给个例子吗
基本理论是通过点组合成矩形,然后转换成碰撞区,并赋给armature。
具体方法可以参考cocos2d-x beta版本的 testcpp中ArmatureScene.cpp文件TestColliderDetector类
该方法是获取一个armature的包围盒,并当做碰撞区。
Rect rect = bullet->getBoundingBox();
const Map<std::string, Bone*>& map = armature2->getBoneDic();
for(const auto& element : map)
{
Bone *bone = element.second;
ColliderDetector *detector = bone->getColliderDetector();
if (!detector)
continue;
const cocos2d::Vector<ColliderBody*>& bodyList = detector->getColliderBodyList();
for (const auto& object : bodyList)
{
ColliderBody *body = static_cast<ColliderBody*>(object);
const std::vector<Point> &vertexList = body->getCalculatedVertexList();
float minx = 0, miny = 0, maxx = 0, maxy = 0;
int length = vertexList.size();
for (int i = 0; i<length; i++)
{
Point vertex = vertexList.at(i);
if (i == 0)
{
minx = maxx = vertex.x;
miny = maxy = vertex.y;
}
else
{
minx = vertex.x < minx ? vertex.x : minx;
miny = vertex.y < miny ? vertex.y : miny;
maxx = vertex.x > maxx ? vertex.x : maxx;
maxy = vertex.y > maxy ? vertex.y : maxy;
}
}
Rect temp = Rect(minx, miny, maxx - minx, maxy - miny);
if (temp.intersectsRect(rect))
{
armature2->setVisible(false);
}
}
}
要是2.2.2版本呢,我使用的是box2d仿照实例里那个牛仔的游戏写的physicalworld,是和子弹添加碰撞区的方法一样吗
恩,对的,可以参考那个子弹的物理碰撞区示例。
那像这种可以检测到碰撞但是每次序列帧的碰撞区都出现在原点是怎么回事。。。骨骼动画的碰撞区很正常,序列帧使用dynamicbox和Cocostudio动作编辑器里的绘制碰撞区都是在原点,是哪里没有设置好吗
求版主大人帮忙解答一下,困扰好几天了
请问你这个是怎么做的呢?是在编辑器中加的碰撞区还是用程序添加的?
用程序添加的似乎没有效果,根本不显示,显示出来的这些是通过编辑器添加的
每次技能释放的时候碰撞区都被正确的创建出来了
您好,我上边提的是将碰撞区加到armature身上,这个时候一定要在编辑器中移除掉所有的碰撞区。
好的,那我试试
移除了技能的碰撞区发现那几个不动的碰撞区还是没有变化,技能释放瞬间生成了一个新的碰撞区然后很快被移除。
以前使用编辑器里的碰撞区也是可以和技能出现在相同的位置的,记得用了帧事件后才出现的错误
额,可能我没太理解您的问题,请问那几个不动的碰撞区是从哪里来的呢?不是只给armature绑定一个碰撞区么?
:904: …稍等我查一下
…源头没找到,倒是发现了主角的骨骼碰撞区似乎少了一块,一个Armature的碰撞区绘制有上限吗?
这两个不是相互独立的么?是不是程序处理的问题呢?