2020-02-11 11:44:37 +01:00
|
|
|
#include <gint/keyboard.h>
|
2020-02-12 11:30:43 +01:00
|
|
|
#include <gint/timer.h>
|
|
|
|
#include <gint/clock.h>
|
2020-02-11 11:44:37 +01:00
|
|
|
#include "draw.h"
|
|
|
|
#include "collide.h"
|
|
|
|
#include "levels.h"
|
|
|
|
|
2020-02-12 11:53:01 +01:00
|
|
|
void jump_test(char *jump_pressed, char *jump_buffer, unsigned int *jump_hold); //test if jump pressed
|
2020-02-12 10:47:12 +01:00
|
|
|
char sgn(int number); //return the sign of input double
|
2020-02-11 11:44:37 +01:00
|
|
|
|
2020-02-12 11:30:43 +01:00
|
|
|
int callback(volatile void *arg)
|
|
|
|
{
|
|
|
|
volatile int *has_ticked = arg;
|
|
|
|
*has_ticked = 1;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-02-11 11:44:37 +01:00
|
|
|
int main(void)
|
|
|
|
{
|
2020-02-12 11:30:43 +01:00
|
|
|
volatile int has_ticked = 1; //fps cap
|
2020-02-11 14:14:18 +01:00
|
|
|
char level[14*25];
|
2020-02-11 11:44:37 +01:00
|
|
|
unsigned char level_id = 0;
|
|
|
|
char jump_pressed = 0; //avoid holding jump
|
|
|
|
char jump_buffer = 0; //jump buffer, last 3 frames
|
2020-02-12 11:30:43 +01:00
|
|
|
unsigned int jump_hold = 0; //number of consecutive frames jump has been held
|
2020-02-12 10:47:12 +01:00
|
|
|
double vspd = 0; //player vertical speed
|
2020-02-11 11:44:37 +01:00
|
|
|
char hspd = 0; //player horizontal speed
|
2020-02-12 10:47:12 +01:00
|
|
|
char on_ground = 6; //remember if player is on solid
|
2020-02-11 11:44:37 +01:00
|
|
|
int player_x = 0;
|
|
|
|
int player_y = 0;
|
|
|
|
int old_x, old_y;
|
2020-02-12 10:47:12 +01:00
|
|
|
const double jump_spd = -4; //default jump speed
|
|
|
|
const double grav = 0.2;
|
|
|
|
const double min_vspd = -8;
|
2020-02-11 11:44:37 +01:00
|
|
|
dclear(0); //0 -> black
|
2020-02-11 13:55:57 +01:00
|
|
|
set_level(level_id, level);
|
2020-02-11 11:44:37 +01:00
|
|
|
draw_level(level, &player_x, &player_y);
|
|
|
|
old_x = player_x + 1; //offset to draw it on first cycle
|
|
|
|
old_y = player_y;
|
2020-02-12 11:30:43 +01:00
|
|
|
//fps cap timer
|
|
|
|
timer_setup(0, timer_delay(0, 16667), 0, callback, &has_ticked);
|
|
|
|
timer_start(0);
|
2020-02-11 11:44:37 +01:00
|
|
|
while (1) {
|
2020-02-12 11:30:43 +01:00
|
|
|
while(!has_ticked) sleep();
|
|
|
|
has_ticked = 0;
|
2020-02-11 11:44:37 +01:00
|
|
|
draw_player(old_x, old_y, player_x, player_y);
|
|
|
|
dupdate();
|
|
|
|
old_x = player_x;
|
|
|
|
old_y = player_y;
|
|
|
|
pollevent();
|
|
|
|
//horizontal movement
|
|
|
|
hspd = 0;
|
|
|
|
if (keydown(KEY_LEFT)) hspd--;
|
|
|
|
if (keydown(KEY_RIGHT)) hspd++;
|
2020-02-11 13:55:57 +01:00
|
|
|
if (!collide(player_x + hspd, player_y, level, '0'))
|
2020-02-11 11:44:37 +01:00
|
|
|
{
|
|
|
|
player_x += hspd;
|
|
|
|
}
|
2020-02-12 10:47:12 +01:00
|
|
|
//ground detection
|
|
|
|
if (collide(player_x, player_y + 1, level, '0')) on_ground = 6;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (vspd > min_vspd) vspd += grav;
|
|
|
|
if (on_ground) on_ground--;
|
|
|
|
}
|
2020-02-11 11:44:37 +01:00
|
|
|
//vertical movement
|
2020-02-12 11:53:01 +01:00
|
|
|
jump_test(&jump_pressed, &jump_buffer, &jump_hold);
|
2020-02-12 10:47:12 +01:00
|
|
|
//if jump is pressed and on ground
|
|
|
|
if (jump_buffer && on_ground) {
|
|
|
|
vspd = jump_spd;
|
|
|
|
on_ground = 0;
|
|
|
|
}
|
|
|
|
//vertical collision
|
|
|
|
{
|
|
|
|
int trunc_vspd = vspd; //truncate vspd
|
|
|
|
if (!collide(player_x, player_y + trunc_vspd, level, '0'))
|
|
|
|
{
|
|
|
|
player_y += trunc_vspd;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
char sign_vspd = sgn(trunc_vspd);
|
|
|
|
while (!collide(player_x, player_y + sign_vspd, level, '0'))
|
|
|
|
{
|
|
|
|
player_y += sign_vspd;
|
|
|
|
}
|
|
|
|
vspd = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//exit
|
|
|
|
if (keydown(KEY_EXIT)) return 0;
|
2020-02-11 11:44:37 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-12 11:30:43 +01:00
|
|
|
void jump_test(char *jump_pressed, char *jump_buffer, unsigned int *jump_hold)
|
2020-02-11 11:44:37 +01:00
|
|
|
{
|
|
|
|
if (keydown(KEY_SHIFT))
|
|
|
|
{
|
2020-02-12 11:53:01 +01:00
|
|
|
*jump_hold += 1;
|
2020-02-11 11:44:37 +01:00
|
|
|
if (!*jump_pressed)
|
|
|
|
{
|
|
|
|
*jump_pressed = 1;
|
|
|
|
*jump_buffer = 3;
|
|
|
|
}
|
|
|
|
}
|
2020-02-12 10:47:12 +01:00
|
|
|
else {
|
2020-02-12 11:30:43 +01:00
|
|
|
*jump_hold = 0;
|
2020-02-12 10:47:12 +01:00
|
|
|
*jump_pressed = 0;
|
|
|
|
}
|
|
|
|
if (*jump_buffer) *jump_buffer -= 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
char sgn(int number)
|
|
|
|
{
|
|
|
|
if (number < 0) return -1;
|
|
|
|
else return 1;
|
2020-02-11 11:44:37 +01:00
|
|
|
}
|