Independent UPS, FPS, precision, unit and drawing system.

This commit is contained in:
KikooDX 2020-09-19 14:00:46 +02:00
parent 5abe1d6828
commit 134ef0588a
8 changed files with 46 additions and 41 deletions

View File

@ -1,9 +1,12 @@
#define UPS 32
#define FPS 32
#define VEC_PRECISION 1024
#define UPS 256
#define PXS (VEC_PRECISION / UPS)
#ifdef FX9860G
#define SCALE 1
#define FPS 64
#endif /* FX9860G */
#ifdef FXCG50
#define SCALE 2
#define FPS 32
#endif /* FXCG50 */

View File

@ -3,13 +3,14 @@
#include <gint/defs/types.h>
#define KEYS_COUNT 4
#define KEYS_COUNT 5
enum {
K_LEFT,
K_RIGHT,
K_UP,
K_DOWN
K_DOWN,
K_EXIT
};
enum {

View File

@ -4,7 +4,7 @@
#include "input.h"
int play_level(int level_id);
/* callback used for FPS control */
/* callback used for UPS control */
int callback(volatile void *arg);
void step_event(Player *player, Level *level, Camera *camera, Input *input);
void draw_event(Player *player, Level *level, Camera *camera, Input *input);
void step_event(Player *player, Level *level, Camera *camera, Input *input, uint step);
void draw_event(Player *player, Level *level, Camera *camera, Input *input, uint step);

View File

@ -14,6 +14,6 @@ typedef struct Player
void player_step(Player *player, Input *input);
void player_draw(Player *player, Camera *camera);
void player_draw_debug(Player *player);
void player_draw_debug(Player *player, uint step);
#endif /* _DEF_PLAYER */

View File

@ -1,8 +1,6 @@
#ifndef _DEF_VEC
#define _DEF_VEC
#define VEC_PRECISION 512
typedef struct Vec
{
int x;

View File

@ -1,6 +1,7 @@
#include <gint/display.h>
#include "camera.h"
#include "conf.h"
#include "vec.h"
#include "debug.h"
@ -11,10 +12,16 @@ void camera_step(Camera *camera)
void camera_draw_debug(Camera *camera)
{
Vec draw_pos;
vec_cpy(&draw_pos, camera->pos);
vec_mul(&draw_pos, SCALE);
vec_div(&draw_pos, VEC_PRECISION);
uint8_t color;
#ifdef FX9860G
dpixel(camera->pos.x / VEC_PRECISION, camera->pos.y / VEC_PRECISION, C_BLACK);
color = C_BLACK;
#endif /* FX9860G */
#ifdef FXCG50
dpixel(camera->pos.x / VEC_PRECISION, camera->pos.y / VEC_PRECISION, C_RED);
color = C_RED;
#endif /* FXCG50 */
dpixel(draw_pos.x, draw_pos.y, color);
}

View File

@ -45,7 +45,7 @@ int play_level(int level_id)
Camera camera = {
.pos = {DWIDTH * VEC_PRECISION, DHEIGHT * VEC_PRECISION},
.target = &player.pos,
.speed = 0.05
.speed = 0.01
};
/* create input manager */
@ -54,28 +54,30 @@ int play_level(int level_id)
input.keys[K_RIGHT] = KEY_RIGHT;
input.keys[K_UP] = KEY_UP;
input.keys[K_DOWN] = KEY_DOWN;
input.keys[K_EXIT] = KEY_EXIT;
/* FPS control */
/* UPS control */
volatile int has_ticked = 1;
timer_setup(TIMER_ANY, 1000000/FPS, callback, &has_ticked);
timer_start(0);
timer_start(timer_setup(TIMER_ANY, 1000000/UPS, callback, &has_ticked));
while (camera.pos.x / VEC_PRECISION != player.pos.x / VEC_PRECISION ||
camera.pos.y / VEC_PRECISION != player.pos.y / VEC_PRECISION)
uint step = 0;
while (!input_is_down(&input, K_EXIT))
{
/* FPS control */
while(!has_ticked) sleep();
has_ticked = 0;
/* repeat step event so the UPS is constant regardless of FPS */
for (int i = 0; i < UPS / FPS; ++i)
{
/* UPS control */
while(!has_ticked) sleep();
has_ticked = 0;
/* step event is where all the logic happens */
step_event(&player, &level, &camera, &input);
step += 1;
step_event(&player, &level, &camera, &input, step);
}
/* draw event just draws stuff */
draw_event(&player, &level, &camera, &input);
draw_event(&player, &level, &camera, &input, step);
}
return 0;
return 1;
}
int callback(volatile void *arg)
@ -85,7 +87,7 @@ int callback(volatile void *arg)
return 0;
}
void step_event(Player *player, Level *level, Camera *camera, Input *input)
void step_event(Player *player, Level *level, Camera *camera, Input *input, uint step)
{
//getkey();
input_step(input);
@ -94,7 +96,7 @@ void step_event(Player *player, Level *level, Camera *camera, Input *input)
camera_step(camera);
}
void draw_event(Player *player, Level *level, Camera *camera, Input *input)
void draw_event(Player *player, Level *level, Camera *camera, Input *input, uint step)
{
dclear(C_WHITE);
level_draw(level, camera);
@ -102,7 +104,7 @@ void draw_event(Player *player, Level *level, Camera *camera, Input *input)
#ifdef DEBUG
camera_draw_debug(camera);
//input_draw_debug(input);
player_draw_debug(player);
player_draw_debug(player, step);
#endif
dupdate();
}

