#include "player.h" #include "conf.h" #include "draw.h" #include "input.h" #include "level.h" #include "tools.h" static int k_up, k_down, k_left, k_right, k_jump; static struct Player player; static void player_get_input(void); static void player_move(struct Vec2 mov); static int player_collide_pixel(int x, int y, tile_t id); static int player_collide(struct Vec2 pos, tile_t id, int h); void player_init(void) { player.pos = (struct Vec2){160, 100}; player.spd = (struct FVec2){0.0f, 0.0f}; } void player_update(void) { player_get_input(); const struct Vec2 mov = (struct Vec2){k_right - k_left, k_down - k_up}; player_move(mov); } void player_draw(void) { draw_rectangle(player.pos.x, player.pos.y, PLAYER_S, PLAYER_S, C_BLACK); dprint(10, 10, C_BLACK, "%d", player_collide(player.pos, 1, 0)); } static void player_get_input(void) { k_up = input_down(K_UP); k_down = input_down(K_DOWN); k_left = input_down(K_LEFT); k_right = input_down(K_RIGHT); k_jump = input_pressed(K_A); } static void player_move(struct Vec2 mov) { if (player_collide(player.pos, 1, 0)) { return; } player.spd.x *= (1 - PLAYER_FRIC); player.spd.x += mov.x * PLAYER_ACC; player.spd.y *= (1 - PLAYER_FRIC); player.spd.y += mov.y * PLAYER_ACC; if (!player.spd.x && !player.spd.y) { return; } const int sign_x = sign(player.spd.x); const int Ispd_x = player.spd.x; player.pos.x += Ispd_x; if (player_collide(player.pos, 1, 0)) { player.spd.x = 0.0f; while (player_collide(player.pos, 1, 0)) { player.pos.x -= sign_x; } } const int sign_y = sign(player.spd.y); const int Ispd_y = player.spd.y; player.pos.y += Ispd_y; if (player_collide(player.pos, 1, 0)) { player.spd.y = 0.0f; while (player_collide(player.pos, 1, 0)) { player.pos.y -= sign_y; } } } static int player_collide_pixel(int x, int y, tile_t id) { const tile_t tile = level_get_px(x, y); if (!tile) { return 0; } if (id == 1) { return (tile - 1) % TILESET_W < 8; } return tile == id; } static int player_collide(struct Vec2 pos, tile_t id, int h) { const struct Vec2 pos_tl = (struct Vec2){pos.x + h, pos.y + h}; const struct Vec2 pos_br = (struct Vec2){pos.x + PLAYER_S - h - 1, pos.y + PLAYER_S - h - 1}; const struct Vec2 middle = (struct Vec2){pos.x + PLAYER_S / 2, pos.y + PLAYER_S / 2}; if (player_collide_pixel(pos_tl.x, pos_tl.y, id) || player_collide_pixel(pos_br.x, pos_br.y, id) || player_collide_pixel(pos_tl.x, pos_br.y, id) || player_collide_pixel(pos_br.x, pos_tl.y, id) || player_collide_pixel(middle.x, pos_tl.y, id) || player_collide_pixel(middle.x, pos_br.y, id) || player_collide_pixel(pos_tl.x, middle.y, id) || player_collide_pixel(pos_br.x, middle.y, id)) { return 1; } return 0; }