CocoStudio的问题,刚体位置不匹配

我先说一下我这个项目的目的。
因为CocoStudio对帧动画的碰撞区域支持的不是很好,每一帧都要画碰撞区域,很麻烦。
于是我就想出一个方法,弄两个层,一个层播放帧动画,另一个层载入透明图片,在透明图片上画碰撞区域,这样就可以让一个动画保持相同的碰撞区域了。
于是我做了一个简单的测试。
我先贴比较关键的代码。
//=============================box2d更新==============================

void HelloWorld::update(float dt)
{
m_pWorld->Step(0.03f,8,1);
for(b2Body* b=m_pWorld->GetBodyList();b;b=b->GetNext()) //遍历全部刚体
{
if(b->GetUserData()!=NULL)
{
CCArmature* armature = (CCArmature*)b->GetUserData(); //获得userData
armature->setPosition(ccp(B2C(b->GetPosition().x),B2C(b->GetPosition().y)));
armature->setRotation(-1*CC_RADIANS_TO_DEGREES(b->GetAngle())); //设置CCAramture跟随刚体运动
}
}
}

//=========================初始化角色================================
void HelloWorld::initPlayer()
{
//载入文件
CCArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo(“Sakuya/Sakuya0.png”,“Sakuya/Sakuya0.plist”,“Sakuya/Sakuya.ExportJson”);

//创建角色
m_armature=CCArmature::create(“Sakuya”);
m_armature->getAnimation()->play(“stand”); //播放动画
addChild(m_armature);

b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.userData=(void*)m_armature; //设置userData
bodyDef.position.Set(visibleSize.width/2/32.0f,visibleSize.height/2/32.0f); //设置坐标
b2Body *body = m_pWorld->CreateBody(&bodyDef);
m_armature->setBody(body); //设置刚体
}

//=======================触摸事件===================================
void HelloWorld::ccTouchMoved(CCTouch* touch, CCEvent* event)
{
CCPoint d=touch->getDelta();
if (d.x>5) //往右滑动屏幕
{
m_armature->setScaleX(1); //反转
m_armature->getAnimation()->play(“run”); //播放动画
m_armature->getBody()->SetLinearVelocity(b2Vec2(1,0)); //设置刚体线性速度
}
if (d.x<-5) //往左滑动屏幕
{
m_armature->setScaleX(-1); //反转
m_armature->getAnimation()->play(“run”); //播放动画
m_armature->getBody()->SetLinearVelocity(b2Vec2(-1,0)); //设置刚体线性速度
}

}

void HelloWorld::ccTouchEnded(CCTouch* touch, CCEvent* event)
{
m_armature->getAnimation()->play(“stand”); //播放动画
m_armature->getBody()->SetLinearVelocity(b2Vec2(0,0)); //停止刚体运动
}

//===========================cocostudio的截图====================================

sakuya是动画层,_sakuya是碰撞层,碰撞层是透明的。我把碰撞区域画在碰撞层,但并没有把它加入动画中。

//====================================运行结果=================================================

因为我有2个动画,一个站立,一个跑步,所以b2Fixture会有2个,也就有2个形状。这没问题。
移动刚体,角色也会相印的移动。但是如果反转角色的话,m_armature->setScaleX(-1); 刚体不会反转。

//==============================================于是我把cocostudio工程改了一下=================================

把碰撞层的帧加入_sakuya碰撞层中,因为是透明的看不见。
没有修改代码,运行的结果如下:

//===========================================修改后的运行结果==========================================================

刚体和CCArmature的位置不对。
并且,刚体运动时,角色的速度要比刚体慢,速度不一样。
但是我CCLog,查看两者的坐标,都是一样的。
比如说现在角色在屏幕的中央,坐标是(240,160)。
我看刚体的坐标也是(240,160),但它明显是在右上角。

但是这样的话,刚体就只有1个b2Fixture。
并且,跑步时载入的是跑步的碰撞区域。站立时载入的是站立的碰撞区域,反转时,刚体也会反转,这样就很方便。
可惜坐标对不上。

//==================================================================================================

求各位高手们看看是什么情况,为什么刚体与CCArmature坐标对不上。

box2d没有缩放的属性。

修改前的问题我能理解,因为CCArmature是跟随刚体运动的,单独反转CCArmature是不会对刚体产生变化的。
但是我在cocostudio中给碰撞层加了帧后,刚体与CCArmature的位置产生了偏差。但我获取刚体了CCArmature的坐标,2者是一样的。
运行结果我录下来了,只用文字可能说不清。

兄弟,有QQ么? 加QQ聊, 我也遇到setScaleX后,出现了body穿透的情况,看表象 好像是m_isSensor变成true了, 我修改过cocos2d源代码,把m_isSensor当作参数setbody时传进去的.

我QQ 137s26d26s49 去掉字母

我现在在上课,回去再加你

经过一个中午的研究,终于有点明白了。
动画每播一帧,CCArmature就会删除原来的Fixture,然后赋上下一帧的Fixture,这样形状就会一直在变。
但是CCArmature没有操作m_pBody,无论角色移动到哪,只是形状以及形状的位置改变了。刚体的位置一直都是(0,0)
所以我移动刚体时,导致fixture也移动了,角色就与刚体错位了。

是每次 update的时候 CCArmature 会设置 body的坐标,规则的是,CCArmature 原始坐标+body加载的位移+body的坐标.所以 你每次update把body 设为 (0,0)就可以了.

请教下你的刚体是如何反转的