将AS3自动游戏循环重构为受控游戏循环

时间:2010-08-05 16:45:52

标签: actionscript-3

我需要控制我的基础游戏类的更新方式:

package
{
    import flash.display.Sprite;
    import flash.events.KeyboardEvent;
    public class Test extends Sprite
    {
        private var sprite:Sprite;

        public function Test()
        {
            sprite = new Sprite();
            sprite.graphics.beginFill(0xFF0000, 1);
            sprite.graphics.drawRect(0, 0, 20, 20);
            sprite.graphics.endFill();
            addChild(sprite);
            this.stage.addEventListener(KeyboardEvent.KEY_UP,
                moveSprite);
            this.stage.addEventListener(KeyboardEvent.KEY_DOWN,
                moveSprite);    
        }


        private function moveSprite(keyEvent:KeyboardEvent):void
        {
            switch (keyEvent.keyCode)
            {
                case 37:
                    sprite.x--
                    break;
                case 38:
                    sprite.y--;
                    break;
                case 39:
                    sprite.x++
                    break;
                case 40:
                    sprite.y++;
                    break;
                default:
                    break;
            }
        }
    }
}

在每次按键/释放后,AS3会自动将精灵绘制到屏幕上,但我需要这样做。唧唧在这里得到更新机制?我需要这样的东西 - 所有时间重复游戏循环,设置为每次最后更新/重绘。有什么想法我怎么能实现这个目标?

感谢大家的帮助。

2 个答案:

答案 0 :(得分:0)

您可以将其转换为具有时间轴的MovieClip,然后根据需要在Event.ENTER_FRAME上更新动画。

package
{
    import flash.display.Sprite;
    import flash.display.MovieClip;
    import flash.events.KeyboardEvent;
    import flash.events.Event;
    public class Test extends MovieClip
    {
        private var sprite:Sprite;

        public function Test()
        {
            sprite = new Sprite();
            sprite.graphics.beginFill(0xFF0000, 1);
            sprite.graphics.drawRect(0, 0, 20, 20);
            sprite.graphics.endFill();
            addChild(sprite);
            this.stage.addEventListener(KeyboardEvent.KEY_UP,
                moveSprite);
            this.stage.addEventListener(KeyboardEvent.KEY_DOWN,
                moveSprite);    
            this.stage.addEventListener(Event.ENTER_FRAME,
                moveSpriteRight);    
        }


        private function moveSprite(keyEvent:KeyboardEvent):void
        {
            switch (keyEvent.keyCode)
            {
                case 37:
                    sprite.x--
                    break;
                case 38:
                    sprite.y--;
                    break;
                case 39:
                    sprite.x++
                    break;
                case 40:
                    sprite.y++;
                    break;
                default:
                    break;
            }
        }
        private function moveSpriteRight(e:Event):void
        {
          sprite.x++;
        }
    }
}

答案 1 :(得分:0)

你也可以使用Timer循环来实现这些目的:

package
{
  import flash.display.Sprite;
  import flash.utils.Timer;
  import flash.events.TimerEvent;

 public class Game
 {
   private var _timerTickRate : int = 500; //milliseconds
   private var _timer : Timer;

   public function Game()
   {
       init();
   }

   private function init() : void
   {
       _timer = new Timer( _timerTickRate );
       _timer.addEventListener( TimerEvent.TIMER, onTimerTick );
       _timer.start(); //to stop, call _timer.stop() and remove this listener
   }

   private function onTimerTick( event : TimerEvent ) : void
   {
      //do game loop stuff here.
   }
 }
}