我先说一下我这个项目的目的。
因为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坐标对不上。