0

私は Objective C の初心者で、C++ に慣れているため、混乱する可能性があります。私はiPhoneゲームを作っています。私がやりたいのは、すべての敵とヒーローを「登録」および「登録解除」するクラスを持つことです。敵とヒーローの個々のインスタンスをこのシングルトン クラスに渡し、そのオブジェクトを NSMutableArray に追加して、特定の各インスタンス内で関数を呼び出して変数を変更できるようにしたいと考えています (レジスタ ID に基づく for ループを使用して)。敵のオブジェクトのポインターを渡そうとすると、(壊れたistributer.h" で) タイプが必要であるというエラーが発生し、フォーラムをオンラインで見ていると、誰もこの質問に答えていないようです。どうすればこれを機能させることができますか?スタック上にあるオブジェクトのコピーは必要ないので、変数を変更してもそれらの変更は失われません。よろしくお願いします。

DamageDistributer.h

@interface DamageDistributer : NSObject {

    GLuint enemyRegisterID;
    GLuint heroRegisterID;

    NSMutableArray *enemies;
    NSMutableArray *heros;
}

- (void)RegisterHero:(Player*)playerHero; //PROBLEM HERE
- (void)RegisterEnemy:(AbstractEnemy*)enemyUnit; //PROBLEM HERE 
- (void)Unregister:(GLuint)registerID type:(GLuint)typeOfEntity;

+ (DamageDistributer*)sharedDamageDistributer;

DamageDistributer.m

- (void)RegisterHero:(Player *)playerHero {

    [heros addObject:playerHero];
    playerHero.damageDistID = heroRegisterID;
    heroRegisterID++;
}

- (void)RegisterEnemy:(AbstractEnemy *)enemyUnit {

    [enemies addObject:enemyUnit];
    enemyUnit.damageDistID = enemyRegisterID;
    enemyRegisterID++;
}

- (void)Unregister:(GLuint)registerID type:(GLuint)typeOfEntity {

    if (typeOfEntity == hero) {
        [heros removeObjectAtIndex:registerID];
    }
    else {
        [enemies removeObjectAtIndex:registerID];
    }
}

そして、これはエネミークラスからの呼び出しです

sharedDamageDistributer = [DamageDistributer sharedDamageDistributer];
[sharedDamageDistributer RegisterEnemy:self];

それで、私は何を間違っていますか?

編集済み: ああ、それは見落としていました...それ以上だと思っていた皆さんに感謝します。もう1つ質問です。変更可能な配列は、オブジェクトが配列から削除されるとインデックスをシフトするので、オブジェクトが削除された後にすべてのオブジェクト (registerID) をデクリメントする必要がありますか? それとも、インデックスをそのままにして、空白を埋めますか? または、何もシフトせずに最後に追加し続けますか? 再度、感謝します。

4

3 に答える 3

3

ヘッダーが Player と AbstractEnemy を認識していないようです。これらの 2 つのヘッダーをインポートするか、その名前のクラスがあることをコンパイラに伝える @class (前方宣言) を追加することができます。次に、もちろん、DamageDistributer の実装内でこれらのヘッダーをインポートします

    @class Player;
    @class AbstractEnemy;
    @interface DamageDistributer : NSObject {

        GLuint enemyRegisterID;
        GLuint heroRegisterID;

        NSMutableArray *enemies;
        NSMutableArray *heros;
    }

    - (void)RegisterHero:(Player*)playerHero; //PROBLEM HERE
    - (void)RegisterEnemy:(AbstractEnemy*)enemyUnit; //PROBLEM HERE 
    - (void)Unregister:(GLuint)registerID type:(GLuint)typeOfEntity;

    + (DamageDistributer*)sharedDamageDistributer;
于 2012-10-27T14:36:13.927 に答える
1

Objective-C では、すべて (int や strict などの基本的な c 型を除く) がヒープ上にあります。すべてのオブジェクトはヒープ上にあり、メモリ管理に参照カウント (スマート ポインターなど) を使用します。

ただし、エラーはこれとは無関係に見えますが、単に失敗している可能性があります#import "Player.h"

于 2012-10-27T14:40:11.487 に答える
1

ヘッダーのカスタム クラスを認識していないと思います。次のような宣言を .h ファイルに追加します。

@class Player;
@class AbstractEnemy;
于 2012-10-27T14:37:29.533 に答える