2011-12-29 77 views
0

我將遊戲引擎的各個部分移植到另一個遊戲代碼中,我有兩個問題。GameScene sharedGameScene與GameScene節點

代碼:

-(void) checkForBulletCollisions 
     { 
       Enemy* enemy; 
       CCARRAY_FOREACH([batch children], enemy) 
       { 
       if (enemy.visible) 
       { 
         BulletCache* bulletCache = [[GameScene sharedGameScene] bulletCache]; 
         //etc etc 

的GameScene項目我移植這個代碼不是單喜歡GameScene是在上面的代碼。

這裏是GameScene的接口代碼:

@interface GameScene : CCScene 
    +(void) newGame:(NSString*)levelFile; 
    -(void) reloadGame:(NSString*)levelFile; 
@end 

當移植的代碼上線我換成與代碼的頂線:

BulletCache* bulletCache = [[GameScene node] bulletCache]; 

我在正確的軌道上?

+0

[GameScene節點]返回一個新的GameScene實例,這樣你就不會得到預期的結果。具有checkForBulletCollisions方法的類應該具有對GameScene實例的引用,以便您可以調用bulletCache = [theGameSceneInstance bulletCache];此外,GameScene不是一個單身人士的好選擇。 – hiepnd 2011-12-30 01:56:51

回答

0

正如hiepnd所述 - 節點方法創建一個新的自動釋放實例。然而,你正在移植的代碼是調用一個單例。我假定單例是'當前場景' - 因此您的移植任務是在節點層次結構中找到頂層節點 - 確認它確實屬於Class GameScene,然後檢索對bulletCache的引用從中。

的當前場景可以從導演如下檢索:

CCScene *currentScene = [[CCDirector sharedDirector] runningScene]; 
GameScene *gameScene = nil; 
if ([currentScene isKindOfClass:[GameScene class]]) gameScene = currentScene; 
BulletCache *bulletCache = [gameScene bulletCache]; 
+0

感謝您的提示!順便說一下,在我的項目中,BulletCache的頂層節點是LevelObject類,它本身是CCNode的一個子類,而另一個項目的代碼在GameScene中有子彈的訪問器,這就是它調用GameScene單例的原因。 @hiepend我同意你的看法,這就是爲什麼我要製作我的Bullet/BulletCache類的預先存在的LevelObject類的子類,它是CCNode的子類 – GPP 2011-12-30 05:33:24

相關問題