所以我想在我的游戏中添加成就。 基本上,使用该应用程序时可以授予大约 40 项成就。 (如果在玩游戏时,甚至在按某些菜单按钮时)。
我不确定应该如何实现它,所以我会让您知道到目前为止我想到的选项:
编写一个具有 addAchievment() 函数的 AM(成就管理器)类。
在我的应用程序中可以授予成就的每个函数中,我可以分配一个 Achievemnt 对象并使用该对象调用 addAchievment()。 我不喜欢这种方法的首先是,您必须向应用程序的许多部分添加大量成就代码。 (并检查是否多次添加相同的成就)。
改进它的一种方法可能是使用某个枚举调用 addAchievment() ,然后在 addAchievment() 实现内部检查每个枚举并分配适当的成就对象 - 然而,具有 40 个情况切换的函数不会听起来也不太好。
2. 对于每个可以报告成就的类(class),我可以为每个成就编写一个函数,如果应该授予该成就,则返回该函数。 例如,A 类可以报告 2 项成就,我可以编写 2 个函数:
-(BOOL) shouldGrantA1
-(BOOL) shouldGrantA2
当我初始化 A 类时,我调用成就管理器并将这 2 个函数添加到 AM 将保存的函数数组中。 每次我想检查是否应该授予成就时,我只需调用 AM CheckAchievements() ,它将执行的操作是运行所有函数并添加成就 其中函数返回 TRUE。
这种方法的问题 - 假设在 A 类中,我到达了一个地方,我改变了一个我知道可以实现成就的值。我可以调用 AM 的 CheckAchievements(),但这将遍历所有成就函数,尽管目前可能只有 A 类的成就会被授予。似乎有点开销。 有办法解决吗?
我也很想在这里提出其他建议。 谢谢!!
最佳答案
我不会将任何成就(例如代码)添加到您现有的游戏类中。没有 bool 值或任何其他值,因为这会在游戏类和成就系统之间造成过于紧密的耦合。最好创建一个单独的“AchievementManager”来管理多个 AchievementListener,这些监听器监听对象的状态,并在相关状态更改时检查解锁条件。我认为这个想法最好用代码来说明。
例如,如果您有成就“玩家行走 100 公里”。 PlayerWalksAchievementListener 看起来像这样。
private AchievementManager manager;
private Player player.
private Vector2 previousPlayerPosition;
private float distanceWalked;
Update()
{
float dist = Vector2.Distance(player.Position, previousPlayerPosition);
if(dist > 0)
{
distanceWalked += dist;
CheckUnlockCondition();
}
}
CheckUnlockCondition()
{
if(distanceWalked * conversionFactor > 100) { manager.UnlockAchivement(achievementID); }
}
关于iphone - 添加成就机制-如何设计- objective-c ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4793109/