2014-05-22 4 views
0

나는 스테이지를 클릭 할 때 b2Body가 커서쪽으로 가하는이 코드를 가지고 있습니다.키보드로 b2body 이동하기

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 간다가 왼쪽 가기 :

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] 경우 추가 키보드를 사용하려고했다 화면이 움직이지 않고 움직이지 않습니다. 몸에 적용되는 벡터로 들어가는 임펄스 값을 변경하려고합니다.

아무런 오류가 없지만.

편집 : 전체 코드!

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

임펄스의 x 부분 만 설정하는 것처럼 보입니다. y 부분을 0으로 설정하면 안됩니까? – iforce2d

+0

작동하지 않음 D : 읽기 편집 – RAO

답변

1

impulse_x 및 impulse_y의 값을 변경하면 b2Vec2 임펄스가 사용하는 값을 업데이트하지 않습니다. AS3에서는 프리미티브가 참조가 아닌 값으로 전달됩니다. 변수 impulse가 참조하는 b2Vec2 객체의 값을 변경하려면 객체 자체에서 직접 값을 변경해야합니다.

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

이 내용을 잘 이해하지 못합니다. "AS3에서는 프리미티브가 참조가 아닌 값으로 전달됩니다." 당신/다른 사람이 다른 말로 설명 할 수 있겠습니까? 아마 은유 일 겁니다. 나는 그것이 왜 효과가 있었는지 잘 모르겠지만 나는 그것에 관련되어 있다고 믿는 것을 변화 시켰습니다. 이 mainChar.ApplyImpulse (impulse, mainChar.GetPosition());를 mainChar.ApplyImpulse (new b2Vec2 (impulse_x, impulse_y), mainChar.GetPosition())로 변경했습니다. – RAO

+1

프리미티브는 문자열과 숫자입니다. var impluse_x : Number = 3과 같은 타입의 프리미티브를 생성하고이 새로운 b2Vec2 (impluse_x, impluse_x)와 같은 b2Vec2에 전달합니다. 변수 자체가 아닌 값 (3)을 전달하므로 나중에 변수 impule_x의 값을 5로 변경하면 b2Vec2에 영향을 미치지 않습니다. – BotMaster

+0

오브젝트 자체에서 직접 변경하려면 b2Vec2의 충동을 의미합니까? – RAO