0

我对 Objective C 还很陌生,因为我习惯了 C++,所以可能会感到困惑。我正在制作一个 iphone 游戏,我想做的是让所有敌人和英雄“注册”和“取消注册”到一个班级。我想将敌人和英雄的每个单独实例传递给这个单例类,然后将对象添加到 NSMutableArray 并能够调用函数并更改每个特定实例中的变量(通过使用基于它们的 registerID 的 for 循环)。当我试图传递一个敌方对象的指针并在网上查看论坛似乎没有人回答这个问题时,我收到一个错误,它需要一个类型(在损坏的istributer.h 中)。我怎样才能做到这一点?我不想要堆栈上的对象的副本,因此当我更改变量时,我不会丢失这些更改。提前致谢。

损害分配器.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;

损害分配器.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];

那么我做错了什么?

编辑:哦,哇忽略了...谢谢大家,我认为这不仅仅如此。还有一个问题。一旦从数组中删除一个对象,可变数组是否会移动索引,所以我必须在删除一个对象后减少所有对象(registerID)?还是不将索引保留在原处并填充空白?还是不断添加到最后而不改变任何东西?再次感谢。

4

3 回答 3

3

看起来标题不知道 Player 和 AbstractEnemy。您可以导入这 2 个标头,也可以添加 @class(前向声明),告诉编译器该名称有一个类。然后当然你在 DamageDistributor 的实现中导入这些标头

    @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

我认为它无法识别标题中的自定义类。将声明添加到您的 .h 文件中,例如:

@class Player;
@class AbstractEnemy;
于 2012-10-27T14:37:29.533 回答
1

在 Objective-C 中,所有东西(除了基本的 c 类型,如 int、strict 等)都在堆上。所有对象都在堆上并使用引用计数(如智能指针)进行内存管理。

不过,您的错误看起来与此无关,可能是您没有做到#import "Player.h"

于 2012-10-27T14:40:11.487 回答