Анимация b2Body?

#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 ошибки:

  1. Я получаю не удается инициализировать переменную типа ‘CCSprite’ значением типа ‘void’ в строке body-> getUserData

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

Ответ №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 — это мой окончательный код, как он выглядит?