2012-07-20 191 views
-1

現在我有這樣的:For循環「我」邏輯

for (int i = 0; i < level.contentSize.width/level.tileSize.width; i ++){ 
    tile = [levelLayer tileAt:ccp(i,17)]; 
    if (CGRectIntersectsRect(ball.boundingBox, tile.boundingBox)) { 
     NSLog(@"hit"); 
    } 
} 

我需要的是兩個變量(現在我有單i),這樣我可以檢查所有瓷磚中的所有x和y值。所以tile = [levelLayer tileAt:ccp(i,j)]; < ---看起來就像那樣。

+1

你的問題還不太清楚......你想用變量做什麼?請儘量用更充分和適當的英語來解釋你的問題,因爲它站得住腳,幾乎完全不可理解。 – 2012-07-20 19:39:18

回答

3

您可以嘗試使用inner for-loop與另一個循環變量j遍歷所有可能的值。例如:

for (int i = 0; i < level.contentSize.width/level.tileSize.width; i ++) 
    for (int j = 0; j < level.contentSize.height/level.tileSize.height; j ++){ 

     tile = [levelLayer tileAt:ccp(i,j)]; 
     if (CGRectIntersectsRect(ball.boundingBox, tile.boundingBox)) { 
      NSLog(@"hit"); 
     } 
} 
+0

這工作得很好!非常感謝。它在FPS下降,但我猜如果我拿出不會發生的NSLog。 – stenger96 2012-07-20 19:51:37

+0

如果性能下降並且您的級別大小比tile大小大(因此循環迭代次數變得非常大),您可能應該考慮優化循環(例如,如果您只需要檢測一個交叉點就可以從中斷開,或者縮小範圍i和j的可能值)。當你使用cocos2d時,可能你可以使用像box2d這樣的物理引擎提供的碰撞檢測功能嗎? – Vladimir 2012-07-20 20:19:20

+0

不,只是它會在每次兩個交叉點相交時記錄下來,幾乎每秒鐘只有一個街區5-9次......取出後現在回到60。 – stenger96 2012-07-20 22:52:30

1

單獨使用for循環。

A for循環遍歷某個範圍的值。如果你想遍歷兩個單獨的範圍,使用兩個for循環是一個好主意,因爲它清楚地傳達了你正在做的事情。如果循環的主體不止一行或兩行,你可能想把它分解成它自己的函數或方法,或者甚至使用你在循環之前定義的塊。這樣,你可以確定兩個循環執行完全相同的任務,它只是值不同的範圍。

還有其他可能的解決方案來處理幾個範圍的指數。例如,您可以將兩個範圍添加到NSMutableIndexSet,然後使用-enumerateIndexesUsingBlock:遍歷所有索引。

但嚴重的是,只需使用兩個for循環。

+0

但是,如何訪問不同循環的變量? – stenger96 2012-07-20 19:43:47

+0

@ stenger96對不起,我理解你的意思是你想循環遍歷兩個範圍,而不是在一起。 Vladimir建議嵌套'for'循環是正確的方法來搜索兩個範圍。 – Caleb 2012-07-20 19:59:33