Практически во всех программах написанных на Blitz3D, которые мне
довелось встретить, есть одна и та же проблема. Они работают либо
слишком быстро (в результате чего все события происходят практически
мгновенно и среагировать нереально), либо слишком медленно (сильно
растягивая все движения в игре). Изредка попадались такие проги,
которые работали более-менее нормально. Мне известны 2 способа решения этой проблемы. Первый
способ - сделать статичным количество обновлений цикла в секунду, то
есть больше чем, например, 50 повторений цикла в секунду быть не
должно. Однако просто поставить счетчик и не давать коду цикла
выполнятся после достижения 50-ого повторения, обнуляя каждую секунду
параметр счетчика, нельзя. Это вполне может (и, скорее всего так и
будет) сделать игру скачкообразной, т.к. все передвижения и обновления
экрана будут происходить в начале секунды, а оставшееся время ничего не
происходит. Для решения этой проблемы нужно в конце цикла
поставить явную задержку, то есть в конце цикла программа должна
задержаться на 1/50 секунды минус время, затраченное на исполнение
программы. Второй способ - это сделать все передвижения в игре
привязанными к скорости исполнения программы. Таким образом, чем слабее
машина у пользователя, тем менее гладко у него будет работать прога.
Суть этого способа в том, что вместо задавания моментной скорости
(расстояние, на которое передвигается объект каждый проход цикла на
данной машине, и работающая правильно) писать секундную скорость
(расстояние преодолимое за 1 секунду на любой машине) деленную на
степень уменьшения. Далее каждый раз, определяя скорость исполнения
кода, прога должна вычислять степень уменьшения секундной скорости. Приведу пример:
While Not KeyDown( 1 )
old=MilliSecs(); сохранение в переменной времени до начала кода
Код программы. If KeyDown( 200 )=True Then MoveEntity cam,0,0,10 / Stp; Пример движения
UpdateWater() RenderWorld UpdateWorld Flip
now=MilliSecs()-old; Определение времени исполнения программы Stp=1000/now; Вычисление степени уменьшения секундной скорости
Wend Как видите, все очень
просто - в код нужно добавлять всего-навсего несколько дополнительных
строчек. Только может потребоваться подправить их под вашу прогу, но
принцип остается тот же. Надеюсь, я понятно изложил свою мысль .
|