2011-11-12 148 views
1

我有一個GameWorld類繼承CCLayer並返回一個CCScene。我的遊戲世界有一個綜合的屬性,「分數」。得分每2秒遞增一次 - 所以玩遊戲的時間越長,遊戲得分越高。訪問另一個類的setter方法

太棒了!

現在我調用我的GameObject,繼承CCNode並返回一個精靈,作爲子圖層添加到圖層。每個GameObject都有一個「成本」屬性。

但是,無論何時添加新的精靈,您的分數都會根據成本降低。

那麼我怎樣才能在GameWorld中設置我的(int)分數,從包含將減少分數的(int)成本的GameObject?

換句話說,很容易在課堂內設置/獲取GameWorld分數,但我的GameObject類無法看到GameWorld。有沒有辦法將類的屬性的setter方法暴露給另一個類?

謝謝!

回答

0

如果GameWorld持有GameObject s的實例,則只需在GameWorld之內執行。

self.score -= anObject.cost; 

否則,必須保留對GameWorld的引用。在那裏做。

aWorld.score -= anObject.cost 
0

要設置其它類對象的屬性寄存器它作爲其他對象的屬性觀察者或創建這些兩個對象之間的弱引用。

例如,考慮將一個@property (nonatomic, assign) GameWorld* gameWorld;添加到您的GameObject類。然後當你創建兩套gameObject的屬性gameWorld時。

GameWorld *gameWorld = //init; 
GameObject *gameObject = //init; 
gameObject.gameWorld = gameWorld; 

然後,您可以從GameObject類訪問gameWorld對象及其所有屬性。

0

將你的GameWorld類變成一個「臨時」單身人士(缺乏這種模式的更好的名字)。這適用於Cocos2D中的場景以及其他節點(層),這些節點保證在節點層次上比其兄弟姐妹/子節點更長。

static GameWorld* instance; 

-(id) init 
{ 
    if ((self = [super init])) 
    { 
     instance = self; 
    } 
    return self; 
} 

-(void) dealloc 
{ 
    instance = nil; 
    [super dealloc]; 
} 

+(GameWorld*) sharedGameWorld 
{ 
    return instance; 
} 

然後,您可以從任何對象訪問您的遊戲世界實例在那個世界簡直就像這樣:

[GameWorld sharedGameWorld].score += 10; 

我個人認爲這個節拍繞過弱引用,因爲保留的趨勢是存在的。當你在GameWorld所包含的某個對象中保留了GameWorld時,你有一個retain cycle,這樣就會泄漏整個場景。

+0

我正在做這樣的事情。雖然我不想創建太多的單身人士,但像GameWorld這樣的對象似乎是一個很好的候選人。你爲什麼稱這是一個'臨時'單身人士?它看起來很正常。 –

+0

臨時因爲單身人士只在GameWorld存在時才存在。例如,它可能在您的菜單屏幕中不可用。 「正常」單身人士可以在您的應用程序的整個生命週期中使用,但嚴格來說,這不是模式的意義。 – LearnCocos2D

相關問題