Метод update служит для поддержки возможности анимации сцены и предоставляет возможность всем объектам сцены изменить свое состояние с течением времени.
Методы handleKeyboard и handleMouse предназначены для обработки изменений состояния клавиатуры и мыши.
Метод handleChar служит для обработки поступивших символов от клавиатуры.
Метод handleKey дает возможность реагировать на нажатия и отпускания клавиш, в том числе и на такие, которые не порождают символов, например Fl, Alt и т. п.
В результате главный цикл нашего рендерера (обработка ввода и рендеринг сцены) принимает следующий вид: Е
while ( ! controller -> update () ) controller -> draw ();
В нем осуществляется постоянное чтение и обработка ввода (через метод update) и построение изображения (через метод draw).
Также этот класс отвечает за расчет скорости рендеринга, измеряемой в числе кадров в секунду (frames per second, fps). Для поддержки этого в массиве lastFrameTimes хранятся значения времени для последних восьми кадров (использование сразу нескольких кадров служит для уменьшения погрешностей, вызванных различными задержками и неточностью таймера). Полученное значение также усредняется со значением с предыдущего кадра для устранения случайных искажений.
Пишем портальный рендерер (часть I)
void Controller :: draw () {
if ( !resourcesUploaded ) {
Application :: instance -> getResourceManager () ->
upload (); resourcesUploaded = true;
)
if ( getModel () != NULL && camera != NULL )
getModel () -> render ( *getView (), *camera );
console -> draw ( getView () );
float curTime = timer -> getTime ();
model -> update ( this, curTime );
numFrames++;
if ( numFrames >= 8 ) {
fps = 8.Of / (curTime - lastFrameTimes [0]);
memcpy ( &lastFrameTimes[0], &lastFrameTimes[1], 7*sizeof ( float ) );
lastFrameTimes [7] = curTime;
}
else
{
fps = (float) numFrames /
(curTime - lastFrameTimes [numFrames - 1] );
' lastFrameTimes [numFrames] = curTime;
}
font -> print ( view, 10, 30, "fps %4.1f", fps ) ;