View File

@ -1,21 +1,17 @@
#include <gint/display.h>
#include "player.h"
#include "conf.h"
#include "camera.h"
#include "input.h"
void player_step(Player *player, Input *input)
{
Vec move = {
(input_is_down(input, K_RIGHT) - input_is_down(input, K_LEFT)) * VEC_PRECISION,
(input_is_down(input, K_DOWN) - input_is_down(input, K_UP)) * VEC_PRECISION
(input_is_down(input, K_RIGHT) - input_is_down(input, K_LEFT)),
(input_is_down(input, K_DOWN) - input_is_down(input, K_UP))
};
#ifdef FX9860G
vec_div(&move, 50);
#endif /* FX9860G */
#ifdef FXCG50
vec_mul(&move, 2);
#endif /* FXCG50 */
vec_mul(&move, 32 * PXS);
vec_add(&player->pos, move);
}
@ -29,19 +25,17 @@ void player_draw(Player *player, Camera *camera)
vec_add(&draw_pos_br, player->hbox);
vec_div(&draw_pos_tl, VEC_PRECISION);
vec_div(&draw_pos_br, VEC_PRECISION);
#ifdef FX9860G
drect(draw_pos_tl.x, draw_pos_tl.y, draw_pos_br.x, draw_pos_br.y, C_LIGHT);
#endif /* FX9860G */
#ifdef FXCG50
vec_mul(&draw_pos_tl, SCALE);
vec_mul(&draw_pos_br, SCALE);
drect(draw_pos_tl.x, draw_pos_tl.y, draw_pos_br.x, draw_pos_br.y, C_BLACK);
#endif /* FXCG50 */
}
void player_draw_debug(Player *player)
void player_draw_debug(Player *player, uint step)
{
dprint(0, 0, C_BLACK, "x: %d", player->pos.x);
dprint(0, 10, C_BLACK, "y: %d", player->pos.y);
dprint(0, 20, C_BLACK, "tx: %d", player->pos.x / VEC_PRECISION);
dprint(0, 30, C_BLACK, "ty: %d", player->pos.y / VEC_PRECISION);
dprint(0, 40, C_BLACK, "vp: %d", VEC_PRECISION);
dprint(0, 50, C_BLACK, "st: %u", step);
}