#include "../include/player.h" #include "../include/animated_texture.h" #include "../include/config.h" #include "../include/player_state/default.h" #include "../include/raylib.h" #include "../include/raymath.h" #include #include #define PLAYER_FRICTION 0.69f Player *player_create(float x, float y) { Player *player = (Player *)malloc(sizeof(Player)); player->textures[PLAYER_TEXTURE_FALLING] = animated_texture_create("assets/textures/player/falling.png", 4, 0.3f); player->textures[PLAYER_TEXTURE_FORWARD] = animated_texture_create( "assets/textures/player/stand-forward.png", 1, 0.0f ); player->textures[PLAYER_TEXTURE_WALK_FORWARD] = animated_texture_create( "assets/textures/player/walk-forward.png", 2, 0.3f ); player->textures[PLAYER_TEXTURE_WALK_BACKWARD] = animated_texture_create( "assets/textures/player/walk-backward.png", 2, 0.3f ); player->textures[PLAYER_TEXTURE_WALK_LEFT] = animated_texture_create("assets/textures/player/walk-left.png", 2, 0.3f); player->textures[PLAYER_TEXTURE_WALK_RIGHT] = animated_texture_create("assets/textures/player/walk-right.png", 2, 0.3f); for (int i = 0; i < _PLAYER_TEXTURE_LENGTH; i++) { if (player->textures[i].texture.id == 0) { perror("Failed to load player sprites!\n"); free(player); CloseWindow(); return NULL; } } player->camera = (Camera2D){ 0 }; player->camera.zoom = 4.0f; player->camera.offset = (Vector2){ WINDOW_WIDTH / 2.0f, WINDOW_HEIGHT / 2.0f }; player_state_transition_to_default(&player->state, player); player->position.x = x; player->position.y = y; player->velocity = Vector2Zero(); player->control = Vector2Zero(); player->speed = 12.0f; player->friction = 0.69f; return player; } int player_destroy(Player *player) { for (int i = 0; i < _PLAYER_TEXTURE_LENGTH; i++) { animated_texture_delete(player->textures[i]); } free(player); return EXIT_SUCCESS; } Vector2 player_center(Player *player) { return (Vector2){ player->position.x + 8, player->position.y + 8 }; } void player_draw(Player *player) { DrawRectangleV(player->position, (Vector2){ 16, 16 }, player->color); DrawText(player->state.name, 0, 0, 20, BLACK); animated_texture_draw(&player->texture, player->position, WHITE); Vector2 center = player_center(player); Vector2 velocity_from_position = { center.x + player->velocity.x, center.y + player->velocity.y }; DrawLineEx(center, velocity_from_position, 1.0f, GREEN); } void player_update(Player *player) { if (player->state.update) { player->state.update(&player->state, player); } player->camera.target = player_center(player); }