我正在使用Sprite Kit构建游戏,我希望根据自开始游戏以来的时间逐渐增加难度(从1.0开始)。
有人建议我应该使用对数计算,但我不确定如何在Objective-C中实现它。
- (float)difficulty
{
timeSinceStart = ???; // I don't what kind of object this should be to make it play nice w/ `log`
return log(???);
}
更新#1
我知道我需要使用log
方法,但我不确定需要传递给它的值。
答案 0 :(得分:1)
Objective C是C语言的超集,因此您可以使用“math.h”。
从“math.h”计算自然对数的函数是double log(double x);
修改强>
由于您希望难度随时间而增加,您可以将时间作为参数传递给log(double x)
。如何使用它来计算和改变“难度”是一个完全不同的问题。
如果要更改曲线的形状,请将表达式乘以常量,如2*log(x)
中所示,或将参数乘以常量,如log(2*x)
中所示。您必须查看各个曲线,以了解哪种曲线最适合您的特定应用。
答案 1 :(得分:0)
从log(1.0) == 0
开始,您可能需要进行一些缩放和翻译。使用类似1.0 + log(1.0 + c * time)
的内容。在零时刻,这将给出1.0的难度,并且随着时间的推移,难度将以逐渐减慢的速度增加,其速率由c
确定。像c = 0.01
这样的小值会缓慢上升,较大的值会更快上升。
答案 2 :(得分:0)
@pjs给出了一个非常明确的答案。至于如何计算时间:你可能想要实际玩的时间,而不是自启动游戏以来经过的时间。
所以你需要跟踪比赛后的总比赛时间。
我建议你在NSUserDefaults中创建一个条目。您可以使用NSUserDefaults方法setDouble:forKey:
和doubleForKey:
我会创建一个实例变量startPlayingTime,输入double
当您开始运行游戏动作时,使用
捕获开始时间startPlayingTime = [NSDate timeIntervalSinceReferenceDate];
当用户将游戏/退出传递到后台时,请使用
NSTimeInterval currentPlayTime = [NSDate timeIntervalSinceReferenceDate] - startPlayingTime;
然后读取用户默认值播放的总时间,向其添加currentPlayTime,并将其保存回用户默认值。
然后您可以根据
制作游戏难度difficulty = log(1+ c * totalPlayTime);
(如上面的pjs所解释)并为C选择一些合适的值。