2017-05-22 46 views
0

所以我正在做一個遊戲(至少要嘗試),而且我有一些隨機位置產生的敵人,然後我把它們放在一個陣列。然後循環框中的函數使該陣列中的敵人在地圖上隨機移動。所以他們的動作是隨機的,但他們都是同步的,所以他們在同一時間做出同樣的動作模式。我試圖弄清楚如何讓它們以不同方式移動,或者至少產生一個隨機延遲,以便它們不是全部同步。這可能是一個基本問題,但我試圖用我目前理解並能夠解釋的方式製作遊戲,所以我會非常感謝您的解釋和建議。Flash as3:用同一個IA做敵人,彼此移動方式不同

這裏是我的代碼(在它的一些我的法語筆記對此深感抱歉,但我需要記住的東西,所以我可以在測試解釋它們:d)

所以ennemies是攝魂怪,從的movieclip「DementorAllSprite」含有ennemy的精靈面向不同方向

這裏是代碼圈外enterFrame事件

//set up var Dementor and array 
//duration: random number between 0 et 150 
//Facing: random number arrondi en dessous, donc entre 0 et 3 
var DementorTimer = 0; 
var DementorDuration = Math.random() * 150; 
var DementorFacing: Number = Math.floor(Math.random() * 4); 
var DementorSpeed: Number = 13; 
var enemies_arr:Array = []; 

這裏的在循環函數

PlayContainer.addEventListener(Event.ENTER_FRAME, PlayLoop); 

function PlayLoop(loopEvent:Event):void 

{ 

    addDementor(); 
    moveDementor(); 

    function addDementor():void 
    { 
     //max number of ennemies 
     if(enemies_arr.length < 20) 
     { 
      //add le dementor if conditions check 
      var Dementor:DementorAllSprite = new DementorAllSprite(); 

      //positions random on a grass container 
      var startX:int = Math.random() * 5760; 
      var startY:int = Math.random() * 3600 ; 
      Dementor.x = startX; 
      Dementor.y = startY; 

      //add Dementor to grass container and set their transparency (they gain alpha when they hit the Player) 
      GrassContainer.addChild(Dementor); 
      Dementor.alpha=0.4; 

      //store the object in an array 
      enemies_arr.push(Dementor); 
     } 
    } 


    //---Mouvements Dementors---// 
    //Timer = 0, Duration entre 0 et 25, chaque loop rajoute 1 au timer (DementorTimer ++;) 
    //jusqu'a ce que le if ne match plus, puis reset 
    //Facing mvmt: 0= back/1= front/2= right/3= left 
    //Frames Dementor: 1= front/2= back/3= left/4= right 
    //switch = if, else if, else if, .... 

    function moveDementor():void 
    { 
     //check les dementors de l'array (de 0 a leur nombre) 
     for (var j:int = 0; j < enemies_arr.length; j++) 
     { 
      if (DementorTimer < DementorDuration) 
      { 
       switch (DementorFacing) 
       { 
        case 0 : 
        enemies_arr[j].y-=DementorSpeed; 
        enemies_arr[j].gotoAndStop(2) 
        break; 

        case 1 : 
        enemies_arr[j].y+=DementorSpeed; 
        enemies_arr[j].gotoAndStop(1) 
        break; 

        case 2 : 
        enemies_arr[j].x+=DementorSpeed; 
        enemies_arr[j].gotoAndStop(4) 
        break; 

        case 3 : 
        enemies_arr[j].x-=DementorSpeed; 
        enemies_arr[j].gotoAndStop(3) 
       } 
       DementorTimer++; 
      } 
      //reset 
      else 
      { 
       DementorDuration = Math.random() * 150; 
       DementorFacing = Math.floor(Math.random() * 4); 
       DementorTimer = 0; 
      } 
     } 
    } 

} 

