projects
/
rocksndiamonds.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
improved synchronization of main game loop
[rocksndiamonds.git]
/
src
/
events.c
diff --git
a/src/events.c
b/src/events.c
index 5f80c5debc113399c863909fe0d9ccf7086b54f1..4c71dca04ece48c1d1e0b436656b51234f4c5c90 100644
(file)
--- a/
src/events.c
+++ b/
src/events.c
@@
-19,6
+19,7
@@
#include "editor.h"
#include "files.h"
#include "tape.h"
#include "editor.h"
#include "files.h"
#include "tape.h"
+#include "cartoons.h"
#include "network.h"
#include "network.h"
@@
-66,7
+67,7
@@
static int FilterEventsExt(const Event *event)
/* do no reset mouse cursor before all pending events have been processed */
if (gfx.cursor_mode == cursor_mode_last &&
/* do no reset mouse cursor before all pending events have been processed */
if (gfx.cursor_mode == cursor_mode_last &&
- ((
effectiveGameStatus()
== GAME_MODE_TITLE &&
+ ((
game_status
== GAME_MODE_TITLE &&
gfx.cursor_mode == CURSOR_NONE) ||
(game_status == GAME_MODE_PLAYING &&
gfx.cursor_mode == CURSOR_PLAYFIELD)))
gfx.cursor_mode == CURSOR_NONE) ||
(game_status == GAME_MODE_PLAYING &&
gfx.cursor_mode == CURSOR_PLAYFIELD)))
@@
-153,12
+154,20
@@
boolean NextValidEvent(Event *event)
void EventLoop(void)
{
void EventLoop(void)
{
+ static unsigned int sync_frame_delay = 0;
+ unsigned int sync_frame_delay_value = GAME_FRAME_DELAY;
+
while (1)
{
if (PendingEvent()) /* got event */
{
while (1)
{
if (PendingEvent()) /* got event */
{
+ // use separate frame delay counter to not reset main delay counter
+ unsigned int sync_frame_delay2 = 0;
+ unsigned int sync_frame_delay_value2 = sync_frame_delay_value;
Event event;
Event event;
+ ResetDelayCounter(&sync_frame_delay2);
+
while (NextValidEvent(&event))
{
switch (event.type)
while (NextValidEvent(&event))
{
switch (event.type)
@@
-204,11
+213,16
@@
void EventLoop(void)
HandleOtherEvents(&event);
break;
}
HandleOtherEvents(&event);
break;
}
+
+ // do not handle events for longer than standard frame delay period
+ if (DelayReached(&sync_frame_delay2, sync_frame_delay_value2))
+ break;
}
}
}
}
- else
+
+ // always handle non-event game actions for every game frame interval
{
{
- if (
effectiveGameStatus()
== GAME_MODE_TITLE)
+ if (
game_status
== GAME_MODE_TITLE)
{
/* when showing title screens, hide mouse pointer (if not moved) */
{
/* when showing title screens, hide mouse pointer (if not moved) */
@@
-246,18
+260,14
@@
void EventLoop(void)
has its own synchronization and is CPU friendly, too */
if (game_status == GAME_MODE_PLAYING)
has its own synchronization and is CPU friendly, too */
if (game_status == GAME_MODE_PLAYING)
- {
HandleGameActions();
HandleGameActions();
- }
- else
- {
- if (!PendingEvent()) /* delay only if no pending events */
- Delay(10);
- }
/* refresh window contents from drawing buffer, if needed */
BackToFront();
/* refresh window contents from drawing buffer, if needed */
BackToFront();
+ if (game_status != GAME_MODE_PLAYING)
+ WaitUntilDelayReached(&sync_frame_delay, sync_frame_delay_value);
+
if (game_status == GAME_MODE_QUIT)
return;
}
if (game_status == GAME_MODE_QUIT)
return;
}
@@
-1567,7
+1577,8
@@
void HandleKey(Key key, int key_status)
default:
if (key == KSYM_Escape)
{
default:
if (key == KSYM_Escape)
{
- game_status = GAME_MODE_MAIN;
+ SetGameStatus(GAME_MODE_MAIN);
+
DrawMainMenu();
return;
DrawMainMenu();
return;