调用Objective-C中引用另一个类文件的方法

时间:2011-12-27 00:58:37

标签: iphone objective-c cocos2d-iphone

我试图调用一种方法来检查玩家是否比敌人更大或更小。 (这是鱼类游戏)

在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 ----------

如果我使用这个

怎么办?
update:(Player *)player{

我遇到的问题是如何正确调用,我不知道如何更改它以正确调用新的更新方法:

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

2 个答案:

答案 0 :(得分:3)

目前还不清楚你在问什么,但让我们看看你的代码,看看它是否有帮助。

您的第一种方法可以更简洁地写成:

- (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文件中创建单个播放器等等,有很多应用程序模型!

你“简单地”(当然不是简单的)需要设计你的应用程序模型,这样你的单个玩家就可以通过这种或那种方式进行访问......

答案 1 :(得分:2)

您的compareSize:方法(请注意冒号)需要播放器参数。

所以你需要这样称呼它:

[someEnemyFish compareSize:somePlayer]

如果self是您想要的EnemyFish的实例,您可以执行[self compareSize:somePlayer],但您的标题似乎表明self不是EnemyFish?