2012-08-15 50 views
0

我試圖做一個簡單的遊戲,殭屍從屏幕的邊緣隨機產生,一旦它們產生,他們將獲得玩家的最後位置,並繼續朝着那個方向移動,直到他們上臺並被刪除。但是,我似乎遇到了追逐代碼的問題。即使在閱讀了大量提供相同代碼的文章後,我仍然無法使其工作(即時通訊錯誤)。在AS3中製作一個簡單的追逐人工智能

這是主類

package 
{ 
import flash.display.*; 
import flash.events.*; 
import flash.utils.*; 
import flash.ui.*; 

public class main extends MovieClip 
{ 
    private var left,right,up,down,fire,mouseRight,mouseLeft:Boolean; 
    private var speedX,speedY,mobPosX,mobPosY:int; 
    private var num:Number; 
    private var wizard:Player; 
    private var crosshair:Crosshair; 
    private var mobArray,magicArray:Array; 

    public function main() 
    { 
     //Hide mouse for crosshair 
     Mouse.hide(); 
     crosshair = new Crosshair(); 
     addChild(crosshair); 
     crosshair.x = stage.stageWidth; 
     crosshair.y = stage.stageHeight; 

     //Set initial speed 
     speedX = 0; 
     speedY = 0; 

     //Wizard stuff 
     fire = false; 
     wizard = new Player(); 
     addChild(wizard); 
     wizard.x = stage.stageWidth/2; 
     wizard.y = stage.stageHeight/2; 

     //Mob stuff 
     mobArray = new Array(); 
     magicArray = new Array(); 


     //Initialize bool so movement doesn't get stuck on startup 
     up = false; 
     down = false; 
     left = false; 
     right = false; 

    } 

    public function startGame() 
    { 



     addEventListener(Event.ENTER_FRAME,update); 
     stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownHandler); 
     stage.addEventListener(KeyboardEvent.KEY_UP,keyUpHandler); 
     stage.addEventListener(MouseEvent.CLICK, myClick); 


    } 

    private function keyDownHandler(evt:KeyboardEvent) 
    { 

     if (evt.keyCode == 37) 
     { 
      left = true; 
     } 

     if (evt.keyCode == 38) 
     { 
      up = true; 

     } 

     if (evt.keyCode == 39) 
     { 
      right = true; 
     } 

     if (evt.keyCode == 40) 
     { 
      down = true; 
     } 

     if (evt.keyCode == 67) 
     { 
      trace(mobArray.length); 
     } 

    } 

    private function keyUpHandler(evt:KeyboardEvent) 
    { 
     if (evt.keyCode == 37) 
     { 
      left = false; 
      speedX = 0; 
     } 

     if (evt.keyCode == 38) 
     { 
      up = false; 
      speedY = 0; 
     } 

     if (evt.keyCode == 39) 
     { 
      right = false; 
      speedX = 0; 
     } 

     if (evt.keyCode == 40) 
     { 
      down = false; 
      speedY = 0; 
     } 

    } 

    function myClick(eventObject:MouseEvent) 
    { 
     fire = true; 
    } 


    public function update(evt:Event) 
    { 
     //UI 
     crosshair.x = mouseX; 
     crosshair.y = mouseY; 

     //Start player 
     if (left && right == false) 
     { 
      speedX = -8; 
     } 

     if (up && down == false) 
     { 
      speedY = -8; 
     } 

     if (down && up == false) 
     { 
      speedY = 8; 
     } 

     if (right && left == false) 
     { 
      speedX = 8; 
     } 

     wizard.x += speedX; 
     wizard.y += speedY; 

     for (var i = mobArray.length - 1; i >= 0; i--) 
     { 
      //Start mob         //if X is zero and Y > 10, spawn. 

      var m:Zombie = new Zombie(); 
      m.chase((Math.atan2(mobArray[i].y - wizard.y,mobArray[i].x - wizard.x)/Math.PI * 180)); //applies trigo 
      num = Math.random(); 
      if (num < 0.1) 
      { 
       //when x = 0 
       mobPosX = 10; 
       mobPosY = Math.floor(Math.random() * 590) + 10; 
      } 
      else if (num < 0.3) 
      { 
       //when y = 0 
       mobPosX = Math.floor(Math.random() * 790) + 10; 
       mobPosY = 10; 
      } 
      else if (num < 0.6) 
      { 
       mobPosX = 800; 
       mobPosY = Math.floor(Math.random() * 590) + 10; 
       //when x width of screen 
      } 
      else if (num < 0.9) 
      { 
       //y is height of screen 
       mobPosX = Math.floor(Math.random() * 790) + 10; 
       mobPosY = 590; 
      } 
      m.x = mobPosX; 
      m.y = mobPosY; 
      mobArray.push(m); 
      addChild(m); 
     } 




    } 

    private function gameOver() 
    { 
     removeEventListener(Event.ENTER_FRAME,update); 
     stage.removeEventListener(KeyboardEvent.KEY_DOWN,keyDownHandler); 
     stage.removeEventListener(KeyboardEvent.KEY_UP,keyUpHandler); 
    } 



}//end class 
}//end package 

