Позиции MIDI-нот в трехмерном пространстве

У меня проблемы с программированием игры. Поскольку я мало что знаю о файлах MIDI, я конвертирую их в текст, а затем загружаю в свою игру. Появляется примечание, но их положение рассинхронизируется через несколько секунд ... Кто-нибудь может сказать мне, почему? Тем более, что я немного новичок ... Это пример файла, который содержит данные:

RESOLUTION 480
TEMPO
0 422000
480 423000
960 422000
1440 423000
1920 422000
2400 423000
2880 422000
3360 423000
3840 422000
4320 423000
4800 422000
5280 423000
5760 420000
6240 420998
6720 426000
7200 427000
7680 426000
8160 408000
8640 422000
9120 423000
9600 422000
10080 426000
10560 427000
11040 426000
11520 413999
12480 408998
13440 434999
14400 415000
15840 413999
16320 415000
16800 423999
17280 415997
END
TIMESPANS
0 6
20160 9
24480 6
162720 3
164160 6
END
PART GUITAR
5760 0 420
6240 1 0
6720 2 0
7200 3 0
7680 2 0
8160 1 0
8640 0 420
9120 1 0
9600 2 0
10080 3 0
10560 2 0
11040 1 0
11520 0 420
12000 1 0
12480 2 0
12960 3 0
13440 2 0
13920 1 0
14400 0 420
14880 1 0
15360 2 0
15840 3 0
16320 2 0
16800 4 0
17280 1 0
17280 4 0
END

Весь код в моей игре выполняется 60 раз в секунду (так что в игре будет 60 FPS). На каждом шаге (1/60), который делает игра, ноты перемещаются на 2,5 трехмерных единицы. Итак, это формула, которую я использую для размещения заметок:

_pos = notePosition / 3 / 2.5; // где notePosition - АБСОЛЮТНАЯ позиция MIDI-ноты, 2.5 - это движение, которое нота совершает каждые 1/60 секунды. Я не знаю, что такое 3, но кажется, что оно начинается правильно, потом песня не синхронизируется ...

Итак, какова правильная формула для загрузки MIDI-нот (хотя файл песни не является MIDI, вся позиция соответствует фактической позиции MIDI)?

Заранее спасибо и извините за мой плохой английский!


person FonzTech    schedule 05.06.2014    source источник
comment
Как вы измеряете частоту 60 Гц вашей игры?   -  person CL.    schedule 05.06.2014
comment
По кадрам в секунду ...   -  person FonzTech    schedule 06.06.2014
comment
Как? Какой код вы используете для таймера?   -  person CL.    schedule 06.06.2014
comment
Ах, я забыл сказать, что делаю это с Game Maker 8.1: есть переменная, называемая fps, которая обновляется каждую секунду и вычисляет fps ...   -  person FonzTech    schedule 06.06.2014
comment
Я не знаю, что такое 3, но кажется, что оно начинается правильно, затем песня не синхронизируется ... Почему вы пишете 3, если не знаете, каково его значение? Кажется, это явный кандидат на проблему ...   -  person Lightness Races in Orbit    schedule 26.10.2014


Ответы (1)


Вы не можете полагаться на переменную fps для обновления вашего игрового времени, поскольку она недостаточно точна. Вместо этого используйте переменную current_time, которая указывает количество миллисекунд с момента запуска игры.

http://gamemaker.info/en/manual/403_07_timing

person cfh    schedule 27.03.2015