Практически во всех программах написанных на 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 Как видите, все очень просто - в код нужно добавлять всего-навсего несколько дополнительных строчек. Только может потребоваться подправить их под вашу прогу, но принцип остается тот же. Надеюсь, я понятно изложил свою мысль .
Источник: http://www.igrostroenie.my1.ru/publ/29-1-0-17 |