我在游戏中将Box2D和Cocos2D一起使用。我知道Cocos2D有一个名为CCMoveTo的动画API。我想使用b2Bodies在Box2D中做同样的事情。我希望能够从其最初的位置开始设置目的地点和动画时间。有人知道这是否可行吗?
我只是想让它尽可能简单。
我愿意提出想法和建议!
谢谢!
Edit1:好的,所以我想使我的b2Bodys永久跟随我的CCSprite。
您显示给我的代码有问题。
在我的.h中,我正在这样做:b2World *world; b2Body *body;
然后我对该方法进行了一些修改,现在看起来像这样:
for (body = world->GetBodyList(); body != nil; body = body->GetNext())
{
CCSprite *bodyNode = body->GetUserData();
if (bodyNode != nil)
{
// this transfers the body's position and rotation to the sprite
bodyNode.position = [Helper toPixels:body->GetPosition()];
float angle = body->GetAngle();
bodyNode.rotation = -(CC_RADIANS_TO_DEGREES(angle));
// and this would do the exact opposite
b2Vec2 pos = [Helper toMeters:bodyNode.position];
body->SetTransform(pos, CC_DEGREES_TO_RADIANS(bodyNode.rotation));
body->SetLinearVelocity(b2Vec2(0.0f, 0.0f));
body->SetAngularVelocity(0.0f);
}
}
因此,我使用了ivars而不是实例变量。那样行吗?
我也得到2错误:
我在body-> GetUserData行中得到类型为'void'的值的Cannot Initialize类型为'CCSprite'的变量
我还得到:使用未声明的标识符'Helper'。我将这2个辅助方法放入类中,但我不确定什么是辅助方法。
Edit2:看起来如何?我决定将这些方法保留在我的课程中,而不是专门为此创建一个新方法。
// for each body, get its assigned BodyNode and update the sprite's position
for (body = world->GetBodyList(); body != nil; body = body->GetNext())
{
CCSprite* sprite = (CCSprite*)body->GetUserData();
if (sprite != nil)
{
// this transfers the body's position and rotation to the sprite
sprite.position = [self toPixels:body->GetPosition()];
float angle = body->GetAngle();
sprite.rotation = -(CC_RADIANS_TO_DEGREES(angle));
// and this would do the exact opposite
b2Vec2 pos = [self toMeters:sprite.position];
body->SetTransform(pos, CC_DEGREES_TO_RADIANS(sprite.rotation));
body->SetLinearVelocity(b2Vec2(0.0f, 0.0f));
body->SetAngularVelocity(0.0f);
}
}
}
// convenience method to convert a CGPoint to a b2Vec2
-(b2Vec2)toMeters:(CGPoint)point
{
return b2Vec2(point.x / CTM_RATIO, point.y / CTM_RATIO);
}
// convenience method to convert a b2Vec2 to a CGPoint
-(CGPoint)toPixels:(b2Vec2)vec
{
return ccpMult(CGPointMake(vec.x, vec.y), CTM_RATIO);
}
最佳答案
您可以暂时或永久撤销CCSprite和b2Body的关系。通常,在您的更新方法中,CCSprite将被设置为b2Body的位置。如果您有一个使用CCMoveTo移至特定位置的CCSprite,则可以改为给b2Body设置精灵的位置和旋转。
您需要做的就是确定何时以及哪个精灵控制身体:
// for each body, get its assigned BodyNode and update the sprite's position
for (b2Body* body = world->GetBodyList(); body != nil; body = body->GetNext())
{
BodyNode* bodyNode = body->GetUserData();
if (bodyNode != nil)
{
// this transfers the body's position and rotation to the sprite
bodyNode.position = [Helper toPixels:body->GetPosition()];
float angle = body->GetAngle();
bodyNode.rotation = -(CC_RADIANS_TO_DEGREES(angle));
// and this would do the exact opposite
b2Vec2 pos = [Helper toMeters:bodyNode.position];
body->SetTransform(pos, CC_DEGREES_TO_RADIANS(bodyNode.rotation));
body->SetLinearVelocity(b2Vec2(0.0f, 0.0f));
body->SetAngularVelocity(0.0f);
}
}
Helper方法的定义如下:
// convenience method to convert a CGPoint to a b2Vec2
+(b2Vec2) toMeters:(CGPoint)point
{
return b2Vec2(point.x / PTM_RATIO, point.y / PTM_RATIO);
}
// convenience method to convert a b2Vec2 to a CGPoint
+(CGPoint) toPixels:(b2Vec2)vec
{
return ccpMult(CGPointMake(vec.x, vec.y), PTM_RATIO);
}