這是殭屍類

package 
    { 
import flash.display.*; 
import flash.events.*; 

public class Zombie extends MovieClip 
{ 
    private var zombSpd:Number; 
    private var angle:Number; 

    public function Zombie() 
    { 
     zombSpd = 10; 
    } 

    public function chase(chaseAngle:Number) 
    { 
     angle = chaseAngle; 
    } 


    public function update() 
    { 
     this.x+=Math.cos(angle*Math.PI/180)*zombSpd; 
     this.y+=Math.sin(angle*Math.PI/180)*zombSpd; 
    } 


}//end class 
    }//end package 

謝謝:)

+0

究竟是什麼問題?殭屍是否沒有朝着正確的方向前進? – Marty 2012-08-15 05:00:52

+0

究竟發生了什麼?你期望會發生什麼? – 2012-08-15 06:36:26

+0

你正在產生越來越多的殭屍每幀蜱,這似乎並不正確。而且它通常不是一個好主意,通過它循環修改數組。 – 2012-08-15 10:44:25

回答

1

我只是重讀你的代碼,看到你必須閱讀並瞭解更多在嘗試創建像這樣的遊戲之前進行編程。

你的殭屍不產卵的原因是你永遠不會進入for循環。 mob數組的長度將從零開始,所以for循環永遠不會發生。

以此爲循環,並創建一個函數來產生主類中的敵人。當你想敵人產卵

function spawn():void{ 
    //code directly from your for loop, with a small change    
     num = Math.random(); 
     if (num < 0.1) 
     { 
      //when x = 0 
      mobPosX = 10; 
      mobPosY = Math.floor(Math.random() * 590) + 10; 
     } 
     else if (num < 0.3) 
     { 
      //when y = 0 
      mobPosX = Math.floor(Math.random() * 790) + 10; 
      mobPosY = 10; 
     } 
     else if (num < 0.6) 
     { 
      mobPosX = 800; 
      mobPosY = Math.floor(Math.random() * 590) + 10; 
      //when x width of screen 
     } 
     else if (num < 0.9) 
     { 
      //y is height of screen 
      mobPosX = Math.floor(Math.random() * 790) + 10; 
      mobPosY = 590; 
     } 
     var m:Zombie = new Zombie(); 
     m.x = mobPosX; 
     m.y = mobPosY; 
     m.chase((Math.atan2(m.y - wizard.y,m.x - wizard.x)/Math.PI * 180)); //applies trigo 
     mobArray.push(m); 
     addChild(m); 
} 

現在您的更新功能,您必須確定:您可以使用您在使用循環的代碼,該功能例如代碼。你可以通過使用計數器來做到這一點。生病讓你計算的那部分,但如果你想殭屍不斷產卵,(其中您在更新功能for循環是)補充一點:在AdvanceEDActionScriptAnimation

//use a counter variable to determine when to execute spawn 
spawn(); 
//loop through all zombies 
for(var i:int = 0; i < mobArray.length; i++){ 
    mobArray[i].update(); 
} 
+0

嗨,感謝您的答案@ Travis, 我實際上很困惑,我是否應該使用: 'm.chase(mathAtan2stuff); m.update();' 或 'mobArray [i] .chase(「Math atan2 stuff,you're right to right」); mobArray [i]。更新();' – kassarin 2012-08-15 13:03:37

+0

你需要更多的練習與as3和編程,我更新了我的答案,以解決我重讀時看到的大部分問題。 – Travis 2012-08-16 06:52:29