而且攝魂怪運動是因爲我把它們放在一個數組很短(最初,只有1,他沒有動想了很多改變方向之前,現在他們改變位置非常快,我增強持續時間150(它是一路下跌之前),有一個是一個小的變化,但是這仍然是奇怪)

反正感謝您的幫助和關注

回答

1

好吧,我想你需要一些調整和變化。

var DList:Array = ["up", "down", "left", "right"]; 
var DHash:Object = 
{ 
    "up": {"frame":2, "x": 0, "y":-1}, 
    "down": {"frame":1, "x": 0, "y": 1}, 
    "left": {"frame":3, "x":-1, "y": 0}, 
    "right": {"frame":4, "x": 1, "y": 0} 
} 

// Decides how many steps Dementor should take before next reset. 
function resetDementor(target:DementorAllSprite):void 
{ 
    target.stepsLeft = int(10 + 10 * Math.random()); 
} 

// Turns Dementor to a random direction. 
function randomDirection(target:DementorAllSprite):void 
{ 
    target.direction = DList[int(DList.length * Math.random())]; 
    target.gotoAndStop(DHash[target.direction]['frame']); 
} 

PlayContainer.addEventListener(Event.ENTER_FRAME, PlayLoop); 

// First of all, for goodness sake, don't define functions inside functions. 
function PlayLoop(e:Event):void 
{ 
    if (enemies_arr.length < 20) addDementor(); 

    moveDementor(); 
} 

function addDementor():void 
{ 
    //add le dementor if conditions check 
    var Dementor:DementorAllSprite = new DementorAllSprite(); 

    //positions random on a grass container 
    var startX:int = Math.random() * 5760; 
    var startY:int = Math.random() * 3600 ; 
    Dementor.x = startX; 
    Dementor.y = startY; 

    // I guess DementorAllSprite is a MovieClip. 
    // Otherwise you need to add stepsLeft:int and direction:String to the class definition. 
    randomDirection(Dementor); 
    resetDementor(Dementor); 

    //add Dementor to grass container and set their transparency (they gain alpha when they hit the Player) 
    GrassContainer.addChild(Dementor); 
    Dementor.alpha=0.4; 

    //store the object in an array 
    enemies_arr.push(Dementor); 
} 

function moveDementor():void 
{ 
    //check les dementors de l'array (de 0 a leur nombre) 
    for (var j:int = 0; j < enemies_arr.length; j++) 
    { 
     // Get the reference to Dementor. 
     var Dementor:DementorAllSprite = enemies_arr[j]; 

     // Check if Dementor needs a reset. 
     if (Dementor.stepsLeft < 0) 
     { 
      randomDirection(Dementor); 
      resetDementor(Dementor); 
     } 

     // Get the directions object with regard to Dementor's direction. 
     var aDir:Object = DHash[Dementor.direction]; 

     // Move the Dementor. 
     Dementor.x += aDir['x'] * DementorSpeed; 
     Dementor.y += aDir['y'] * DementorSpeed; 

     // Reduce the number of steps to go. 
     Dementor.stepsLeft--; 
    } 
} 
+0

感謝您的快速回答,並且對我的新手錯誤感到抱歉,我正在學習。 所以我有點理解你的代碼,但你似乎以非常先進的方式工作,我會試着理解,以便我可以稍後在測試中解釋哈哈。 與此同時,我試圖運行它,我得到了以下的錯誤:「target.direction = DList [int(DList.length * Math.random)」隱式強制將一個類型爲void的類型的值強制爲無關類型數字)];' – Ymines

+0

@Ymines固定。應該是一個函數調用:** Math.random()** – Organis

+0

一切正常,非常感謝!如果你有時可以解釋邏輯,或者像'DHash:Object'這樣的代碼的高級部分,例如?我隱約明白,當你提及它時,它有什麼用處,但我無法解釋爲什麼以及如何使用它。但是,如果你不是這一切,那麼你幫了我很多,祝你有個美好的一天:D – Ymines