2014-05-22 2 views
0

У меня есть этот код, который дает b2Body импульс к курсору при нажатии на сцену.Перемещение b2body с клавиатурой

private function clicked(e:MouseEvent):void 
{ 
var impulse_x:Number = (mouseX/world_scale - mainChar.GetPosition().x); 
var impulse_y:Number = (mouseY/world_scale - mainChar.GetPosition().y); 
var impulse:b2Vec2 = new b2Vec2(impulse_x, impulse_y); 

mainChar.ApplyImpulse(impulse, mainChar.GetPosition()); 
} 

Я пытался использовать клавиатуру правой клавиши со стрелками для перемещения и поэтому в функции обновления, я добавил, если клавиша [Keyboard.RIGHT]:

private function update(e:Event):void { 
world.Step (1/30, 10, 10); 
if (key[Keyboard.RIGHT]) { 
impulse_x = 3;    
mainChar.ApplyImpulse(impulse, mainChar.GetPosition()); 
} 
} 


private function onKeyUp(e:KeyboardEvent):void 
{ 
key[e.keyCode] = false; 
} 

private function onKeyDown(e:KeyboardEvent):void 
{ 
key[e.keyCode] = true; 
} 

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

Хотя это не дает мне никаких ошибок.

EDIT: Весь код!

package 
{ 
    import Box2D.Collision.Shapes.b2PolygonShape; 
    import Box2D.Common.Math.b2Vec2; 
    import Box2D.Dynamics.b2Body; 
    import Box2D.Dynamics.b2BodyDef; 
    import Box2D.Dynamics.b2FixtureDef; 
    import Box2D.Dynamics.b2World; 
    import Box2D.Dynamics.Contacts.b2ContactEdge; 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.KeyboardEvent; 
    import flash.events.MouseEvent; 
    import flash.ui.Keyboard; 

    public class Main extends Sprite 
    { 
     public var world:b2World = new b2World(new b2Vec2(0, 0), true); 
     public var world_scale:Number = 30; 
     public var mainChar:b2Body; 
     private var ground:b2Body; 
     public var keys:Array = []; 
     public var beingPressed:Boolean; 
     public var impulse_x:Number; 
     public var impulse_y:Number; 
     public var impulse:b2Vec2 = new b2Vec2(impulse_x, impulse_y); 

     public function Main():void 
     { 
      createMainCharacter(stage.stageWidth/2, stage.stageHeight/2, 50, 100); 

      var th:uint = 10; 

      addEventListener(Event.ENTER_FRAME, update); 
      //stage.addEventListener(MouseEvent.CLICK, clicked); 
      stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); 
      stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); 
     } 

     /**private function clicked(e:MouseEvent):void 
     { 
      var impulse_x:Number = (mouseX/world_scale - mainChar.GetPosition().x); 
      var impulse_y:Number = (mouseY/world_scale - mainChar.GetPosition().y); 

      var impulse:b2Vec2 = new b2Vec2(impulse_x, impulse_y); 
      mainChar.ApplyImpulse(impulse, mainChar.GetPosition()); 
     }**/ 

     private function update(e:Event):void 
     { 
      world.Step (1/30, 10, 10); 


      var temp:Sprite; 
      for (var body:b2Body = world.GetBodyList(); body != null; body = body.GetNext()) 
      { 
       if (body.GetUserData()) 
       { 
        temp = body.GetUserData() as Sprite; 
        temp.x = body.GetPosition().x * world_scale; 
        temp.y = body.GetPosition().y * world_scale; 
        temp.rotation = body.GetAngle() * (180/Math.PI); // radians to degrees 
       } 
      } 

      if (keys[Keyboard.RIGHT]) 
      { 
       impulse_x = 3; 
       impulse_y = 0; 
       mainChar.ApplyImpulse(impulse, mainChar.GetPosition()); 
      } else { 
       impulse_x = 0; 
       impulse_y = 0; 
       } 

     } 

     private function createMainCharacter(x:Number, y:Number, width:Number, height:Number):void 
     { 

      var mainCharSprite:Sprite = new Sprite(); 
      mainCharSprite.graphics.beginFill(0x000000); 
      mainCharSprite.graphics.drawRect(-width/2, -height/2 , width, height); 
      mainCharSprite.graphics.endFill; 
      mainCharSprite.x = x; 
      mainCharSprite.y = y; 
      addChild(mainCharSprite); 

      var mainCharDef:b2BodyDef = new b2BodyDef(); 
      mainCharDef.userData = mainCharSprite; 
      mainCharDef.type = b2Body.b2_dynamicBody; 
      mainCharDef.position.Set (x/world_scale, y/world_scale); 

      mainChar = world.CreateBody(mainCharDef); 

      var shape:b2PolygonShape = new b2PolygonShape(); 
      shape.SetAsBox((width/2)/world_scale, (height/2)/world_scale); 

      var fixtureDef:b2FixtureDef = new b2FixtureDef(); 
      fixtureDef.shape = shape; 
      fixtureDef.restitution = 0.1; 
      fixtureDef.friction = 0.1; 
      fixtureDef.density = 0.5; 

      mainChar.CreateFixture(fixtureDef); 

     } 

     private function onKeyUp(e:KeyboardEvent):void 
     { 
      keys[e.keyCode] = false; 
     } 

     private function onKeyDown(e:KeyboardEvent):void 
     { 
      keys[e.keyCode] = true; 
     } 

    } 

} 
+0

Похоже, вы только настройки х часть импульса. Не следует ли установить значение y в ноль? – iforce2d

+0

Не работает D: read edit – RAO

ответ

1

Изменение значений impulse_x и impulse_y не будет обновлять значения, используемые импульсом b2Vec2. В AS3 примитивы передаются по значению не по ссылке. Если вы хотите, чтобы объект b2Vec2, на который ссылается переменная импульса, чтобы изменить его значения, необходимо изменить их непосредственно на самом объекте:

impulse.x = 3.0; 
impulse.y = 0.0; 
mainChar.ApplyImpulse(impulse, mainChar.GetPosition()); 
+0

Я не очень хорошо это понимаю «В примитивах AS3 передается значение не по ссылке». Могли бы вы/кто-нибудь объяснить это другими словами? Может быть, метафора. Я действительно что-то изменил, но, по-моему, это связано с этим, хотя я не уверен, почему это сработало. Я изменил этот 'mainChar.ApplyImpulse (impulse, mainChar.GetPosition())' на этот 'mainChar.ApplyImpulse (новый b2Vec2 (impulse_x, impulse_y), mainChar.GetPosition());' – RAO

+1

Примитив - это строки и числа. Когда вы создаете примитив такого типа, как это: var impluse_x: Number = 3 и передайте его в b2Vec2, как этот новый b2Vec2 (impluse_x, impluse_x); вы передаете значение (3), а не самую переменную, поэтому меняя позже значение переменной impule_x на 5 не влияет на b2Vec2. – BotMaster

+0

Чтобы изменить их непосредственно на самом объекте, вы подразумеваете в импульсе b2Vec2? – RAO