summaryrefslogtreecommitdiff
path: root/src/player.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/player.c')
-rw-r--r--src/player.c59
1 files changed, 46 insertions, 13 deletions
diff --git a/src/player.c b/src/player.c
index 20aa62a..05d3546 100644
--- a/src/player.c
+++ b/src/player.c
@@ -11,9 +11,6 @@
extern Game game;
static void AddPlayerSprites(Entity* player);
-static inline Sprite* GetBodySprite(Entity* player) {
- return &player->sprites[player->bodySpriteIndex];
-}
typedef enum PlayerStates {
PLAYER_IDLE = 0,
@@ -43,12 +40,11 @@ Vector2 GetMovementDirection() {
}
void CameraFollow(const Entity* player) {
- game.camera.target =
- (Vector2) {fmaxf(WINDOW_WIDTH / 2.0f, player->position.x), 0.0f};
+ game.camera.target.x = fmaxf(WINDOW_WIDTH / 2.0f, player->position.x);
}
void UpdateBodyFacing(Entity* player) {
- Sprite* bodySprite = GetBodySprite(player);
+ Sprite* bodySprite = &player->sprites[player->bodySpriteIndex];
if (player->velocity.x < 0)
bodySprite->flipX = true;
@@ -56,27 +52,62 @@ void UpdateBodyFacing(Entity* player) {
bodySprite->flipX = false;
}
+bool CanAttack(Entity* player) {
+ return player->state == PLAYER_IDLE
+ || player->state == PLAYER_WALKING;
+}
+
+bool CanMove(Entity* player) {
+ return player->state == PLAYER_IDLE
+ || player->state == PLAYER_WALKING;
+}
+
void HandleMovement(Entity* player) {
- Sprite* bodySprite = GetBodySprite(player);
+ if (CanMove(player)) {
+ if (Vector2Length(player->velocity) > 0.0)
+ player->state = PLAYER_WALKING;
+ else
+ player->state = PLAYER_IDLE;
+ } else {
+ player->velocity = (Vector2) {0.0f, 0.0f};
+ }
+}
- if (Vector2Length(player->velocity) > 0.0)
- bodySprite->currentAnimation = PLAYER_WALKING;
- else
- bodySprite->currentAnimation = PLAYER_IDLE;
+void HandleAttack(Entity* player) {
+ if (player->state != PLAYER_ATTACK) {
+ player->numHitBoxes = 0;
+ return;
+ }
+
+ Sprite* bodySprite = &player->sprites[player->bodySpriteIndex];
+
+ if (bodySprite->animations[PLAYER_ATTACK].isComplete) {
+ player->state = PLAYER_IDLE;
+ ResetAnimation(&bodySprite->animations[PLAYER_ATTACK]);
+ }
}
void HandleInput(Entity* player) {
player->velocity =
Vector2Scale(GetMovementDirection(), PLAYER_SPEED);
+
+ if (IsKeyPressed(KEY_O) && CanAttack(player))
+ player->state = PLAYER_ATTACK;
+}
+
+void HandleAnimation(Entity* player) {
+ Sprite* bodySprite = &player->sprites[player->bodySpriteIndex];
+
+ bodySprite->currentAnimation = player->state;
}
void UpdateAnimation(Entity* player, float deltaTime) {
- Sprite* bodySprite = GetBodySprite(player);
+ Sprite* bodySprite = &player->sprites[player->bodySpriteIndex];
UpdateCurrentSpriteAnimation(bodySprite, deltaTime);
}
void FlipBody(Entity* player) {
- Sprite* bodySprite = GetBodySprite(player);
+ Sprite* bodySprite = &player->sprites[player->bodySpriteIndex];
if (player->velocity.x < 0) {
bodySprite->flipX = true;
@@ -90,7 +121,9 @@ void UpdatePlayer(Entity* player, float deltaTime) {
HandleMovement(player);
FlipBody(player);
MoveAndStop(player, deltaTime);
+ HandleAnimation(player);
UpdateAnimation(player, deltaTime);
+ HandleAttack(player);
CameraFollow(player);
}