2011-12-15 72 views
0

我對遊戲中的一些循環功能,這個循環開放的9箱,這裏的代碼延時與的ActionScript環3

function random_item_2(coinsx) 
{ 
    var listItem:Array = new Array(); 
    for (var i:uint=0; i<15; i++) 
    { 
     listItem.push(i); 
    } 
    ItemLeft = 0; 
    for (var x:uint=0; x<boardWidth; x++) 
    { 
     for (var y:uint=0; y<boardHeight; y++) 
     { 
      var thisItem:FirstBox = new FirstBox(); 
      thisItem.x = x * IcardHorizontalSpacing + IboardOffsetX; 
      thisItem.y = y * IcardVerticalSpacing + IboardOffsetY; 
      var r:int = Math.floor(Math.random() * listItem.length); 
      thisItem.cardface = listItem[r]; 
      listItem.splice(r,1); 
      thisItem.gotoAndStop(thisItem.cardface+2); 
      var itemFound = this.foundItem(thisItem.cardface); 
      if (itemFound == 50 || itemFound == 100 || itemFound == 250 || itemFound == 500 || itemFound == 1000) 
      { 
       var itemC = Number(coinsx) + Number(itemFound); 
       coinsx = itemC; 
       update_coins(Number(coinsx)); 
       info_coinstext(String(coinsx)); 
       trace('Gold Coins Found > '+itemFound); 
      }else if(itemFound!='Kosong'){ 
       updateItem(itemFound); 
       trace('Item Found > '+itemFound); 
      } 
      addChild(thisItem); 
      ItemLeft++; 
     } 
    } 
} 

的問題是,在一個時間9盒打開,而不是一個一個,我想盒打開包裝盒一個接一個,第一個盒子後不久的算法中,我想

open the first box 
delay 5 sec 
open the second box 
delay for 5 sec 

我怎麼能做到這一點打開,以便接下來的窗口就會打開,在這裏?

回答

1

要在for循環,你應該寫這樣的添加延遲:

function random_item_2(coinsx) 
{ 
    var listItem:Array = new Array(); 
    for (var i:uint=0; i<15; i++) 
    { 
     listItem.push(i); 
    } 
    ItemLeft = 0; 

    const DELAY:int = 5000; 

    for (var x:uint=0; x<boardWidth; x++) 
    { 
     for (var y:uint=0; y<boardHeight; y++) 
     { 
      setTimeout(addItem, (x*boardHeight+y)*DELAY, x, y); 
     } 
    } 
} 

function addItem(x:uint, y:uint) : void 
{ 
    var thisItem:FirstBox = new FirstBox(); 
    thisItem.x = x * IcardHorizontalSpacing + IboardOffsetX; 
    thisItem.y = y * IcardVerticalSpacing + IboardOffsetY; 

    var r:int = Math.floor(Math.random() * listItem.length); 

    thisItem.cardface = listItem[r]; 
    listItem.splice(r,1); 
    thisItem.gotoAndStop(thisItem.cardface+2); 

    var itemFound = this.foundItem(thisItem.cardface); 

    if(itemFound == 50 || itemFound == 100 || itemFound == 250 || itemFound == 500 || itemFound == 1000) 
    { 
     var itemC = Number(coinsx) + Number(itemFound); 
     coinsx = itemC; 
     update_coins(Number(coinsx)); 
     info_coinstext(String(coinsx)); 
     trace('Gold Coins Found > '+itemFound); 
    } 
    else if(itemFound!='Kosong') 
    { 
     updateItem(itemFound); 
     trace('Item Found > '+itemFound); 
    } 

    addChild(thisItem); 
    ItemLeft++; 
} 

通過每次設置超時時間增加延遲,該功能將稍後調用。

2

好吧,有幾個選項。

你可以使用的setTimeout延遲一個函數調用:

setTimeout(functionToExecuteAfterDelay, 2000) 

OR

你可以使用Timer類在AS3上設定的時間段執行的功能。

var myTimer:Timer = new Timer(5000,9); //Will tick 9 times, each after 5000 milliseconds 
myTimer.addEventListener(TimerEvent.TIMER,someFunction); 
myTimer.start(); 
function someFunction(event:TimerEvent) { 
    //do your openingstuff here 
} 

就我個人而言,我會採取選項2.此外,您完成後刪除TimerEvent偵聽器。

+0

謝謝@ThomasM,它工作正常,但是當我把它放在循環中似乎不起作用,所有的盒子一次都打開,你有沒有想法把鋤頭放在'for`裏? – 2011-12-15 08:54:04

0

這是setInterval

var interval:int=0; 
var nextBoxToOpen:int=0; 
var maxBoxes:int = 9; 

function openBox(e:TimerEvent):void { 
    //code to open box; 
    nextBoxToOpen++; 
    if(nextBoxToOpen >= maxBoxes) { 
     nextBoxToOpen=0; 
     clearInterval(interval); 
    } 
} 

function startOpen():void { 
    interval = setInterval(openBox, 5000); 
} 

的經典案例OR,在AS3中你可以使用一個定時器

var tmr:Timer = new Timer(5000, 9); //Interval = 5000 ms, Number of ticks = 9 
tmr.addEventListener(TimerEvent.TIMER, openBox); 
tmr.start(); 
function openBox():void { 
    var boxToOpen = tmr.currentCount; 
    //code to open box; 
} 
+0

感謝兄弟,但箱子有自己的位置,根據舞臺寬度。我怎樣才能將它們定位爲`for`,一些盒子如何爲每個其他位置設置不同的位置 – 2011-12-15 08:59:27

+0

無論您使用哪種代碼重新定位,請刪除箱號上的哪些循環,並使用「nextBoxToOpen」或「 boxToOpen`變量而不是該索引。 – 2011-12-15 09:09:28