2013-02-15 56 views
0

如果這是一個非常明顯的問題,請道歉。如何在計時器類中添加hitTestObject語句?

我想添加一個hitTestObject如果循環到迷你遊戲。 障礙物是一個數組中的3個項目,所有3個都是連續播放1秒計時器類延遲的影片剪輯。 但由於循環(我假設)hitTestObject如果語句沒有返回跟蹤'命中'也沒有任何錯誤 - 我應該如何解決這個問題?

預先感謝您!

function randomSort(a:*, b:*):Number 
{ 
    if (Math.random() < 0.5) return -1; 
    else return 1; 
} 
var obstacleArray:Array = [obstacleCar,obstacleCar2,obstacleCar3]; 
obstacleArray.sort(randomSort); 

//(no need for the shuffledLetters[] Array) 
trace(obstacleArray); 
trace(obstacleArray.length); 


//OBSTACLE START DELAY 
var timerPlay:Timer = new Timer(1000,1); 
timerPlay.addEventListener(TimerEvent.TIMER, ontimerPlay); 
timerPlay.start(); 
var i:int = 0; 
var timerDelay:Timer = new Timer(1000, 3); 
function ontimerPlay(evt:TimerEvent):void{ 
    if (carTarget.hitTestObject(obstacleArray[i]) == true){ 
    trace("HIT!"); 
    } 
    //FOR EACH OBSTACLE 

    timerDelay.addEventListener(TimerEvent.TIMER, ontimerDelay); 
    timerDelay.start(); 

} 
function ontimerDelay(evt:TimerEvent):void{ 
    obstacleArray[i].play(); 
    trace(i); 
    i++; 

} 

回答

0

現在您在任何障礙電影剪輯播放之前執行一次命中測試。你可能想重複執行命中測試,每一幀。

一下添加到onTimerDelay()

if(i === 0) { 
    stage.addEventListener(Event.ENTER_FRAME, enterFrameListener) 
} 

然後創建ontimerDelay(), 外的偵聽器函數,並把你的命中測試有:

function enterFrameListener(evt:Event):void { 
    var index:int = Math.max(0, i - 1); 
    if (carTarget.hitTestObject(obstacleArray[index]) == true){ 
     trace("HIT!"); 
    } 
} 

這將執行在carTarget和當前正在播放的障礙物之間每隔一幀進行一次命中測試。

了一份關於你的詞彙量:

  1. 有沒有在你的代碼中的任何循環。 「if」語句不是 循環,它被稱爲「條件語句」。
  2. ontimerDelay()將被調用3次,但它不是一個真正的循環,即使它被重複調用也是如此,即 。
  3. 在你的代碼中,你沒有爲定時器類添加命中測試。 一個類是一個藍圖,用於製作類實例 (timerPlay和TimerDelay)。您正在向定時器類的「實例」註冊的「事件偵聽器」 添加命中測試。

編輯

關於您在您的評論中提到的錯誤,我前面的例子是錯誤的。我指的是正在播放的索引爲i的影片剪輯,但它應該是i - 1。每次播放新的障礙影片剪輯時,都會增加i,所以我不再是當前正在播放的影片剪輯的索引。唯一不需要減1的時候是我是0的時候。我更新了前面的例子。

我還將事件偵聽器註冊移到了onTimerDelay中,並將其包裝在if語句中,以便在第一個影片剪輯開始播放之前不會執行命中測試。

編輯

如果只想跟蹤「打」兩個物體之間的接觸開始時,你將需要保持過去的命中測試的結果的軌道。在enterFrameListener中,您可以檢查最後一幀是否存在命中。如果在最後一幀沒有擊中並且在當前幀中有擊中,則可以跟蹤「擊中」。如果最後一幀出現命中並且當前幀出現命中,則可以跳過跟蹤語句。

var lastHitTestResult:Boolean = false; 

function enterFrameListener(evt:Event):void { 
    var index:int = Math.max(0, i - 1); 
    var currentHitTestResult:Boolean = carTarget.hitTestObject(obstacleArray[index]) 
    if(lastHitTestResult === false && currentHitTestResult === true) { 
     trace("HIT!") 
    } 
    lastHitTestResult = currentHitTestResult 
} 

只需確保lastHitTestResult在onTimerDelay

+0

謝謝你的幫助,這清除了很多的理解。 我遵循你的建議,但運行時發生問題。 首先是遷移警告1090 第二次運行時。 Mc完成之後。 TypeError:錯誤#2007:參數hitTestObject必須爲非null。 \t在flash.display使用::的DisplayObject/_hitTest() \t在flash.display使用::的DisplayObject/hitTestObject() \t在tsunamigetawayV_fla :: MainTimeline /的onEnterFrame()[tsunamigetawayV_fla.MainTimeline :: frame83:83] 線83:參考 if(carTarget.hitTestObject(obstacleArray [i])== true){ – user2075625 2013-02-16 11:59:08

+0

@ user2075625我添加了另一個希望清除錯誤的代碼示例。讓我知道它是否有效。 – bwroga 2013-02-16 16:32:46

+0

歡迎回來!恐怕它仍然無法正常工作。 - 它仍然顯示遷移警告,並且2007年的錯誤仍然出現。然而,我發現如果(i <2)i ++;通過添加if語句 , \t}。點擊確實出現,但似乎是隨機的,(即使只發生一次碰撞 - 在所有3個項目出現後連續出現一次)。再次感謝。 – user2075625 2013-02-16 18:29:23

0

您已經創建僅持續一秒鐘第一個定時器重置爲false。這意味着你只有在碰到障礙物之前纔有效地檢查碰撞事件,並且在你的障礙物開始玩之前。 所以,當你的障礙在玩時,第一個定時器處理程序不會被調用。你可以跟蹤來驗證這一點。