3

私は、MickWestの記事「EvolveYourHierarchy」に沿って、Objective-Cを使用して単純なコンポーネントベースのゲームオブジェクトアーキテクチャを実装しようとしています。この目的のために、Mike Ashによる「Objective-Cメッセージ転送」の記事で概説されているように、つまり-(id)forwardingTargetForSelector:メソッドを使用して、いくつかのアイデアをうまく​​使用しました。

基本的な設定は、コンテナGameObjectクラスがあり、インスタンス変数としてコンポーネントクラスの3つのインスタンス(GCPositioning、GCRigidBody、およびGCRendering)が含まれていることです。メソッドは、メソッド-(id)forwardingTargetForSelector:を使用して決定された、関連するセレクターに応答するコンポーネントを返します-(BOOL)respondsToSelector:

これはすべて、ある意味で魅力のように機能します。実装がコンポーネントの1つにあるGameObjectインスタンスのメソッドを呼び出すことができ、それが機能します。もちろん、問題は、コンパイラが各呼び出しに対して「応答しない可能性がある」という警告を出すことです。さて、私の質問は、どうすればこれを回避できるかということです。特に、GameObjectの各インスタンスが異なるコンポーネントのセットを持つという事実に関してはどうでしょうか。たぶん、オブジェクトごとに、コンテナオブジェクトにメソッドを登録する方法はありますか?たとえば、ある種の-(void)registerMethodWithGameObject:メソッドを作成できますか?それをどのように行うのですか?

さて、私がCocoaとObjective-Cにかなり慣れていないことは明らかかもしれませんし、そうでないかもしれません。もちろん、私の特定の問題の解決策を知りたいのですが、これを行うためのよりエレガントな方法を説明したいと思う人は、さらに大歓迎です。

よろしくお願いします、-Bastiaan

4

5 に答える 5

2

コンテナオブジェクトにそのコンポーネントのすべてのメッセージを送信することは、Mick Westが示唆していたことではないと思います。これは、「モノリシックゲームエンティティオブジェクト」の概念を取り除くのに役立ちません。

最終的な目標は、コンテナオブジェクトをまったく使用せずに、コンポーネントを相互に直接通信させることです。それまでは、コンテナオブジェクトは、ゲームエンティティごとに1つのオブジェクトを期待する古いコードと新しいコンポーネント間システムの間の接着剤として機能します。

つまり、最終製品でメッセージ転送を使用する必要はまったくないはずです。したがって、警告を無視したり、警告を静めるために変数を宣言したりすることは、idそれほど醜いことではありません。(この記事で説明されている計画は、警告の原因となっているコードそのものを最終的に削除することです!)

于 2010-04-15T00:43:23.590 に答える
0

これらの警告を消す簡単な方法は、タイプのインスタンス変数を宣言することです。id

このようにして、コンパイラは、オブジェクトのタイプに関して何をしているかを知っていること、およびオブジェクトが送信するメッセージに応答すること、またはオブジェクトが気にしない場合はオブジェクトが応答することを前提としています。

于 2010-04-14T20:10:36.447 に答える
0

GameObjectの-respondsToSelector:メソッドをオーバーライドします。次に、実装はrespondsToSelector:各インスタンスにメッセージを送信し、YESいずれかのインスタンスがを返す場合はを返す必要がありますYES

于 2010-04-14T20:50:20.827 に答える
0

idのタイプを使用できます。または、performSelectorメソッドを使用してメソッドを呼び出すか、引数が複雑な場合はNSInvocationを作成できます。ただし、これはすべてコンパイラの警告を回避する方法にすぎません。オブジェクトが複数のメソッドに応答する場合は、同じ警告が適用されますが、プロトコルを宣言すると役立つ場合があります。

于 2010-04-14T21:16:37.150 に答える
0

問題を正しく理解している場合のもう1つのオプションは、プロトコルを実装することです。これはJavaのインターフェースのリンクであり、変数は次のように宣言できます。

id anObjectRef

このようにして、コンパイラは、anObjectRefによって参照されるオブジェクトがプロトコルに準拠していることを理解します。

キャストまたは割り当てる前に、特定のオブジェクトが特定のプロトコルに準拠しているかどうかを確認できるメソッドもあります。

于 2010-04-15T00:56:16.637 に答える