Xcode 落在cocos2d中的精灵

Xcode 落在cocos2d中的精灵,xcode,cocos2d-iphone,box2d,Xcode,Cocos2d Iphone,Box2d,我有两个水平移动的精灵,当它们撞到墙上时,我需要它们自然落下。 我知道如何用一种简单的方法来改变每一帧的位置,但这似乎并不自然,也可能不是正确的方法 当考虑到速度和y轴时,有一种方法可以发现碰撞,然后使它们坠落 我只是找不到一个简单的方法用box2d或花栗鼠来做 任何方向都很好。 thanx.使用任何phys引擎,只需设置世界上正确的重力(box2D的情况下为b2World),并设置身体的初始速度。因此,它将自然下降如果您自己设置速度,则取决于您使其看起来自然:) 改变速度的垂直部分不是一个好主

我有两个水平移动的精灵,当它们撞到墙上时,我需要它们自然落下。 我知道如何用一种简单的方法来改变每一帧的位置,但这似乎并不自然,也可能不是正确的方法

当考虑到速度和y轴时,有一种方法可以发现碰撞,然后使它们坠落

我只是找不到一个简单的方法用box2d或花栗鼠来做

任何方向都很好。
thanx.

使用任何phys引擎,只需设置世界上正确的重力(box2D的情况下为b2World),并设置身体的初始速度。因此,它将自然下降

如果您自己设置速度,则取决于您使其看起来自然:) 改变速度的垂直部分不是一个好主意-保持原样即可:

b2Vec2 vel = body->GetLinearVelocity();
vel.x = ...;
body->SetLinearVelocity( vel );

首先,将自定义联系人侦听器添加到您的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);
           }
      }
}
这取决于将所有实体的userdata设置为保存它的类。i、 雪碧,墙。你也可以用相反的方法,一直施加重力,同时施加相反的力。然后,当你与墙壁接触时,你停止施加其他力,重力生效

或者像@iforce2d所说的,只需检查精灵主体的linearvelocity是否接近或等于零,因为这表明它击中了阻止它的东西,而不仅仅是墙壁,然后您可以将hit设置为true。步进函数将完成其余部分。这是有限的,因为它只是需要它放慢速度来触发它,而不是撞到一堵可能不需要的墙