113 lines
1.8 KiB
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);
|
|
}
|
|
|
|
|
|
} |