所以我想在游戏中添加成就。 基本上,使用该应用程序时可以获得大约40项成就。 (如果在玩游戏时,甚至在按下某些菜单按钮时)。
我不确定应该如何实现它,所以我会告诉你到目前为止我想到的选项是什么:
编写一个具有addAchievment()函数的AM(Achievements Manager)类。
在我的应用程序中可以授予成就的每个函数中,我可以分配一个Achievemnt对象并使用该对象调用addAchievment()。 我不喜欢这种方法首先,你已经为应用程序的许多部分添加了许多成就代码。 (并且还要检查不要多次添加相同的成就)。
改进它的一种方法可能是使用某个枚举调用addAchievment(),然后在addAchievment()实现中检查每个枚举并分配适当的实现对象 - 但是,一个40个开关的函数不能听起来不错。
2。 对于每个可以报告成就的班级,我可以为每个成就编写一个函数,如果该成就应该被授予,则返回。 例如,A类可以报告2个achivments我可以编写2个函数:
-(BOOL) shouldGrantA1
-(BOOL) shouldGrantA2
当我初始化A类时,我调用成就管理器并将这两个函数添加到AM将要保存的函数数组中。 每当我想检查是否应该授予成就时,我只需要调用AM CheckAchievements(),它将会执行所有功能并添加成就 函数返回TRUE。
这种方法的问题 - 让我们说在A级我到达一个地方,我改变了一个我知道可以授予的值。我可以调用AM的CheckAchievements(),但是这将完成所有的成就函数,即使可能目前只有A级的成就才会被授予。似乎有点开销。 有什么方法可以解决这个问题吗?
我也很乐意在这里提出其他建议。 谢谢!
答案 0 :(得分:2)
我不会在您现有的游戏类中添加任何类似代码的成就。没有布尔或者任何东西,因为这会在您的游戏类和您的成就系统之间产生过于紧密的联系。最好创建一个管理多个AchievementListeners的独立“AchievementManager”,它们监听对象的状态,当相关状态改变时,检查解锁条件。我认为这个想法最好用代码说明。
例如,如果你有“玩家行走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); }
}