Вызов метода в Objective-C, который ссылается на другой файл класса - PullRequest
0 голосов
/ 27 декабря 2011

Я пытаюсь вызвать метод, который проверяет, является ли игрок больше или меньше врага.(это игра-рыба)

В EnemyFish.m я использую этот метод

-(void) compareSize:(Player*)player{
if (self.fSize > player.pSize){
    isBigger = true;
}
else{
    isBigger = false;
}

}

Затем я хочу вызвать этот метод во время обновления, чтобы яя делаю это:

-(void) update {
[self compareSize];

//Check to see if bigger than player fish
if( isBigger == true){
//code for if bigger
}else{ //etc.  }

Я получаю исключение: sharedlibrary apply-load-rules all

не уверен, какой будет лучший способ настроить этот метод, и лучший способназывать это, так как [self compareSize] определенно не работает.

Любая помощь будет принята с благодарностью, спасибо!

------ ОБНОВЛЕНИЕ ----------

А если я воспользуюсь этим?

update:(Player *)player{

Проблема, с которой я здесь столкнулся, заключается в том, как правильно вызвать это, я не был уверен, как изменить это, чтобы правильно вызывать новый метод обновления:

[self schedule:@selector(update) interval:1.0f/60.0f];

Ответы [ 2 ]

3 голосов
/ 27 декабря 2011

Неясно, что вы спрашиваете, но давайте посмотрим на ваш код и посмотрим, поможет ли это.

Ваш первый метод можно записать более кратко, как:

- (void) compareSize:(Player *)player
{
   isBigger = self.fSize > player.pSize;
}

Существуетбессмысленно использовать if / else для присвоения значения true / false (или YES / NO).

Глядя на этот метод, возникает очевидный вопрос:было бы лучше возвращать значение, а не присваивать переменной экземпляра.Это будет выглядеть так:

- (BOOL) compareSize:(Player *)player
{
   return self.fSize > player.pSize;
}

, и теперь вы можете использовать вызов compareSize в if.

Предполагая, что вторая версия compareSize, ваш второй метод:

-(void) update
{
   //Check to see if bigger than player fish
   if ([self compareSize]) // OOPS, no Player
   {
      //code for if bigger
   }
   else
   {
     //etc.
   }
}

Но это не работает, так как вам нужен экземпляр Player для перехода к compareSize:, например [self compareSize:somePlayerInstance].Итак, теперь вы должны спросить себя, где вы ожидаете найти Player;это может быть аргумент update (например, - (void) update:(Player *)somePlayerInstance), или у вас может быть метод для вызова, который возвращает целую коллекцию игроков, и вам нужно проверить каждого из них и т. д. и т. д. Я не могу датьответ, поскольку я понятия не имею о вашей игре и алгоритме!

Следующий комментарий

Вы должны хранить ссылку на ваш объект Player где-то в вашем приложении.Если есть только один игрок, Player сконструирован как синглтон с sharedInstance или с тем же именем, метод класса, который возвращает один экземпляр?Если это так, то ваш update будет содержать:

if ([self compareSize:[Player sharedInstance]])

и т. Д.

Другой шаблон проектирования - это чтобы ваш делегат приложения сохранял ссылку и предоставлял метод (или свойство) для доступаЭто.Следуя этой схеме (и составляя имена классов MyDelegateApp и свойства player), ваш код может выглядеть следующим образом:

if ([self compareSize:((MyAppDelegate *)[NSApp delegate]).player])

Еще одна модель заключается в создании одиночного проигрывателя в основном XIB / NIB приложения.файл - и т. д. и т. д., существует множество моделей приложений!

Вам «просто» (это, конечно, не просто) нужно спроектировать модель приложения так, чтобы ваш одиночный плеер был так или иначе доступен,где вам это нужно ...

2 голосов
/ 27 декабря 2011

Ваш метод CompareSize: (обратите внимание на двоеточие) требует параметра проигрывателя.

Поэтому вам нужно назвать его так:

[someEnemyFish compareSize:somePlayer]

Если self является ли экземпляр EnemyFish, который вы хотите, вы можете сделать [self compareSize:somePlayer], но ваш заголовок указывает на то, что self не является EnemyFish?

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