繁体   English   中英

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

[英]Calling a method in Objective-C that references another class file

我正在尝试调用一种方法来检查玩家是否大于或小于敌人。 (这是一个鱼游戏)

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

不确定设置此方法的最佳方法是什么,以及调用它的最佳方法,因为[self compareSize]肯定无法正常工作。

任何帮助将不胜感激,谢谢!

------ UPDATE ----------

如果我用这个怎么办

update:(Player *)player{

我在这里遇到的问题是如何正确调用此方法,我不确定如何更改此方法才能正确调用新的update方法:

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

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

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

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

使用if / else分配true / false (或YES / NO )值NO意义。

查看此方法提出了一个显而易见的问题,即返回值而不是分配给实例变量是否会更好。 看起来像:

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

现在可以在if使用调用比较compareSize

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

您“简单”(当然这并不容易)需要设计您的应用程序模型,以便您可以在需要的地方以一种或另一种方式访问​​单个播放器...

您的compareSize:方法(注意冒号)需要一个player参数。

因此,您需要这样称呼它:

[someEnemyFish compareSize:somePlayer]

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM