2013-05-28 127 views
0

我有這個foreach循環來檢查碰撞,我希望平臺(movieclip)在碰撞的情況下被移除。到目前爲止,我想出了這一點:如何在當前索引中拼接當前索引?

if (mcContent.mcPlayer.y + mcContent.mcPlayer.height > platformCloud.y) 
           { 
            mcContent.mcPlayer.y = platformCloud.y - mcContent.mcPlayer.height - 1; 
            jump(); 
            mcContent.removeChild(platformCloud); 
            //platformsCloud.splice(platformCloud); 
           } 

這是什麼做的是,刪除影片剪輯(OK到目前爲止好),但沒有接頭,當遍歷數組再次運行它仍然存在。因此,在被註釋掉的拼接處出現一個小問題時,它將顯然從陣列中移除所有的影片剪輯。

我該如何拼接當前正在檢查的索引?

+0

你爲什麼要保留已被刪除的對象的引用?將它們與「主動」對象放在同一個地方是否有意義? –

+0

我不這就是爲什麼我用removeChild刪除它們,然後將它們從數組中取出,以便它們不會再被檢查。至少這就是我想用這段代碼實現的。 –

回答

1

.splice()接受一個開始索引和項目的數量來去除,不是你想從數組中刪除的對象。

參數

startIndex:int - 指定進行插入或刪除開頭的陣列中的元素的索引的整數。可以使用負整數指定相對於數組末尾的位置(例如,-1是數組的最後一個元素)。

deleteCount:uint - 一個整數,指定要刪除的元素的數量。該數字包含startIndex參數中指定的元素。如果您沒有爲deleteCount參數指定值,則該方法會將startIndex元素中的所有值刪除到數組中的最後一個元素。如果該值爲0,則不會刪除任何元素。

你想這樣做:

var index:int = platformsCloud.indexOf(platformCloud); 
platformsCloud.splice(index, 1); 
+0

現在在工作,但我們會在我回家時仔細研究它,這似乎是正確的使用,我正在學習as3,這也是爲什麼我錯誤地使用它,也許。 –

+0

這樣做完美無瑕,非常感謝您的先生。 –

0

爲什麼不只是創建一個新的項目的數組保持?使用Array.push添加新項目。這可能實際上比修改現有的數組更有效率。它也不需要跟蹤指數(需要使用Array.splice)。

示例代碼:

var keptPlatforms = []; 
// do stuff 
if (mcContent.mcPlayer.y + mcContent.mcPlayer.height > platformCloud.y) 
{ 
    mcContent.mcPlayer.y = platformCloud.y - mcContent.mcPlayer.height - 1; 
    jump(); 
    mcContent.removeChild(platformCloud); 
} else { 
    keptPlatforms.push(platformCloud); 
} 
// later, after this cycle, use the new Array 
platformClouds = keptPlatforms; 

現在,原因platformsCloud.splice(platformCloud)移除所有項是因爲第一個參數被強制爲一個整數,因此等效於platformsCloud.splice(0)它說「刪除第0索引項數組的末尾「。而且,這確實可以清除陣列。

要使用Array.splice,你必須做一些事情,如:

// inside a loop this approach may lead to O(n^2) performance 
var i = platformClouds.indexOf(platformCloud); 
if (i >= 0) { 
    platformClouds.splice(i, 1); // remove 1 item at the i'th index 
} 
+0

但我不得不讓它檢查maintainPlatforms而不是platformClouds吧? –

+0

@BrunoCharters修復了使用Array.splice時的拼寫錯誤 - 使用Array.splice去除*項目並創建一個只有* keep *元素的新數組是兩種不同的方法。我建議不要在這裏使用Array.splice。但是,是的,如果你需要多次重複檢查同一個平臺一個週期(應該看起來效率很低),那麼你只需要查看當前的項目。 – user2246674

+0

您也可以使用Array Class的過濾器功能將列表過濾爲具有對舞臺和/或父級的有效引用的對象。 –