ODE/src/game_engine.c

113 lines
1.8 KiB
C

#include "game_engine.h"
int callback_tick(volatile int *tick)
{
*tick = 1;
return TIMER_CONTINUE;
}
int rtc_key(void)
{
int opt = GETKEY_DEFAULT & ~GETKEY_MOD_SHIFT & ~GETKEY_MOD_ALPHA & ~GETKEY_REP_ARROWS;
int timeout = 1;
key_event_t ev = getkey_opt(opt, &timeout);
if(ev.type == KEYEV_NONE) return 0;
return ev.key;
}
void mainloop(void)
{
static volatile int tick = 1;
int t = timer_configure(TIMER_ANY, ENGINE_TICK*1000, GINT_CALL(callback_tick, &tick));
if (t >= 0) timer_start(t);
int key = 0;
struct camera camera = {0, 0, 0, 0};
while (key != KEY_EXIT)
{
while (!tick) sleep();
tick = 0;
motion(&camera);
dclear(C_BLACK);
display_map(camera.x, camera.y);
dupdate();
key = rtc_key();
if (key) keyboard_manager(key, &camera);
}
if (t >= 0) timer_stop(t);
}
void keyboard_manager(const int key, struct camera *camera)
{
switch(key)
{
case KEY_UP:
camera->dy -= 10;
break;
case KEY_RIGHT:
camera->dx += 10;
break;
case KEY_DOWN:
camera->dy += 10;
break;
case KEY_LEFT:
camera->dx -= 10;
break;
}
}
void motion(struct camera *camera)
{
extern const struct map map_world;
if (camera->dx)
{
if (camera->x + camera->dx < 0)
{
camera->x = 0;
camera->dx = 0;
}
if (camera->x + camera->dx > map_world.width * TILE_SIZE - 396)
{
camera->x = map_world.width * TILE_SIZE - 396;
camera->dx = 0;
}
camera->x += camera->dx;
camera->dx = floor(camera->dx / 2);
}
if (camera->dy)
{
if (camera->y + camera->dy < 0)
{
camera->y = 0;
camera->dy = 0;
}
if (camera->y + camera->dy > map_world.height * TILE_SIZE - 224)
{
camera->y = map_world.height * TILE_SIZE - 224;
camera->dy = 0;
}
camera->y += camera->dy;
camera->dy = floor(camera->dy / 2);
}
}