2011-06-18 147 views
1

我有2个精灵在水平移动,我需要它们自然掉下来,当他们碰到墙壁时。 我知道如何以简单的方式改变每一帧的位置,但这似乎并不自然,可能不是正确的方法。精灵落在cocos2d

有一种方法来发现碰撞,然后让他们跌倒,当他们的速度和y轴考虑到?

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

任何方向都会很棒。 thanx。

回答

2

首先为您的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。即Sprite,Wall。你也可以以相反的方式做到这一点,你始终施加重力,同时也施加反作用力。然后,当你与墙壁接触时,你停止施加另一个力,重力就会生效。

或者像iforce2d如何检查,当精灵的主体的linearvelocity接近或等于零,因为这将表明它已经击中了阻止它的东西,而不仅仅是一堵墙,那么你可以只需设置为true即可。其余的步骤功能将完成。这是有限的,因为它只是需要它放慢速度,以触发它不击中可能不需要的墙。

0

使用任何物理引擎设置世界上的正确引力(b2World在box2D的情况下)并设置您的身体的初始速度。所以它会自然下降

0

如果你自己设置速度,这取决于你让它看起来很自然:) 改变速度的垂直部分不是一个好主意 - 只是让它如何:

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

非常感谢。 – Curnelious