代码之家  ›  专栏  ›  技术社区  ›  Jarek

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

  •  0
  • Jarek  · 技术社区  · 16 年前

    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 回复  |  直到 16 年前
        1
  •  0
  •   Sandro    16 年前

    您可以将其转换为具有时间线的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++;
            }
        }
    }
    
        2
  •  0
  •   grumblebee    16 年前

    您还可以使用计时器循环执行以下操作:

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