1

所以我想知道这是个好主意还是坏主意。

我正在构建一个简单的 iOS 游戏(使用标准 UI 控件),它允许用户创建角色和怪物“模板”,然后构建引用角色和怪物并与它们交互的遭遇。

当用户创建一个遭遇时,有一个简单的模态视图允许他们命名遭遇,然后推送到另一个 VC 以选择参与的角色,返回,推送到第二个视图控制器以选择涉及的怪物模板,以及至于有多少怪物将参与其中。

最后,目标是让怪物模板用于构建“真实”的怪物,这些怪物将在遭遇中被引用。

Sample Encounter
  Player Characters
    Ramza Beoulve
    Delita Hiral
  Monsters
    Orc 1
    Orc 2
    Orc 3

对于角色选择部分,我使用了一个 NSSet 来存储选择的角色实体并在视图控制器之间传递它。(这样我避免在实际保存新的遭遇之前不得不非常混乱的托管对象上下文)

对于怪物,因为我需要存储一个数量以及实体,所以它有点复杂。

所以我最初的想法是将它们存储在 NSDictionaries 的 NSArray 中,其中包含 Monster Template 和 Quantity。

这种方法的问题是我必须遍历 NSArray 并打开每个单独的字典来检查是否存在特定的怪物模板。

在这种规模的应用程序中,它可能并不重要,但它似乎效率低下。

所以我认为最好只维护两个 NSMutable 数组

NSMutableArray *selectedMonsterTemplates;
NSMutableArray *selectedMonsterTemplateQuantities;

这样我可以简单地打电话

[selectedMonsterTemplates containsObject:monsterTemplate]; 

当我需要检查其中是否已经存在某些东西时,并且当我为特定怪物添加或减去数量时,我可以简单地更新两个数组。

然后,当 Encounter 被保存时,我可以简单地遍历 Array 一次以创建所需数量的个人怪物实例,并将它们与 Encounter 相关联。

我担心这种方法虽然简单有效,但如果代码中出现小错误,可能会导致并发问题。有没有更好的方法来解决这个问题?

4

2 回答 2

1

也许添加一个类是一个更好的设计,比如说 TemplateStore。(或者任何你喜欢的)

@interface TemplateStore : NSObject {
   MonsterTemplate *template; //Super class of a monster entity. 
   NSInteger quantity;
}

- (id) initWIthMosterTemplate:(MonsterTemplate *)temp;
- (void) increaseQuantity;
- (BOOL) isKindOfTemplate:(MonsterTemplate *)otherTemp;

@property (readonly, retain) MonsterTemplate *template;
@property NSInteger quantity;

@end

当您将此类对象存储在数组中时,您可以对其进行迭代并使用 isKindOfTemplate 方法来了解 MonsterTemplate 是否存在。然后只是增加数量。

于 2011-02-16T21:13:08.127 回答
0

一般来说,您不会仅仅为了保存结构化数据而制作一个字典数组,而是使用单个字典,其中项目(模板)作为键,数量作为值。伪代码就像:

quantity=dict[template];

当然,这是假设您将模板存储为某处的指针。更好的选择是使用结构:

struct monster_t { template_t t; int quantity; }

然后你拿着这些东西的数组:

monster_t[] bestiary;

或者更好的是,找出各种 ID(唯一的怪物名称文件?)并将其保存在字典中:

dictionary<string, monster_t> dict;
dict["big_monster_01"].quantity=5;

当然这个系统很没用,你根本不在乎数量。你关心的是世界上实际的怪物实例,基本上是带有自定义值的模板,用于命中统计、战利品等和位置:

struct monster_instance_t { monster_t template; vector position; }
monster_instance_t[] monsters; // who cares what they are? 
                               // that's what polymorphism is for!
于 2011-02-16T21:11:41.483 回答