2013-05-17 90 views
2
 var moveTimer:Timer = new Timer(1); 
     moveTimer.addEventListener(TimerEvent.TIMER, timerListener); 
     function timerListener (e:TimerEvent):void 
     { 
      //code 
     } 
     moveTimer.start(); 
     moveTimer.addEventListener(TimerEvent.TIMER_COMPLETE, timerDone) 
     function timerDone(e:TimerEvent):void 
     { 
      upKey = false; 
     } 

嘿夥計們,所以這是我的代碼。我在我的遊戲中有一些非常簡單的AI,並且我試圖利用一個計時器讓敵人向前移動約2-3秒,然後停止。爲此,我使用變量upKey作爲設置爲true的布爾值,但是當計時器結束時它被設置爲false,並且在設置爲false時,會有一個if語句將敵人的速度降爲0定時器AI不工作

這是我第一次使用計時器和敵人不真的停止......他們只是繼續前進,直到他們離開屏幕。我是否正確執行此操作,或者在代碼中的其他位置出現問題?另外,還有更好的方法來使用計時器嗎?

謝謝,詹姆斯。

回答

1

從您引用的代碼中,計時器構造函數未指定repeatCount,表示它應該無限重複。對於要調用的timerDone()處理程序,您必須指定重複計數。

另外,請注意,不建議低於20毫秒的延遲。

Timer構造參數:Timer(delay:Number, repeatCount:int = 0)

delay:Number - 計時器事件,以毫秒爲單位之間的延遲。建議不要使用延遲時間低於20毫秒的 。定時器頻率 限制爲每秒60幀,這意味着延遲時間低於16.60毫秒會導致運行時問題。

repeatCount:int(默認值= 0) - 指定重複次數。 如果爲零,定時器將無限期重複,最長可達24.86天 (int.MAX_VALUE + 1)。如果非零,計時器將運行指定的編號 次,然後停止。

定時器不建議用於動畫內容。相反,使用Event.ENTER_FRAME來處理基於幀的動畫。

一種方法是使用定時器觸發狀態變化到您的遊戲模式:

/** timer */ 
var timer:Timer; 

/** whether enemies are advancing */ 
var advance:Boolean = false; 

// start timer at 5-seconds intervals 
timer = new Timer(5000); 
timer.addEventListener(TimerEvent.TIMER, timerHandler); 
timer.start(); 

// animation controlled by Event.ENTER_FRAME 
addEventListener(Event.ENTER_FRAME, frameHandler); 

在你的計時器處理,你可以調整取決於你的遊戲狀態的計時器延遲。

/** timer handler */ 
function timerHandler(event:TimerEvent):void 
{ 
    // stop the current timer 
    timer.stop(); 

    // depending on the current enemy state 
    switch (advance) 
    { 
     // if true, stop advancing and wait 5-seconds 
     case true: 
      trace("Stop advancing, wait 5-seconds"); 
      timer.delay = 5000; 
      break; 
     // if false, advance for 2-seconds 
     case false: 
      trace("Advance for next 2-seconds"); 
      timer.delay = 2000; 
      break; 
    } 

    // invert advance state. 
    advance = !advance; 

    // restart timer 
    timer.start(); 
} 

同樣基於遊戲狀態的輸入框,你的敵人的控制動畫:

/** frame handler, advancing enemy if 'advance' is true */ 
function frameHandler(event:Event):void 
{ 
    if (advance) { /** move enemy forward */ } 
} 

你的敵人的這種交替的狀態,輸出:

提前爲下一個2秒
停止前進,等待5秒
前進2秒
停止前進,等待5秒
前進接下來的2秒

+0

嗨,男士,謝謝。我現在想要做的就是運行它,讓它們前進幾秒鐘,然後在this.rotation + = 5時停止,直到它等於正確的角度(面對玩家)。我認爲我的代碼改變方向給玩家很好,但敵人甚至不旋轉,我認爲這是因爲我對定時器或其他東西還是很不滿。 –

+0

雖然我很欣賞你的幫助。 –

+0

這是我目前的問題代碼: \t \t \t功能redirectPlayer():無效 \t \t \t { \t \t \t \t VAR enGlobalPos:點= localToGlobal(新點(this.x,this.y)) \t \t \t \t var dX:Number = enGlobalPos.x - playerLoc.x; \t \t \t \t var dY:Number = enGlobalPos.y - playerLoc.y; \t \t \t \t //獲取敵人旋轉 \t \t \t \t VAR radRotation:數= Math.atan2(DY,DX); \t \t \t \t degRotation = radRotation *(180/Math.PI); \t \t \t \t //設置旋轉到玩家 \t \t \t \t this.rotation + = enTurnSpeed; \t \t \t \t如果(this.rotation == degRotation) \t \t \t \t { \t \t \t \t \t this.rotation = 0; \t \t \t \t \t upKey = true; \t \t \t \t \t moveTimer.start(); \t \t \t \t}那不看的話格式化 –