iphone - 添加成就机制-如何设计- objective-c

标签 iphone objective-c design-patterns architecture

所以我想在我的游戏中添加成就。 基本上,使用该应用程序时可以授予大约 40 项成就。 (如果在玩游戏时,甚至在按某些菜单按钮时)。

我不确定应该如何实现它,所以我会让您知道到目前为止我想到的选项:

  1. 编写一个具有 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/

相关文章:

ios - 找不到“openssl/rsa.h”文件

iPhone - MapKit - 搜索位置和移动注释

iphone - 如何制作纵向模式下的 UISplitViewController?

objective-c - 在表格 View 中制作淡入淡出的标题,就像在笔记应用程序中一样

java - 这是一种反模式还是违反了一些设计原则?

ios - 完全静态的 UICollectionView 可能吗?

objective-c - 无法在 Swift 中调用 Objective-C 方法

ios - 关闭 UITabBarVC 并返回登录屏幕

design-patterns - 我可以使用哪些编码或设计模式来强制执行所需的方法调用序列?

javascript - 使用 JavaScript/Node.js 实现插件架构