我有一个GameWorld类,它继承了CCLayer并返回了一个CCScene。我的GameWorld有一个综合属性,“得分”。分数每2秒递增一次 - 所以你玩游戏的时间越长,它就越高。
大!
现在我调用我的GameObject,它继承了CCNode并返回一个sprite,作为子元素添加到图层中。每个GameObject都有一个“成本”属性。
但无论何时添加新的精灵,您的分数都会根据成本下降。
那么如何在GameWorld中设置我的(int)得分,来自GameObject,其中包含将降低得分的(int)成本?
换句话说,从类中设置/获取GameWorld分数很容易,但我的GameObject类无法看到GameWorld。有没有办法将类的属性的setter方法暴露给另一个类?
谢谢!
答案 0 :(得分:0)
如果GameWorld
包含GameObject
s的实例,则只需在GameWorld
内执行此操作。
self.score -= anObject.cost;
否则,必须有一些类维护对GameWorld
的引用。在那里做。
aWorld.score -= anObject.cost
答案 1 :(得分:0)
设置其他类对象的属性将其注册为其他对象的属性观察者,或者在这两个对象之间创建弱引用。
例如,考虑在GameObject类中添加@property (nonatomic, assign) GameWorld* gameWorld;
。然后当你创建两个设置gameObject的属性gameWorld。
GameWorld *gameWorld = //init;
GameObject *gameObject = //init;
gameObject.gameWorld = gameWorld;
然后,您可以从GameObject类访问gameWorld对象及其所有属性。
答案 2 :(得分: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因此会泄漏整个场景。