diff --git a/core/src/physics_entity.c b/core/src/physics_entity.c index 5b7b45d..4d2f5bb 100644 --- a/core/src/physics_entity.c +++ b/core/src/physics_entity.c @@ -18,11 +18,11 @@ void physics_entity_debug_draw(PhysicsEntity self) { lhs = camera_world_to_pixel_point(&g_camera, lhs); rhs = camera_world_to_pixel_point(&g_camera, rhs); SDL_SetRenderDrawColor(g_renderer, 0, 255, 0, 255); - SDL_RenderDrawLine(g_renderer, lhs.x, lhs.y, rhs.x, rhs.y); + SDL_RenderDrawLineF(g_renderer, lhs.x, lhs.y, rhs.x, rhs.y); rhs = camera_world_to_pixel_point(&g_camera, vaddf(transform->position, rigidbody_get_force(body))); SDL_SetRenderDrawColor(g_renderer, 0, 255, 255, 255); - SDL_RenderDrawLine(g_renderer, lhs.x, lhs.y, rhs.x, rhs.y); + SDL_RenderDrawLineF(g_renderer, lhs.x, lhs.y, rhs.x, rhs.y); } static inline Vector _internal_calculate_contact_force(RigidBody* self, Contact* contact) { diff --git a/game/src/player.c b/game/src/player.c index 029dd97..e131970 100644 --- a/game/src/player.c +++ b/game/src/player.c @@ -2,6 +2,23 @@ #include "debug.h" #include "game_world.h" +static inline +void InternalPlayerInitInput(Player* self) { + // HORIZONTAL + playerinput_add(self->input, CompositeAxis1D_as_InputAxis(compositeaxis1d_new( + KeyBind_as_InputAxis(keybind_new(SDL_SCANCODE_A)), + KeyBind_as_InputAxis(keybind_new(SDL_SCANCODE_D)), + InputEvent_Float + )), (InputDelegateFn)PlayerInputHorizontal); + + // VERTICAL + playerinput_add(self->input, CompositeAxis1D_as_InputAxis(compositeaxis1d_new( + KeyBind_as_InputAxis(keybind_new(SDL_SCANCODE_S)), + KeyBind_as_InputAxis(keybind_new(SDL_SCANCODE_W)), + InputEvent_Float + )), (InputDelegateFn)PlayerInputVertical); +} + Player* MakePlayer() { Player* self = malloc(sizeof(Player)); ASSERT_RETURN(self != NULL, NULL, "Could not allocate enough space for Player instance"); @@ -11,14 +28,21 @@ Player* MakePlayer() { *self = (Player){ .transform = IdentityTransform, + + .input = playerinput_new(self, -1), + .input_direction = ZeroVector, + .faceDirection = 0, + .animationStateMachine = state_machine_init(self, PlayerIdle()), .animFrame = 0, - .sprite = sprite_from_spritesheet(walk, 0), + .animFrameInterval = 1.0f / 4.0f, + .animFrameTimer = 0.0f, + .stand = idle, .walk = walk, - .animFrameInterval = 1.0f/4.0f, - .animFrameTimer = 0.0f, + + .sprite = sprite_from_spritesheet(walk, 0), }; return self; @@ -51,6 +75,10 @@ void PlayerDraw(Player* self) { sprite_entity_draw(Player_as_SpriteEntity(self)); } +void PlayerInputHorizontal(Player* self, InputEvent event) {} + +void PlayerInputVertical(Player* self, InputEvent event) {} + Sprite* PlayerGetSprite(Player* self) { return self->sprite; } @@ -64,7 +92,8 @@ const State* PlayerAnimationUpdate(Player* self, float deltaTime) { if (self->animFrameTimer > self->animFrameInterval) { self->animFrameTimer = 0.f; - size_t nextFrame = self->animFrame + 8; + ++self->animFrame; + size_t nextFrame = self->animFrame * 8 + self->faceDirection; sprite_set_tile(self->sprite, nextFrame); if (nextFrame > spritesheet_get_tile_count(sprite_get_spritesheet(self->sprite))) { diff --git a/game/src/player.h b/game/src/player.h index 23c5531..03d3bf5 100644 --- a/game/src/player.h +++ b/game/src/player.h @@ -8,10 +8,14 @@ #include "behaviour_entity.h" #include "state_machine.h" #include "transformable.h" +#include "player_input.h" typedef struct Player { Transform transform; - + + PlayerInput* input; + Vector input_direction; + unsigned short faceDirection; StateMachine* animationStateMachine; @@ -33,6 +37,9 @@ extern void PlayerStart(Player* self); extern void PlayerDestroy(Player* self); extern void PlayerDraw(Player* self); +extern void PlayerInputHorizontal(Player* self, InputEvent event); +extern void PlayerInputVertical(Player* self, InputEvent event); + extern Sprite* PlayerGetSprite(Player* self); extern Transform* PlayerGetTransform(Player* self);