在Flash中创建多个对象(数组)时出现问题

问题描述:

我在Flash中制作了一个基本的Galaga类型的游戏,并且遇到了问题。这是我第一次真正搞乱ActionScript。
我为我的敌人创造了一个阵列,并想知道如何让他们在他们自己的位置产卵,比如在Galaga,然后让他们从左到右均匀地移动,一直下到舞台的边缘。在Flash中创建多个对象(数组)时出现问题

游戏

package 
{ 
    import flash.display.MovieClip; 
    import flash.events.Event; 
    import flash.utils.Timer; 
    import flash.events.TimerEvent; 
    import flash.events.KeyboardEvent; 
    import flash.ui.Keyboard; 
    public class SpaceVigilanteGame extends MovieClip 

    { 
     public var army:Array; 
     public var avatar:Avatar; 
     public var gameTimer:Timer; 
     public var useMouseControl:Boolean; 
     public var rightKeyIsBeingPressed:Boolean; 
     public var leftKeyIsBeingPressed:Boolean; 
     var gameWidth:int = 0; 
     var gameHeight:int = 0; 

     public function SpaceVigilanteGame() 
     { useMouseControl = false; 
      leftKeyIsBeingPressed = false; 
      rightKeyIsBeingPressed = false; 
      army = new Array(); 
      var newEnemy = new Enemy(60, 30); 
      army.push(newEnemy); 
      addChild(newEnemy); 
      avatar = new Avatar(); 
      addChild(avatar); 

      if (useMouseControl) 
      { 
       avatar.x = mouseX; 
       avatar.y = mouseY; 
      } 
      else 
      { 
       avatar.x = 50; 
       avatar.y = 400; 
      } 

      gameWidth = stage.stageWidth; 
      gameHeight = stage.stageHeight; 


      gameTimer = new Timer(25); 
      gameTimer.addEventListener(TimerEvent.TIMER, moveEnemy); 
      gameTimer.addEventListener(TimerEvent.TIMER, moveAvatar); 
      gameTimer.start(); 
      stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyPress); 
      stage.addEventListener(KeyboardEvent.KEY_UP, onKeyRelease); 

     function onKeyPress(keyboardEvent:KeyboardEvent):void 
     { 
      if (keyboardEvent.keyCode == Keyboard.RIGHT) 
      { 
       rightKeyIsBeingPressed = true; 
      } 
      else if (keyboardEvent.keyCode == Keyboard.LEFT) 
      { 
       leftKeyIsBeingPressed = true; 
      } 
     } 
     function onKeyRelease(keyboardEvent:KeyboardEvent):void 
     { 
      if (keyboardEvent.keyCode == Keyboard.RIGHT) 
      { 
       rightKeyIsBeingPressed = false; 
      } 
      else if (keyboardEvent.keyCode ==Keyboard.LEFT) 
      { 
       leftKeyIsBeingPressed = false; 
      } 
     } 
     } 
     public function moveEnemy(timerEvent:TimerEvent):void 
     { 
      for each (var enemy:Enemy in army) 
      { 

      } 
      //enemy.moveDownABit(); 
      if(enemy.x+enemy.width+2<=gameWidth) 
       { 
        enemy.moveRight(); 
       } 
      else if(enemy.y+enemy.height+2<=gameHeight) 
       { 
        enemy.moveDown(); 
       } 
      else if(enemy.x-2>=0) 
       { 
        enemy.moveLeft(); 
       } 
      else if(enemy.y-2>=0) 
       { 
        enemy.moveUp(); 
       } 

     } 
     public function moveAvatar(timerEvent:TimerEvent):void 
     { 
      if (useMouseControl) 
      { 
       avatar.x = mouseX; 
       avatar.y = mouseY; 
      } 
      else if (rightKeyIsBeingPressed) 
       { 
        avatar.moveRight(); 
       } 
      else if (leftKeyIsBeingPressed) 
       { 
        avatar.moveLeft(); 
       } 
     } 



    } 
} 

敌对阶级

package 
{ 
    import flash.display.MovieClip; 
    public class Enemy extends MovieClip 
    { 
     public function Enemy(startX:Number, startY:Number) 
     { 
      x = startX; 
      y = startY; 
     } 


     public function moveRight():void 
     { 
      x = x + 2; 
     } 

     public function moveDown():void 
     { 
      y = y + 2; 
     } 

     public function moveLeft():void 
     { 
      x = x - 2; 
     } 

     public function moveUp():void 
     { 
      y = y - 2; 
     } 
    } 
} 

我建议敌人实例中(其中有似乎只有一个),你应该设置的位置相互之间。

为例:

你的代码目前这是否:

var newEnemy = new Enemy(60, 30); 
army.push(newEnemy); 
addChild(newEnemy); 

也许它应该做这样的事情:

for(var x:int = 0; x< ARMY_WIDTH; x++) 
{ 
    for(var y:int = 0; y < ARMY_HEIGHT; y++) 
    { 
     army.push(new Enemy(60 + x * X_GAP, 30 + y *Y_GAP)); 
     this.addChild(army[army.length-1]); 
    } 
} 

现在,我已经做了很多假设在上面的代码中;我发明了你可能没有的常量,而我只解决了你眼前的问题。理想情况下,您需要为您的问题寻找更高级的解决方案,例如为您创建敌人的工厂类,或者从一群敌人中回收它们。

然而,你刚刚开始,你会及时地计算出这些东西。祝你好运,希望你继续发展你的技能:)

+0

谢谢,我可以看到你在做什么,是的,我没有那些常量,我一定会看看工厂类。 – 2015-04-01 16:13:39