Ниже приведен типичный цикл, который вы увидите в простых играх.Это не хорошая практика, но хорошая основа, на которой стоит опираться:
while(!quit) {
while(evt = events_left_for_processing) {
react_to_event(evt);
}
draw_frame();
}
Обратите особое внимание на второе «время», лучше сделать это так, чем «если», вы будетеуметь обрабатывать комбинированные события более точно.
Через некоторое время вам может понадобиться физика, основанная на времени, и она станет более сложной (с использованием аккумуляторов). Образец из довольно простой игры, которую я писал:
/* Time-based animation loop.
* Accumulator idea picked from an article by Glenn Fiedler on gafferongames.com */
while(!done) {
/* Input */
while(SDL_PollEvent(&evt)) {
window_event(evt, &done);
}
/* Physics */
newTime = time();
deltaTime = newTime - currentTime;
if(deltaTime > 0.0f) {
currentTime = newTime;
accumulator += deltaTime;
while(accumulator >= dt) {
window_update(t, dt);
accumulator -= dt;
t += dt;
}
}
#ifdef FPS_CAPPED
drawTime = newTime - currentDrawTime;
/* Draw */
if(drawTime >= FPS_CAPPED) {
currentDrawTime = newTime;
#endif
window_draw();
SDL_GL_SwapBuffers();
#ifdef FPS_CAPPED
}
#endif
}
window_update
etc - это обобщенные функции (они выполняют функцию в игровом состоянии, используя указатели функций).
В вашем случае преобразование квадрата будет изменено в обработчике event , который перехватывает события mouse_move иимеет состояние для перехвата событий mouse_press / release.В обновлении вы бы изменили данные о квадрате / etc.В рутине draw вы бы сместили квадрат.(если вы не используете другие платформы, такие как OpenGL, которые используют матричные преобразования в конвейере рендеринга)