2011-12-27 15 views
0

私は、プレーヤーが敵よりも大きいか小さいかをチェックするメソッドを呼び出そうとしています。私はこれをやっているので、私はこの方法Objective-Cで別のクラスファイルを参照するメソッドを呼び出す

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

}

は、その後、私は更新の際に、このメソッドを呼び出したいを使用しています

EnemyFish.mで

(これは魚のゲームです):

-(void) update { 
[self compareSize]; 

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

は、私は例外を取得しています:適用負荷-ルールをsharedlibraryすべて

N [self compareSize]は間違いなく動作しているので、このメソッドを設定する最良の方法は何か、そしてそれを呼び出す最良の方法は何かを確認してください。

ご協力いただければ幸いです。ありがとうございます!私はこの

を使用する場合
update:(Player *)player{ 

について、私はここに実行していた問題は、呼び出す方法は何

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

これは正しく、私は正しく新しいupdateメソッドを呼び出すためにこれを変更する方法がわからなかった。

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

だけの提案を、あなたのアプリケーションモデルを設計する必要があります。なぜドン'compareSize:'はBOOLを返し、 'isBigger'変数は取り除いていますか?そうすれば、よりクリーンで、より短く、より簡単でメンテナンスが可能になります。 – Chuck

答えて

3

あなたが尋ねていることは不明ですが、コードを見て、それが役立つかどうかを見てみましょう。

あなたの第1の方法は、より簡潔に書くことができる。true/false(又はYES/NO)値を割り当てることif/elseを使用してもポイントがない

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

このメソッドを見ると、インスタンス変数に代入するのではなく、値を返すほうがよいかどうかが分かります。これは、次のようになります。

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

、今、あなたはifcompareSizeへの呼び出しを使用することができます。

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

しかし、あなたは、例えば、compareSize:に渡すPlayerのインスタンスを必要として、これは動作しません:あなたの第二の方法があるcompareSizeの第二のバージョンを想定し

[self compareSize:somePlayerInstance]。だからあなたはどこにあなたがPlayerが見つかることを期待して自分自身に尋ねなければなりません。それはupdate(例えば- (void) update:(Player *)somePlayerInstance)の議論になるかもしれません、またはあなたは、プレーヤーの全体のコレクションを返すコールメソッドを持っている可能性があり、それぞれに対してテストする必要があります。私は答えを与えることはできませんあなたのゲームとアルゴリズムは分かりません!コメント

あなたは、アプリケーションのどこかであなたのPlayerオブジェクトへの参照を格納する必要があります後

。単一のプレーヤーがPlayerであり、sharedInstanceというシングルトンとして設計されている場合や、単一のインスタンスを返す同じ名前のクラスメソッドの場合はどうなりますか?

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

など

別のデザインパターンは、アプリケーションデリゲートストアの参照を持っているし、それをアクセスするための方法(またはプロパティ)を提供することである:それではupdateが含まれていますあなたの場合。このパターンに続き(およびクラスMyDelegateAppを構成するとプロパティplayer名)、あなたのコードは次のようになります。 - などなど

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

はさらに別のモデルでは、アプリケーションのメインXIB/NIBファイルでシングルプレイヤーを作成することです。、多くのアプリケーションモデルがあります!

あなたは、「単に」(もちろん、その単純ではない)あなたのシングルプレイヤーがアクセスできるように、一つの方法または別の、あなたがそれを必要とする...

+0

偉大な応答をいただきありがとうございます。私があなたを正しく理解している場合、関数内でplayer引数を使用する必要があると言います。 しかし、スケジューラに引数を渡すことができないため、問題があります。また、プレイヤーは1人だけです。ありがとう! – Blakedallen

2

あなたcompareSize:メソッドが(コロンに注意してください)プレーヤーのパラメータが必要です。

だから、このようにそれを呼び出す必要があります:selfが希望EnemyFishのインスタンスである場合は、あなたが[self compareSize:somePlayer]を行うことができます

[someEnemyFish compareSize:somePlayer]

が、あなたのタイトルはselfがEnemyFishないことを示しているようですか?

関連する問題