Четверг, 09.05.2024, 05:48
Приветствую Вас Гость | RSS
Главная | Каталог статей | Регистрация | Вход
Вход на сайт
Меню сайта
Категории раздела
Мои статьи [3]
Поиск
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
проекты ***DeMoN***
Главная » Статьи » Мои статьи

FPS, связь со скоростью и таймеры

FPS, связь со скоростью и таймером.


Во первых FPS это не только шутер от первого лица (first person shooter), но и количество кадров в секунду(frame per second). То есть сколько раз за одну секунду ваш экран обновится. Я считаю, что ниже 30 этого значения добиваться не стоит(30 по дефолту стоит в гамаке). Если будет ниже 30, то будет заметно, что изображение на экране дергается. Если вы не понимаете о чем идет речь, то проделайте следующее: откройте гамак, создайте объект и сделайте для него управление, создайте комнату и во вкладке settings установите параметр speed на 15. В некоторых крутых компьютерных играх FPS может падать до менее 30 и тогда мы замечаем некоторую тормознутость игры (в большинстве игр в опция можно включить отображение FPS - понаблюдайте).
Именно этот параметр speed в Game maker’е и есть наш FPS. Максимальное значение можно установить 300. Зачем? Теперь давайте подумаем.
Допустим, у вас есть объект, который может сталкиваться с другими. Если вы не изменяли speed то за одну секунду событие step будет выполняться 30 раз. Допустим, нам нужна точная проверка столкновения. Тогда мы уменьшим скорость передвижения объекта (к примеру объект передвигался на 1, а теперь поставим на 0.01). Но тогда он будет двигаться очень медленно! Увеличим FPS и объект будет двигаться быстрее и проверка будет чаще, что символизирует более высокую точность. Это я там вам привел словесный пример.
Но может возникнуть проблема. Ведь слабенький компьютер не будет работать так быстро и FPS будет значительно падать. Ведь мы допустим передвигаем объект по оси X на значение i каждый шаг, и на быстрых компьютерах за одну секунду объект передвинется на более большее расстояние чем на слабых. Как компенсировать разницу в FPS? Мы будем добавлять к значению I некоторую переменную time_factor, значение которой будет зависеть от FPS. То есть чем меньше FPS, тем больше time_factor. И тогда наша скорость будет всегда одинаковой. Но как это сделать?
Мы будем работать с временем. Мы будем засекать сколько прошло времени за некоторое количество пройденных событий step и благодаря этому вычислим наш time_factor. Так как такая процедура давно не секрет, я позаимствовал код из TechDemo, т.к. он уже переведен на язык GML.
Собственно нам будут нужны некоторые переменные для вычислений и сам time_factor, который лучше всего сделать глобальной переменной. Следующее нужно добавить в событие создания(например в ваш контролер):

// Этот скрипт вычисляет коэффициент времени, используя одни очень приличный метод.
// Он сохраняет время, которое прошло за 20 предыдущих шагов. Получается
// хороший коэффициент времени, который свободно округляет ошибки.

saved_time_index=0;
passed_steps=0;
saved_time[0]=0;
global.time_factor=1;


Следующее нужно добавить в событие шага того же объекта(лучше в end step):
// Этот код вычисляет коэффициент времени, основываясь на текущее
// время, и время которое прошло за 20 последних шагов.

passed_steps+=1;
saved_time_index+=1;
while(saved_time_index>=20){
saved_time_index-=20;
}
if(passed_steps>20){
global.time_factor=(current_time-saved_time[saved_time_index])*0.001;
}
else{
saved_time[0]=current_time;
global.time_factor=(current_time-saved_time[0])*0.02/passed_steps;
}
saved_time[saved_time_index]=current_time;
if(global.time_factor==0){
global.time_factor=1;
}
global.time_factor=min(3,global.time_factor);



Теперь что бы все это приносило пользу при указании передвижения нужно ваше значение умножать на time_factor. Вот теперь вы смело можете ставить ваш FPS на 300 и не боятся, что у одних ваша игра будет заканчиваться за одну секунду, а у других работать как слайд-шоу.
Хотя это не все. Как известно alarm[] (таймер) зависит от FPS. От них то и придется отказаться. Фактически, что такое таймер в Game maker? Это всего лиш переменная, значение которой уменьшается каждый шаг на 1, пока не достигнет 0. Также этот таймер единожды возвращает сигнал (в Game maker этот сигнал принимает вид кода, который выполняется единожды).

Создать свой таймер легко. Введите некую переменную timer. В событии шага пропишите if timer > 0 then timer -= 1*time_factor . Соответственно после этого проверяйте если меньше нуля и выполняйте нужные действия. Думаю уж это не составит вам труда =) .



© Бирюков Дмитрий aka DeMoN 2009

Категория: Мои статьи | Добавил: DeMoN (21.06.2009)
Просмотров: 867 | Комментарии: 2 | Рейтинг: 0.0/0
Всего комментариев: 2
2 Bouzi  
0
Спасибо, помогло:)

1 Kurtisrae  
0
Спасибо!

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Copyright Бирюков Дмитрий aka ***DeMoN*** © 2024