Доступ к методу установки другого класса - PullRequest
1 голос
/ 13 ноября 2011

У меня есть класс GameWorld, который наследует CCLayer и возвращает CCScene.Мой GameWorld имеет синтезированное свойство «оценка».Счет увеличивается каждые 2 секунды, поэтому чем дольше вы играете в игру, тем выше она увеличивается.

Отлично!

Теперь я вызываю свой GameObject, который наследует CCNode и возвращает спрайт,быть добавлен в качестве дочернего слоя.Каждый GameObject имеет свойство «cost».

Но всякий раз, когда вы добавляете новый спрайт, ваш счет уменьшается в соответствии со стоимостью.

Так как я могу установить свой (int) счет вGameWorld, ОТ GameObject, который содержит (int) стоимость, которая уменьшит счет?

Другими словами, легко установить / получить счет GameWorld из класса, но мой класс GameObject не можетувидеть GameWorld.Есть ли способ предоставить метод установки для свойства класса другому классу?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 13 ноября 2011

Чтобы установить свойство другого объекта класса, зарегистрируйте его как наблюдателя свойства этого другого объекта или создайте слабую ссылку между этими двумя объектами.

Например, рассмотрите возможность добавления @property (nonatomic, assign) GameWorld* gameWorld; в ваш класс GameObject. Затем, когда вы создаете два набора свойств gameObject, gameWorld.

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

Затем вы можете получить доступ к объекту gameWorld и всем его свойствам из вашего класса GameObject.

0 голосов
/ 13 ноября 2011

Превратите ваш класс 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, то у вас есть цикл сохранения и, таким образом, происходит утечка всей сцены.

0 голосов
/ 13 ноября 2011

Если GameWorld содержит экземпляры GameObject с, то просто сделайте это в GameWorld.

self.score -= anObject.cost;

В противном случае должен существовать некоторый класс, который поддерживает ссылку на GameWorld,Сделай это там.

aWorld.score -= anObject.cost
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...