Я еще эту проблему не решал, но думаю, что ее можно решить следующим образом:
startTime=MilliSecs()
; здесь весь код цикла
passed=MilliSecs()-startTime
If passed<40 Delay 40-passed
Время
40 взято для примера, это количество времени, рассчитанное на один кадр. Если с момента начала выполнения тела цикла прошло меньше, чем
40 миллисекунд, то надо подождать, если больше, то игра и без того будет зависать, так что ждать не имеет смысла.
Однако я думаю, что тут все нужно делать серьезнее - в начале тела цикла узнавать, сколько прошло времени с момента прошлого начала исполнения тела цикла, эту величину заносить в переменную (к примеру, ту же
passed), и потом подставлять прошедшее время в качестве коэффициента:
MoveEntity player, 0, 0, 0.01*passed
Таким образом за секунду человек сдвинется на
10 (
0.01*1000) по оси Z.
Почему 2-й способ лучше 1-го? Потому, что при использовании 1-го способа, если компьютер зависает, то темп игры будет значительно медленнее, а при исп. 2-го способа этого удастся избежать.