【问题标题】:Building Constructors for RPG game in Objective C在 Objective C 中为 RPG 游戏构建构造函数
【发布时间】:2010-09-29 11:55:35
【问题描述】:

我有一个 character 具有这种结构的模型类:

@interface CharacterModel : NSObject 
{
    // parent of this character
    CharacterModel *parentChar;

    // basic details
    NSString *fname, *sname, *nick;
    NSString *char_type; // categories of characters: dwarf, etc

    // health
    int health;

    // cash
    double cash;
    double graft;

    // flags
    bool is_cop, is_player, is_ai, is_playable;

    // Skills
    int skill_speed;
    int skill_stamina;
    int skill_aggr;
    int skill_another;
    int skill_somethingelse;
    // Total = 100

    // Hidden RPG skills
    int corruption;
    int greed;

    // Rep skills
    int reputation;

    // Misc. flags
    int active, picked, is_locked;
}

问题是两件事。

1) 我需要在 .h 文件的 @property (nonotomic)... 部分重写此结构,并且我需要为 .m 文件的 @synthesize 部分重新编写此结构

有没有办法减少重新编写东西的需要;我可以将所有这些都放在一个结构或其他东西中然后@synthesize 吗?

2) 构造函数的函数名会很长。

我真的,真的不想编写一个包含数百个变量/字段的构造函数。

即:

-(id)initCharacter:(NSString *)name, and every other class variable mentioned above ...

有没有办法解决这个问题?

我正在考虑做一个 NSMutableDictionary,但你仍然需要为你想要的每个字段编写一个构造函数。

在这方面的任何帮助都会很棒。

谢谢

【问题讨论】:

  • 一个角色不应该有两个父母吗?
  • 其他一些观察:标志 is_cop、is_player、is_playable 可以在一个枚举中,而不是三个单独的布尔标志。货币不是浮点数,现金或 NSDecimalNumber 使用整数类型。加起来为 100 的属性可能是技能对象的属性,具有执行约束的业务逻辑。
  • 哇,那里有很多信息。一个角色只有 1 个父母(或没有)——我不知道为什么一个角色会有 2 个父母。我不确定枚举是什么,但我会查一下。我将按照建议使用 Currency as int。技能对象听起来很酷,我得研究一下。

标签: objective-c constructor


【解决方案1】:

我真的认为你应该让你的设计更进一步。像这样明确定义所有技能和标志是非常不灵活的。考虑创建新的类:

  • 技能
  • 属性
  • 标志

你的角色类将有:

NSMutableArray* skills;
NSMutableArray* attributes;
NSMUtableArray* flags;

显然还有 getter/setter 和 add/remove 方法。

它不仅能让你的课堂看起来更整洁,而且还能节省你大量的打字时间。

【讨论】:

  • 我一定会尝试你的想法。当您说新类时,您的意思是在字符类中包含数组还是在单独的类中?
  • 如果我把它分成 2 个类——我是否还需要在每个类中保留一个对其相关(父)character 的引用?
  • 你的角色类可以有包含技能对象、属性对象、标志对象的数组。说得通? :)
  • 是的,确实如此。谢谢你的帮助。我现在要试试这个。谢谢。
  • 没问题,如果您喜欢我的回答(或任何其他),请不要忘记点赞 :)
【解决方案2】:

如果您可以使用现代 Objective-C 运行时(适用于 iPhone 和 64 位 OS X 程序),您将不得不编写两次属性定义。只需编写@property@synthesize 部分,实例变量将自动创建。如果您需要支持旧的运行时,您只需编写 3 次即可,您无能为力。

对于构造函数,您可能不应该为每个属性传递值。将它们初始化为一些合理的默认值。请注意,如果默认值为 0、0.0、nil 或 NULL,则无需执行任何操作 - alloc 确保所有 ivars 都初始化为零。

如果您想设置 NSDictionary 中的所有属性,您可以使用键值编码来设置它们,而不是手动执行此操作:

for (NSString *key in dictionary) {
    id value = [dictionary objectForKey: key];
    [self setValue: value forKey: key];
}

【讨论】:

  • 如果我放一本字典,我仍然需要编写一个包含所有变量的构造函数,无论它们是否初始化为零——除非我误解了你的意思。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
相关资源
最近更新 更多