gpt4 book ai didi

ios - b2Body 动画?

转载 作者:行者123 更新时间:2023-11-29 04:55:29 24 4
gpt4 key购买 nike

我在游戏中使用 Box2D 和 Cocos2D。我知道Cocos2D有一个名为CCMoveTo的动画API。我想在 Box2D 中使用 b2Bodies 做同样的事情。我希望能够设置目标点和从最初所在点开始的动画时间。有谁知道这是否可能?我只是想让这尽可能简单。

我愿意接受想法和建议!

谢谢!

Edit1:好的,我想让我的 b2Bodys 永久跟随我的 CCSprite。您向我展示的代码有问题。

在我的 .h 中,我正在这样做:

b2World *世界;
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 个错误:

  1. 我在 body->GetUserData 行中得到 Cannot Initialize variable of type 'CCSprite' with an value of type 'void'

  2. 我还得到:使用未声明的标识符“Helper”。我将这 2 个辅助方法放入我的类中,但我只是不确定 Helper 是什么。

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,您可以改为将 Sprite 的位置和旋转指定给 b2Body。

您需要做的就是确定何时以及哪个 Sprite 控制 body :

// 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);
}

关于ios - b2Body 动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8074450/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com