#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); } }