用键盘移动b2body

时间:2014-05-22 15:56:06

标签: actionscript-3 flash box2d flashdevelop

我有这个代码,当你点击舞台时,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());
}

我试图使用键盘右箭头键进行移动,因此在更新功能中我添加了if键[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在屏幕左上方并且停留在那里并且不移动。我正在改变脉冲值,然后进入应用于身体的矢量。

虽然它没有给我任何错误。

编辑:整个代码!

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;
        }

    }

}

1 个答案:

答案 0 :(得分:1)

更改impulse_x和impulse_y的值不会更新b2Vec2脉冲使用的值。在AS3中,原语是通过值而不是通过引用传递的。如果您希望变量impulse引用的b2Vec2对象更改其值,则需要直接在对象本身上更改它们:

impulse.x = 3.0;
impulse.y = 0.0;
mainChar.ApplyImpulse(impulse, mainChar.GetPosition());
相关问题