2011-12-27 33 views
0

我想調用一個方法來檢查玩家是否比敵人大或小。 (這是一個魚遊戲)在Objective-C中調用引用另一個類文件的方法

在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應用負載規則所有

ñ不要確定設置這個方法的最佳方法是什麼,並且最好的方法是調用它,因爲[self compareSize]肯定不起作用。

任何幫助將不勝感激,謝謝!

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

那麼如果我用這個

update:(Player *)player{ 

我運行到這裏的問題,是如何調用正確這個問題,我不知道如何改變這種能正確調用新的更新方法:

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

只是一個建議:何不'你有'compareSize:'返回一個布爾和溝是'isBigger'變量?這樣就會更清潔,更短,更直接,更易於維護。 – Chuck 2011-12-27 01:13:14

回答

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; 
} 

,現在你可以在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文件中的單人遊戲 - 等等,等等。,有很多應用程序模型!

你「簡單的」(它不是簡單的課程)的需要來設計應用程序模式,使您的單人是可訪問的,這種或那種方式,在你需要它...

+0

感謝您的好評,如果我正確理解您的意思,您說我需要在函數 中使用播放器參數。但是我遇到了問題,因爲我無法讓調度程序處理參數。也只有一個球員。謝謝! – Blakedallen 2011-12-27 02:31:43

2

你compareSize:方法(注意冒號)需要一個球員的參數。

所以你需要調用它像這樣:

[someEnemyFish compareSize:somePlayer]

如果self是你想要EnemyFish的情況下,你可以做[self compareSize:somePlayer],但你的標題似乎預示self不是EnemyFish?