momento/src/main.c

80 lines
1.9 KiB
C

/* SPDX-License-Identifier: GPL-3.0-or-later */
/* Copyright (C) 2021 KikooDX */
#include "conf.h"
#include "level.h"
#include "player.h"
#include <gint/clock.h>
#include <gint/display.h>
#include <gint/gint.h>
#include <gint/keyboard.h>
#include <gint/timer.h>
#define PANIC(msg) \
{ \
dclear(C_BLACK); \
dprint_opt(DWIDTH / 2, DHEIGHT / 2, C_RED, C_NONE, \
DTEXT_CENTER, DTEXT_MIDDLE, "ERROR: %s", \
msg); \
dupdate(); \
getkey(); \
return 0; \
}
extern struct Level level;
extern int level_id;
extern int fatal_error;
extern char *fatal_error_msg;
static int callback(volatile void *arg);
int main(void)
{
int i;
int timer;
volatile int has_ticked = 1;
/* load level */
level_id = 0;
gint_switch(level_load);
if (fatal_error == -1)
PANIC(fatal_error_msg);
/* create player */
struct Player player = player_init();
/* timer setup */
timer = timer_setup(TIMER_ANY, 1000000 / TARGET_UPS, callback,
&has_ticked);
if (timer == -1)
PANIC("timer_setup failed");
timer_start(timer);
/* main game loop */
while (!keydown(KEY_EXIT)) {
/* do x updates per frame, x being ups/fps */
for (i = 0; i < TARGET_UPS / TARGET_FPS; i += 1) {
/* speed limiter */
while (!has_ticked)
sleep();
has_ticked = 0;
/* update */
clearevents();
player_update(&player);
}
/* draw */
dclear(C_BLACK);
level_draw();
player_draw(player);
dupdate();
}
timer_stop(timer);
return 1;
}
static int callback(volatile void *arg)
{
volatile int *has_ticked = arg;
*has_ticked = 1;
return 0;
}