спрайты падающие в cocos2d - PullRequest
1 голос
/ 18 июня 2011

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

Есть способ обнаружить столкновение, а затем заставить его упасть, когда их скорость и ось Y учитывает?

Я просто не мог найти простой способ сделать это с box2d или chipmunk.

любое направление было бы замечательно.спасибо.

Ответы [ 3 ]

2 голосов
/ 19 июня 2011

Сначала добавьте пользовательский прослушиватель контактов в ваш b2World.

public class Main
{
      public function Main()
      {
            //init stuff
            var cc:CustomContactListener = new CustomContactListener();
            world.setContactListener(cc);
      }
}

//then on hit call the hit function on sprite
public class CustomContactListener extends b2ContactListener
{
      //Called when a contact point is added.
      public override function Add(point:b2ContactPoint):void 
      {
            //checks if the first shape is a sprite and second is a wall if true call Hit
            if (point.shape1.GetBody().GetUserData().isSprite && point.shape2.GetBody().GetUserData().isWall)
            {
                 point.shape1.GetBody().GetUserData().Hit();
            }
            else if (point.shape2.GetBody().GetUserData().isSprite && point.shape1.GetBody().GetUserData().isWall)
            {
                 point.shape2.GetBody().GetUserData().Hit();
            }
      }
}


public class Sprite
{
      public var hit:Boolean = false;

      //Set hit to true and start applying realistic downward force
      public function Hit()
      {
           hit = true;
      }

      //Enter frame event that applies force
      public function step(e:Event)
      {
           if (hit)
           {
                 b2Vec2 force = new b2Vec2(0, -9.8);
                 bodyOfSprite.ApplyLinearForce(force);
           }
      }
}

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

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

0 голосов
/ 19 июня 2011

Если вы устанавливаете скорость самостоятельно, вам нужно, чтобы она выглядела естественно :) Изменение вертикальной части скорости не очень хорошая идея - просто оставьте ее такой, какой она была:

b2Vec2 vel = body->GetLinearVelocity();
vel.x = ...;
body->SetLinearVelocity( vel );
0 голосов
/ 18 июня 2011

используя любой физический движок, просто установите правильную гравитацию в мире (b2World в случае box2D) и установите начальную скорость вашего тела. Так будет падать естественно

...