2014-02-19 3 views
-1

Я создаю игру с использованием Sprite Kit, и я хочу постепенно увеличивать сложность (начиная с 1.0) в зависимости от времени, начиная с начала игры.Логарифмический расчет в Objective-C

Кто-то предложил использовать для этого логарифмический расчет, но я не уверен, как реализовать это в Objective-C.

- (float)difficulty 
{ 
    timeSinceStart = ???; // I don't what kind of object this should be to make it play nice w/ `log` 
    return log(???); 
} 

Update # 1

Я знаю, что мне нужно использовать метод log, но я не зная, что значения мне нужно пройти к нему.

+0

это не вопрос программирования, но более математическая задача , –

+0

@JohnRiselvato Я понял, что это в основном математический вопрос, но это также вопрос программирования, потому что я не знаю эквивалентов метода objc для рассматриваемой математики. Кроме того, я не знаю, какой объект должен быть мой «время с момента запуска». –

+0

Значение времени, которое вы передаете 'log()', должно быть типа 'double', или вам придется придать ему значение' double'. –

ответ

1

Цель C является надмножеством языка C, поэтому вы можете использовать «math.h».

Функция, которая вычисляет натуральный логарифм от «math.h» является double log(double x);

EDIT

Так как вы хотите трудность увеличения в зависимости от времени, вы бы скоротать время в качестве аргумент log(double x). Как вы могли бы использовать это для вычисления и изменения «трудности», это совершенно другой вопрос.

Если вы хотите изменить форму кривой, либо умножьте выражение на константу, как на 2*log(x), либо умножьте параметр на константу, как в log(2*x). Вам нужно будет посмотреть на отдельные кривые, чтобы увидеть, что лучше всего подходит для вашего конкретного приложения.

+3

Обратите внимание, что вы можете вычислить логарифм любой базы, выполнив 'log (x)/log (base)'. –

+0

Я вижу, что я могу использовать функцию «log», но я не уверен, что мне нужно передать ей, чтобы получить постепенную кривую. –

+0

Я не уверен, что вы просите. Естественный логарифм является одной кривой. Передача любого значения x в эту функцию вернет значение y. –

0

С log(1.0) == 0 вы, вероятно, захотите сделать некоторое масштабирование и перевод. Используйте что-то вроде 1.0 + log(1.0 + c * time). В нулевое время это даст трудность 1,0, и по прошествии времени сложность будет возрастать со все более медленным темпом, скорость которого определяется c. Небольшие значения, такие как c = 0.01, будут давать медленное нарастание, большие значения будут увеличиваться быстрее.

0

@pjs дал довольно четкий ответ. Что касается того, как определить время: вы, вероятно, хотите, чтобы время, затрачиваемое на игру, превышало время, прошедшее с момента запуска игры.

Таким образом, вы сможете отслеживать общее время игры, игры после игры.

Предлагаю вам создать запись в NSUserDefaults. Вы можете сохранять и загружать двойные значения пользователя по умолчанию с помощью методов NSUserDefaults setDouble:forKey: и doubleForKey:

Я хотел бы создать переменную startPlayingTime экземпляра, типа двойного

Когда вы начинаете действие игры запуск, захват времени начала использования

startPlayingTime = [NSDate timeIntervalSinceReferenceDate]; 

Когда пользователь передает игру/выходы на фоне, использовать

NSTimeInterval currentPlayTime = [NSDate timeIntervalSinceReferenceDate] - startPlayingTime; 

Затем прочитайте общее время воспроизведения от пользовательских значений по умолчанию, добавьте currentPlayTime к нему и сохраните его обратно по умолчанию.

Вы можете сделать вашу игру трудность основана на

difficulty = log(1+ c * totalPlayTime); 

(как это объясняется PJs, выше), и выбрать подходящую величину для C.

Смежные вопросы