简单的键盘控制

通过键盘控制物体的移动,改变物体的线速度即可以改变它的运动状态。通过监听舞台的MouseEvent.MOUSE_DOWN和MouseEvent.MOUSE_UP事件来移动物体。当mouseDown时,设置一个Boolean值记下按下的方向键,在Event.ENTER_FRAME事件中根据设置的Boolean值来移动物体,具体如下:

1.添加监听

addEventListener(Event.ENTER_FRAME, onFrame);
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDownHandle);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUpHandle);

2.创建物体,创建时设置一个名称,因为现实对象为MovieClip,所以可以动态增加其属性。

createCircle(this, 30, 300, 20, 0, false, new Circle());
private function createCircle(container:DisplayObjectContainer,xpos:int,ypos:int,radius:int,rotation:Number,isStatic:Boolean,obj:MovieClip):void
{
   var shapeDef:b2CircleDef = new b2CircleDef();
   isStatic?shapeDef.density = 0:shapeDef.density = 5;
   shapeDef.restitution = 0.1;
   shapeDef.friction = 0.4;
   shapeDef.radius = radius / _physcale;
   var bodyDef:b2BodyDef = new b2BodyDef();
   bodyDef.angle = rotation;
   bodyDef.position.Set(xpos / _physcale, ypos / _physcale);
   bodyDef.userData = obj;
   var body:b2Body = _world.CreateBody(bodyDef);
   body.CreateShape(shapeDef);
   body.SetMassFromShapes();
   obj.scaleX = radius*2 / obj.width;
   obj.scaleY = radius * 2 / obj.height;
   obj.name = "hero";
   obj.body = body;
   container.addChild(obj);
}

3.处理事件

private function onKeyDownHandle(e:KeyboardEvent):void 
{
     setBoolean(e.keyCode, true);
}
  
private function onKeyUpHandle(e:KeyboardEvent):void 
{
     setBoolean(e.keyCode,false);
}

private function setBoolean(keyCode:int, flag:Boolean ):void 
{
     switch(keyCode)
     {
        case 37:
           isLeft = flag;
           break;
        case 38:
           isUp = flag;
           break;
        case 39:
           isRight = flag;
           break;
     }

}

private function onFrame(e:Event):void 
{
     moveBody();
   
     _world.Step(_timeStep, _iteration);
   
     for (var bb:b2Body = _world.m_bodyList; bb; bb = bb.m_next )
     {
        if (bb.m_userData is DisplayObject)
        {
            bb.m_userData.x = bb.GetPosition().x * _physcale;
            bb.m_userData.y = bb.GetPosition().y * _physcale;
            bb.m_userData.rotation = bb.GetAngle() * 180 / Math.PI;
        }
     }
}

private function moveBody():void 
{
     var child:MovieClip = this.getChildByName("hero") as MovieClip;
     var body:b2Body = child.body as b2Body;
   
     if (isLeft)
     {
        body.WakeUp();
        body.m_linearVelocity.x -= 0.5;
     }
     if (isRight)
     {
        body.WakeUp();
        body.m_linearVelocity.x += 0.5;
     }
     if (isUp)
     {
        if (body.m_linearVelocity.y > -1)
        {
           body.WakeUp();
           body.ApplyImpulse(new b2Vec2(0, -30), body.GetWorldCenter());
        }
     }

}

 

posted @ 2010-03-29 21:11  ywxgod  阅读(372)  评论(0编辑  收藏  举报