#ios #animation #cocos2d-iphone #box2d
#iOS #Анимация #cocos2d-iphone #box2d
Вопрос:
Я использую Box2D с Cocos2D в своей игре. Я знаю, что у Cocos2D есть анимационный API с именем CCMoveTo. Я хочу сделать то же самое в Box2D с b2Bodies. Я хочу иметь возможность устанавливать точку назначения и время анимации с точки, в которой она изначально находится. Кто-нибудь знает, возможно ли это или нет? Я просто пытаюсь сделать это как можно проще.
Я открыт для идей и предложений!
Спасибо!
Правка 1: Хорошо, итак, я хочу, чтобы мои b2Bodys постоянно следовали моему CCSprite. Существует проблема с кодом, который вы мне показали.
В моем .почему я делаю это:
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 ошибки:
-
Я получаю не удается инициализировать переменную типа ‘CCSprite’ значением типа ‘void’ в строке body-> getUserData
-
Я также получаю: Использование необъявленного идентификатора ‘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);
}
Ответ №1:
Вы можете изменить взаимосвязь CCSprite и b2Body либо временно, либо постоянно. Обычно в вашем методе обновления CCSprite будет установлен в положение b2Body. Если у вас есть CCSprite, который использует CCMoveTo для перемещения в определенную позицию, вы могли бы вместо этого назначить 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);
}
}
Вспомогательные методы определены следующим образом:
// 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);
}
Комментарии:
1. Спасибо, это довольно полезная информация, но в настоящее время у меня возникла проблема. Можете ли вы проверить мою правку 1?
2. Извините, не хватало приведения: CCSprite* sprite = (CCSprite*)body-> getUserData(); Вам также придется сохранить sprite в качестве пользовательских данных тела с помощью body-> setUserData(sprite); Помощник — это класс, поэтому подойдет любой помощник class @interface.
3. спасибо за помощь. Edit2 — это мой окончательный код, как он выглядит?