#include #include "draw.h" #include "collide.h" #include "levels.h" void jump_test(char *jump_pressed, char *jump_buffer); //test if jump pressed char sgn(int number); //return the sign of input double int main(void) { char level[14*25]; unsigned char level_id = 0; char jump_pressed = 0; //avoid holding jump char jump_buffer = 0; //jump buffer, last 3 frames double vspd = 0; //player vertical speed char hspd = 0; //player horizontal speed char on_ground = 6; //remember if player is on solid int player_x = 0; int player_y = 0; int old_x, old_y; const double jump_spd = -4; //default jump speed const double grav = 0.2; const double min_vspd = -8; dclear(0); //0 -> black set_level(level_id, level); draw_level(level, &player_x, &player_y); old_x = player_x + 1; //offset to draw it on first cycle old_y = player_y; while (1) { 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++; if (!collide(player_x + hspd, player_y, level, '0')) { player_x += hspd; } //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--; } //vertical movement jump_test(&jump_pressed, &jump_buffer); //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; } } void jump_test(char *jump_pressed, char *jump_buffer) { if (keydown(KEY_SHIFT)) { if (!*jump_pressed) { *jump_pressed = 1; *jump_buffer = 3; } } else { *jump_pressed = 0; } if (*jump_buffer) *jump_buffer -= 1; } char sgn(int number) { if (number < 0) return -1; else return 1; }