diff options
| author | Eltrac <hi@guhub.cn> | 2025-03-14 16:02:40 +0800 |
|---|---|---|
| committer | Eltrac <hi@guhub.cn> | 2025-03-14 16:02:40 +0800 |
| commit | 3dab7a77c5799682bdf0517771a45ffd7a4f33ad (patch) | |
| tree | 39414573f4f4ec863d144eead1a48532a1eab891 /objects | |
| parent | 85bb75d557a815fb28da8c8478f32adcea1f41ef (diff) | |
feat: player gets knocked back getting hit by enemy
Diffstat (limited to 'objects')
| -rw-r--r-- | objects/Player.lua | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/objects/Player.lua b/objects/Player.lua index 09f3a58..d515a5f 100644 --- a/objects/Player.lua +++ b/objects/Player.lua @@ -40,7 +40,7 @@ function Player:setY(y) end function Player:move(v) - if self.dashing and self.dashing >= G.time then return end + if self.knocked and self.knocked >= G.time then return end self.moving = (v.x ~= 0 or v.y ~= 0) self.physicsBody:setLinearVelocity(v.x, v.y) end @@ -148,6 +148,15 @@ function Player:onContact(other, contact) if not (other.stunned or self:isShielded()) then audio.play("getsHit") table.remove(self.hearts) + -- knock back Player + local ex, ey = other.x, other.y + local dx, dy = self.x - ex, self.y - ey + local distance = math.sqrt(dx * dx + dy * dy) + local normEdx, normEdy = dx / distance, dy / distance + local knockbackX, knockbackY = normEdx * config.player.knockback.force, + normEdy * config.player.knockback.force + self.knocked = G.time + config.player.knockback.duration + self.physicsBody:applyLinearImpulse(knockbackX, knockbackY) -- shield this player self.shieldedTill = G.time + config.playerShieldTime end |
