访问另一个类的setter方法

时间:2011-11-12 20:48:37

标签: objective-c cocos2d-iphone

我有一个GameWorld类,它继承了CCLayer并返回了一个CCScene。我的GameWorld有一个综合属性,“得分”。分数每2秒递增一次 - 所以你玩游戏的时间越长,它就越高。

大!

现在我调用我的GameObject,它继承了CCNode并返回一个sprite,作为子元素添加到图层中。每个GameObject都有一个“成本”属性。

但无论何时添加新的精灵,您的分数都会根据成本下降。

那么如何在GameWorld中设置我的(int)得分,来自GameObject,其中包含将降低得分的(int)成本?

换句话说,从类中设置/获取GameWorld分数很容易,但我的GameObject类无法看到GameWorld。有没有办法将类的属性的setter方法暴露给另一个类?

谢谢!

3 个答案:

答案 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因此会泄漏整个场景。