Хобрук: Ваш путь к мастерству в программировании

Box2D/cocos2d анимация в точку с вращением

Я новичок в Box2D и cocos2d. Я пытаюсь сделать что-то, что, как мне казалось, было бы довольно просто, но это оказалось сложнее, чем я ожидал, и я нигде не могу найти рабочий ответ.

По сути, я хочу переместить b2body и повернуть его в определенную точку с анимацией.

Я могу получить его в правильное положение и вращение с помощью:

targetBody->SetTransform(b2Vec2(10.0f,1.0f),10);

Но я понятия не имею, как анимировать его там с течением времени. Я попытался использовать анимацию cocos2d для спрайта, используемого для тела, но это ничего не дает. Любые идеи?

20.01.2013

Ответы:


1

Есть несколько способов сделать это.

Вы можете использовать SetTransform каждый раз, чтобы постепенно обновлять положение тела с течением времени, фактически выполняя анимацию самостоятельно. Недостатком этого метода является то, что тело «телепортируется» в новое положение, а не движется, поэтому у него нет импульса, а это означает, что вы можете получить странные результаты, если оно столкнется с чем-нибудь по пути. Тем не менее, если вы знаете, что он ничего не заденет или ему не нужно реагировать на столкновение, все будет в порядке.

Другой способ — использовать SetLinearVelocity и SetAngularVelocity, чтобы придать телу правильное движение. Это сохранит реалистичность результатов столкновения, и вам не нужно ничего обновлять каждый раз. С другой стороны, вам нужно будет определить, когда тело достигло желаемого положения, а затем установить скорость обратно на ноль, иначе оно просто продолжит двигаться. Для динамических тел вам также нужно будет каким-то образом противодействовать гравитации, либо установив шкалу гравитации тела на ноль, либо применив направленную вверх силу, чтобы уравновесить гравитацию, либо изменив тип тела на кинематический во время движения.

20.01.2013
  • Это путь, по которому я начал (setLinearVelocity/Angular), и, похоже, он помогает. Спасибо. 20.01.2013

  • 2

    Как правило, вы используете Box2D для имитации физического поведения объектов по отношению друг к другу. Правила механики, реализованные Box2D, определяют, как будут двигаться ваши cocos2d CCSprite, если вы постоянно обновляете перевод и вращение ваших спрайтов в соответствии с их соответствующими Box2d b2Body. У вас будет своего рода многократно вызываемый tick: метод, в котором вы step перемещаете свой мир Box2d во времени и в котором вы обновляете позиции своих спрайтов в соответствии с результатами моделирования Box2d.

    Этот шаблон соответствует b2Bodys типа b2_dynamicBody. Физические законы диктуют движение тела в этом случае, и ваши спрайты будут следовать этим результатам моделирования. Вот почему установка конфликтующей позиции спрайта с помощью CCAction или даже напрямую будет отменена почти мгновенно со следующим tick:.

    Решение 1: кинематический тип тела

    Однако существуют и другие режимы для b2Body, и один из них — b2_kinematicBody, в котором перевод больше не определяется миром, а скоростями или угловыми скоростями, которые вы указываете через сеттеры. Таким образом, было бы одним из решений работать с типом кузова b2_kinematicBody, например:

    b2BodyDef bdef;
    bdef.type = b2_kinematicBody;
    

    При этом вы будете явно управлять скоростью и угловой скоростью b2Body. В этом случае Box2d по-прежнему отвечает за перемещение тел, но в соответствии с заданными вами скоростями и без каких-либо силовых эффектов столкновения или гравитации, применяемых к этому конкретному телу. Также с этой стратегией ваши CCSprites будут следовать за b2Bodys. Установка конфликтующих позиций для ваших спрайтов напрямую или путем применения CCAction не имеет смысла по той же причине, что описана выше.

    Решение 2: отделить спрайты от Box2d

    Альтернативным способом анимации спрайтов было бы полное отделение этих спрайтов от Box2d. В этом случае у вас просто не будет b2Body, управляющего положением спрайта, который вы собираетесь анимировать. Теперь в этом случае только вы будете диктовать положение и поворот вашего CCSprite, т.е. напрямую либо через его свойство position, либо применяя CCAction.

    20.01.2013
    Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..