0

CCSprite のサブクラスである "Character" クラスがあります。"Character" には、int "extraTag" というプロパティが 1 つだけあります。CCNode にキャストされた CCSprite を返すメソッド getChildByTag: を使用しています。私がやりたいのは、それを「キャラクター」に「キャスト」することです。クラスをそのサブクラスにキャストすることは悪い習慣であることを知っているので(とにかくうまくいかない)、CCSpriteを「Character」に変更することができるかどうか知りたい. 関数のオーバーロードは Obj-C には存在しないため、その可能性はありません。

どんな助けでも大歓迎です。ありがとうございました。

PS: 1 つのプロパティに対して "CCSprite" をサブクラス化する理由が気になる場合は、"CCSprite" がアニメーション化されたときに保存するために "extraTag" を使用しているためです。runAction: を呼び出すと、「extraTag」が現在のアクション名に設定されます。CCNode の既存の「タグ」プロパティを台無しにしたくありません。これは、他の理由で内部的に Cocos2D によって処理されるためです。これが警告を発する場合は、私に知らせてください。悪い習慣はできるだけ避けたい!(:

4

2 に答える 2

2

Character クラスでスプライトをラップできます。

@interface Character {
    CCSprite *sprite;
    int actionTag;
}

- (void)runAction:(CCAction *)action;

@end

および実装ファイルで:

- (void)runAction:(CCAction *)action{
    actionTag = <action-name>;
    [sprite runAction:action];
}
于 2013-07-08T10:14:26.063 に答える
1

私があなたの目標を正しく理解していれば、クラスの既存のインスタンスに新しいプロパティを追加したいと考えています。したがって、サブクラスを定義して間違った方法で「キャスト」しようとする考えです。指摘されているように、あなたはそれを行うことはできません。

目的の新しいプロパティを持つ別のクラスに既存のインスタンスをラップすると、プロパティとインスタンスの 2 つがバインドされますが、ラッパー クラスのインスタンスとしてバインドされます。ラッパーを使用して目標を達成できます。プロパティと既存のクラスへの参照の両方でサブクラスを定義し、キャプチャされたインスタンスにメソッドを転送します (つまり、プロキシを構築します)。

では、目標を達成するために Objective-C が提供するものは何でしょうか?

Objective-C は、既存のクラスに追加のメソッドを追加できるカテゴリをサポートしているため、既存のクラスのすべてのインスタンスをサポートしています。

しかし、メソッドを追加するのではなく、int. int ただし、プロパティを定義できます。デフォルトでは、プロパティは2つのメソッドといくつかのストレージです(あなたの場合はint. カテゴリはメソッドを提供するので、必要なのはストレージだけです...

関連オブジェクトを入力します。Objective-C は、任意の数のオブジェクトを別のオブジェクトに関連付けることをサポートします。関連付けられた各オブジェクトは一意のキーによって識別されます。事実上、Objective-C は関連付けられたオブジェクトの辞書を提供します。オブジェクトはストレージを提供します...

したがって、概要では、次のことができます

a)intプロパティを持つクラスを宣言します-それを呼び出しますMyAddedProperties

b) でカテゴリを定義します。CCSpriteたとえばMyAddedPropertiesCategory、プロパティも提供しますint。このプロパティのセッターとゲッターを手動で実装して、そのプロパティのルックアップと関連付けられたインスタンスをMyAddedProperties設定/取得しintます。

これで、既存のクラスにプロパティが追加されました!

(b)MyAddedPropertiesカテゴリ セッター/ゲッターの最初の呼び出しでのインスタンスを作成して関連付け、関連付けられたオブジェクトの一意のキーを定義する必要があります。キーを検索して前者を実行し、関連付けられたオブジェクトがない場合は作成します。一意のキーは、任意のタイプの値、void *つまりアドレスです。一意のキーを取得する標準的な方法はstatic、カテゴリで変数 (任意の型で、そのアドレスのみが使用される) を宣言し、そのアドレスをキーとして使用することです。

カテゴリについてはこちらで関連するオブジェクトについてはこちらで読むことができます。

それは多くのコードではありません。ソリューションの作成に問題がある場合は、新しい質問をして、コードと問題の原因を教えてください。

HTH

于 2013-07-08T20:25:04.860 に答える