From a4490bc82780d99b425bea162eb204ca7cad1b8e Mon Sep 17 00:00:00 2001 From: lustlion Date: Tue, 22 Feb 2022 01:14:38 +0100 Subject: [PATCH] fixed arrow physics --- code/canvas.lua | 49 +++++++++++++++++++++++++++ code/canvasses/darkness.lua | 15 +++++++++ code/darkness.lua | 44 ------------------------- code/entities/arrow.lua | 66 +++++++++++++------------------------ code/entities/kupo.lua | 11 ++----- code/entities/player.lua | 5 --- code/entity.lua | 31 ++++++++++++++--- code/gameworld.lua | 9 ++--- code/require.lua | 2 +- main.lua | 6 ++-- 10 files changed, 123 insertions(+), 115 deletions(-) create mode 100644 code/canvas.lua create mode 100644 code/canvasses/darkness.lua delete mode 100644 code/darkness.lua diff --git a/code/canvas.lua b/code/canvas.lua new file mode 100644 index 0000000..d42df47 --- /dev/null +++ b/code/canvas.lua @@ -0,0 +1,49 @@ +Canvas = {class = "Canvas"} + +function Canvas:New(name) + local o = {} + o.name = name + o.width = game.width/game.scale + o.height = game.height/game.scale + o.canvas = love.graphics.newCanvas(o.width,o.height) + + setmetatable(o, self) + self.__index = self + Canvas[name] = o +end + +function Canvas:Recreate() + self.canvas:release() + self = Canvas:New(self.name) +end + +function Canvas:Reset() + love.graphics.setCanvas(Canvas[self.name].canvas) + love.graphics.setBlendMode("replace") + love.graphics.setColor(0,0,0,0) + love.graphics.rectangle( + "fill", + 0, + 0, + self.width, + self.height + ) + love.graphics.setCanvas() +end + +function Canvas:DrawingStart() + self:Reset() + love.graphics.setCanvas(Canvas[self.name].canvas) +end + +function Canvas:DrawingEnd() + love.graphics.setCanvas() + love.graphics.setBlendMode("alpha") + love.graphics.setColor(1,1,1,1) +end + +function Canvas:Draw() + love.graphics.draw(self.canvas) +end + +require "code/canvasses/darkness" diff --git a/code/canvasses/darkness.lua b/code/canvasses/darkness.lua new file mode 100644 index 0000000..f28652c --- /dev/null +++ b/code/canvasses/darkness.lua @@ -0,0 +1,15 @@ +Canvas:New("Darkness") + +function Canvas.Darkness:Reset() + love.graphics.setCanvas(Canvas.Darkness.canvas) + love.graphics.setBlendMode("replace") + love.graphics.setColor(0,0,0,0.95) + love.graphics.rectangle( + "fill", + 0, + 0, + self.width, + self.height + ) + love.graphics.setCanvas() +end diff --git a/code/darkness.lua b/code/darkness.lua deleted file mode 100644 index d40f580..0000000 --- a/code/darkness.lua +++ /dev/null @@ -1,44 +0,0 @@ -Darkness = {} -Canvas = {} - -function Darkness.Create() - Darkness.width = game.width/game.scale - Darkness.height = game.height/game.scale - Canvas.Darkness = love.graphics.newCanvas( - Darkness.width, - Darkness.height - ) -end - -function Darkness.Recreate() - Canvas.Darkness:release() - Darkness.Create() -end - -function Darkness.Reset() - love.graphics.setCanvas(Canvas.Darkness) - love.graphics.setBlendMode("replace") - love.graphics.setColor(0,0,0,0.95) - love.graphics.rectangle( - "fill", - 0, - 0, - Darkness.width, - Darkness.height - ) - love.graphics.setCanvas() -end - -function Darkness.DrawStart() - Darkness.Reset() - love.graphics.setCanvas(Canvas.Darkness) -end - -function Darkness.DrawEnd() - love.graphics.setCanvas() - love.graphics.setBlendMode("alpha") - love.graphics.setColor(1,1,1,1) - love.graphics.draw(Canvas.Darkness) -end - -Darkness.Create() diff --git a/code/entities/arrow.lua b/code/entities/arrow.lua index 66d1243..aa81568 100644 --- a/code/entities/arrow.lua +++ b/code/entities/arrow.lua @@ -6,7 +6,7 @@ Arrow = Entity:New(x,y) o.type = "arrow" o.pos = {x = x, y = y} - o.speed = speed or 0 + o.speed = speed or 10 o.sprite_rotation = rotation or 0 o.vel = { x = o.speed * math.cos(o.sprite_rotation), @@ -19,6 +19,11 @@ Arrow = Entity:New(x,y) -- animations o.body = Animation:New(animation.kupo.arrow) + o.boxCollision = { + from = {x = -0.5, y = -0.5}, --gameworld pixels + to = {x = 0.5, y = 0.5} -- gameworld pixels + } + table.insert(LoadedObjects.Entities,o) o.id = #LoadedObjects.Entities @@ -27,52 +32,25 @@ Arrow = Entity:New(x,y) return o end -function Arrow:HandleAnimation() +function Arrow:DrawBackground() self:Draw(self.body) end function Arrow:DoPhysics() - if not self.stuck then - -- horizontal collisions - if not isThereAnyCollisionAt( - self.pos.x + self.vel.x, - self.pos.y - ) then - self.pos.x = self.pos.x + self.vel.x - else - while not isThereObjectAt( - self.pos.x + math.sign(self.vel.x), - self.pos.y, - LoadedObjects.Collisions - ) do - self.pos.x = self.pos.x + math.sign(self.vel.x) - end - self.stuck = true - end - -- vertical collision - if not isThereAnyCollisionAt( - self.pos.x, - self.pos.y + self.vel.y - ) then - self.pos.y = self.pos.y + self.vel.y - else - while not isThereObjectAt( - self.pos.x, - self.pos.y + math.sign(self.vel.y), - LoadedObjects.Collisions - ) do - self.pos.y = self.pos.y + math.sign(self.vel.y) - end - self.stuck = true - end - -- stuck into collisions - if self.stuck then - --lets allow the arrow to tip a bit into the thing - self.pos.x = self.pos.x + self.vel.x / 5 - self.pos.y = self.pos.y + self.vel.y / 5 - self.vel.x = 0 - self.vel.y = 0 - self.illuminated = false - end + if not self:isCollidingAt(self.pos.x + self.vel.x, self.pos.y, LoadedObjects.Collisions) then + self.pos.x = self.pos.x + self.vel.x + else + self.stuck = true + end + if not self:isCollidingAt(self.pos.x, self.pos.y + self.vel.y, LoadedObjects.Collisions) then + self.pos.y = self.pos.y + self.vel.y + else + self.stuck = true + end + if self.stuck then + self.pos.x = self.pos.x + self.vel.x * (2/3) + self.pos.y = self.pos.y + self.vel.y * (2/3) + self.vel.x = 0 + self.vel.y = 0 end end diff --git a/code/entities/kupo.lua b/code/entities/kupo.lua index f087b88..ae46024 100644 --- a/code/entities/kupo.lua +++ b/code/entities/kupo.lua @@ -89,7 +89,7 @@ function Kupo:Smart() if self.bow_aim_frame > self.bow_aim_frames then self.bow_aim_frame = self.bow_aim_frame - self.bow_aim_frames self.bow_frame = self.bow_frame + 1 - Arrow:New(self.pos.x,self.pos.y,self.bow_rotation,15) + Arrow:New(self.pos.x,self.pos.y,self.bow_rotation,10) end else self.bow_frame = self.bow_frame + 1 @@ -157,12 +157,5 @@ function Kupo:HandleAnimation() end function Kupo:DoPhysics() - - -- horizontal collisions - if not isThereAnyCollisionAt(self.pos.x + self.vel.x, self.pos.y) then - self.pos.x = self.pos.x + self.vel.x - end - if not isThereAnyCollisionAt(self.pos.x, self.pos.y + self.vel.y) then - self.pos.y = self.pos.y + self.vel.y - end + self:CollisionMove() end diff --git a/code/entities/player.lua b/code/entities/player.lua index b1202eb..1059698 100644 --- a/code/entities/player.lua +++ b/code/entities/player.lua @@ -35,11 +35,6 @@ y = nil } - o.boxCollision = { - from = {x = -8, y = -16}, --gameworld pixels - to = {x = 8, y = 0} -- gameworld pixels - } - o.lightRange = 40 -- screen pixels -- status diff --git a/code/entity.lua b/code/entity.lua index 5048e5c..e1b90cf 100644 --- a/code/entity.lua +++ b/code/entity.lua @@ -59,16 +59,37 @@ function Entity:Move() end function Entity:CollisionMove() + local r = false if not self:isCollidingAt(self.pos.x + self.vel.x, self.pos.y, LoadedObjects.Collisions) then self.pos.x = self.pos.x + self.vel.x else self.vel.x = 0 + r = true end if not self:isCollidingAt(self.pos.x, self.pos.y + self.vel.y, LoadedObjects.Collisions) then self.pos.y = self.pos.y + self.vel.y else self.vel.y = 0 + r = true end + return r +end + +function Entity:MoveX() + local r = false + if not self:isCollidingAt(self.pos.x + self.vel.x, self.pos.y, LoadedObjects.Collisions) then + self.pos.x = self.pos.x + self.vel.x + else + self.vel.x = 0 + r = true + end + if not self:isCollidingAt(self.pos.x, self.pos.y + self.vel.y, LoadedObjects.Collisions) then + self.pos.y = self.pos.y + self.vel.y + else + self.vel.y = 0 + r = true + end + return r end function Entity:LightAdjust(x,y) @@ -181,13 +202,13 @@ end function Entity:isCollidingAtAll(x,y) local result = false if not result then - result = self:isCollidingAt(x,y,objects.collisions) + result = self:isCollidingAt(x,y,LoadedObjects.Platforms) end if not result then - result = self:isCollidingAt(x,y,objects.ladders) + result = self:isCollidingAt(x,y,LoadedObjects.Platforms) end if not result then - result = self:isCollidingAt(x,y,objects.platforms) + result = self:isCollidingAt(x,y,LoadedObjects.Platforms) end return result end @@ -250,8 +271,10 @@ function Entity:Debug() end end -function Entity:DrawBackground() +function Entity:HandleAnimation() +end +function Entity:DrawBackground() end require "code/entities/kupo" diff --git a/code/gameworld.lua b/code/gameworld.lua index 9714114..e8f0f10 100644 --- a/code/gameworld.lua +++ b/code/gameworld.lua @@ -2,7 +2,7 @@ function GameworldDrawPrepare() if game_resize then Camera.height = game.height Camera.width = game.width - Darkness.Recreate() + Canvas.Darkness.Recreate() end pcr, pcg, pcb, pca = love.graphics.getColor() love.graphics.scale(game.scale,game.scale) @@ -74,8 +74,8 @@ function GameworldDrawForeground() end function GameworldDrawDarkness() - Darkness.Reset() - Darkness.DrawStart() + Canvas.Darkness:Reset() + Canvas.Darkness:DrawingStart() love.graphics.setBlendMode("replace") love.graphics.setColor(0,0,0,0) for _, light in pairs(LoadedObjects.Lights) do @@ -93,7 +93,8 @@ function GameworldDrawDarkness() ) end end - Darkness.DrawEnd() + Canvas.Darkness:DrawingEnd() + Canvas.Darkness:Draw() end function GameworldDrawLights() diff --git a/code/require.lua b/code/require.lua index 25e33c5..54282e0 100644 --- a/code/require.lua +++ b/code/require.lua @@ -20,11 +20,11 @@ require "code/audio" -- objects require "code/entity" +require "code/canvas" require "code/collision" require "code/lights" -- functions -require "code/darkness" require "code/debug" require "code/demo" require "code/keybind" diff --git a/main.lua b/main.lua index c8ab5f2..11c24a9 100644 --- a/main.lua +++ b/main.lua @@ -29,8 +29,6 @@ function love.load() logPrint(loveInitLog) loveInitLog = nil - Canvas = {} - Darkness.Create() Camera.width = game.width Camera.height = game.height @@ -52,8 +50,8 @@ function love.load() main_Player = Player:New(75,50) - --Kupo:New(100,150) - --Kupo:New(300,150) + Kupo:New(100,150) + Kupo:New(300,150) HookAnchor:New(200,89) HookAnchor:New(400,89) Fairy:New(200,88)