Independent UPS, FPS, precision, unit and drawing system.
This commit is contained in:
parent
5abe1d6828
commit
134ef0588a
|
@ -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 */
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
#ifndef _DEF_VEC
|
||||
#define _DEF_VEC
|
||||
|
||||
#define VEC_PRECISION 512
|
||||
|
||||
typedef struct Vec
|
||||
{
|
||||
int x;
|
||||
|
|
11
src/camera.c
11
src/camera.c
|
@ -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);
|
||||
}
|
||||
|
|
32
src/main.c
32
src/main.c
|
@ -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();
|
||||
}
|
||||
|
|
22
src/player.c
22
src/player.c
|
@ -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);
|
||||
}
|
||||
|
|
Reference in New Issue