Page 2 of 3
Re: Canvas + camera shake
Posted: Wed Feb 27, 2019 6:31 pm
by MMR4tzvp
ChicoGameDev wrote: ↑Wed Feb 27, 2019 5:49 pm
Hi,
Press space to shake the place
Sorry didn't precise that... My bad.
Thanks for trying at least.
Regards
I did press space to shake it haha. Sorry for not mentioning that too. But when it shakes, I don't see any issues like in the gif.
Re: Canvas + camera shake
Posted: Wed Feb 27, 2019 6:42 pm
by ChicoGameDev
grump wrote: ↑Wed Feb 27, 2019 6:30 pm
You need to add the (half) offset to all light coordinates.
Ah so you are totally aware of that haha.
Alright I'll implement and see if it will be enough.
MMR4tzvp wrote: ↑Wed Feb 27, 2019 6:31 pm
I did press space to shake it haha. Sorry for not mentioning that too. But when it shakes, I don't see any issues like in the gif.
Whooops how is that possible ? Check the Luven version at the top of the file is that really Luven v1.025 exp. ?
Regards
Re: Canvas + camera shake
Posted: Wed Feb 27, 2019 6:48 pm
by grump
ChicoGameDev wrote: ↑Wed Feb 27, 2019 6:42 pm
grump wrote: ↑Wed Feb 27, 2019 6:30 pm
You need to add the (half) offset to all light coordinates.
Ah so you are totally aware of that haha.
I mean it's pretty straightforward - if the lightmap is translated by -offset/2, all its contents will shift by that amount, so you have to compensate for that
Re: Canvas + camera shake
Posted: Wed Feb 27, 2019 6:56 pm
by ChicoGameDev
grump wrote: ↑Wed Feb 27, 2019 6:48 pm
I mean it's pretty straightforward - if the lightmap is translated by -offset/2, all its contents will shift by that amount, so you have to compensate for that
Yes, now that you say it I feel stupid ... But you know it feels kind of "not nice" x)
That's why I thought it was not a good solution.
Regards
Re: Canvas + camera shake
Posted: Wed Feb 27, 2019 7:05 pm
by grump
To come to think of it - you don't need the offscreen space. Why don't you just wiggle the camera position around in each update when it shakes? It doesn't really need to be a special case.
Re: Canvas + camera shake
Posted: Wed Feb 27, 2019 7:15 pm
by ChicoGameDev
grump wrote: ↑Wed Feb 27, 2019 7:05 pm
To come to think of it - you don't need the offscreen space. Why don't you just wiggle the camera position around in each update when it shakes? It doesn't really need to be a special case.
What you saying intrigues me ! But I cannot understand what you mean. Or do you mean :
put the
in the update and not the draw ?
If it will do what I think it will do this gonna be mind blowing !!!
Regards
Re: Canvas + camera shake
Posted: Wed Feb 27, 2019 7:20 pm
by grump
I'm too lazy to read your code right now. What I mean is, you somewhere have something like
before you draw the graphics. Maybe it's more complicated if you do culling.
Make that
Code: Select all
lg.translate(camera.x + shakeX, camera.y + shakeY)
and animate the shake amount (in draw or update, doesn't matter, just do it before you decide what to draw)
Code: Select all
shakeX = shaking and love.math.random(-maxShake, maxShake) or 0
shakeY = shaking and love.math.random(-maxShake, maxShake) or 0
Edit to clarify this: you just need to take the shake amount into account when determining what to draw and where.
Re: Canvas + camera shake
Posted: Wed Feb 27, 2019 8:13 pm
by ChicoGameDev
No problem,
I thank you already to give some time.
I'm not 100% sure I've understand what you mean. But maybe take a quick look when you have the will and motivation, and see if it's not what I'm already doing.
For the moment the bigger canvas solution is working wonderfully well !
Thanks.
Regards
Re: Canvas + camera shake
Posted: Wed Feb 27, 2019 8:54 pm
by grump
Okay, that was a shitty explanation.
You want the background and the lights to shake, but not the lightmap, because then it doesn't cover the whole screen anymore. Instead of using a larger lightmap (which I think is a perfectly fine solution to the problem as long as the shake magnitude doesn't become too large), you could just add the shake amount to the light coordinates when you draw them. Do not offset them by half the maximum shake offset, but rather by the shake value for the current frame. The light positions will then be shaking along with the background, and the lightmap remains stationary.
That's a slightly more efficient solution, because the lightmap is smaller and you don't have to render lights that are outside the normally visible area.
Re: Canvas + camera shake
Posted: Thu Feb 28, 2019 12:20 am
by pgimeno
Well, the real problem is using love.graphics.translate to shake.
The shake should really be in camera:set(). That will update the transform passed to the shader and not just the LÖVE transform.
EDIT: Patch against 1.025 exp.:
Code: Select all
diff --git a/luven/luven.lua b/luven/luven.lua
index b36409c..dba6803 100644
--- a/luven/luven.lua
+++ b/luven/luven.lua
@@ -80,14 +80,6 @@ local function cameraUpdate(dt)
end -- if
end -- function
-local function cameraDraw()
- if (luven.camera.shakeDuration > 0) then
- local dx = love.math.random(-luven.camera.shakeMagnitude, luven.camera.shakeMagnitude)
- local dy = love.math.random(-luven.camera.shakeMagnitude, luven.camera.shakeMagnitude)
- love.graphics.translate(dx, dy)
- end -- if
-end -- function
-
local function cameraGetViewMatrix()
return luven.camera.transform:getMatrix()
end -- function
@@ -106,8 +98,13 @@ function luven.camera:init(x, y)
end -- function
function luven.camera:set()
+ local dx, dy = 0, 0
+ if (luven.camera.shakeDuration > 0) then
+ dx = love.math.random(-luven.camera.shakeMagnitude, luven.camera.shakeMagnitude)
+ dy = love.math.random(-luven.camera.shakeMagnitude, luven.camera.shakeMagnitude)
+ end
love.graphics.push()
- self.transform:setTransformation(love.graphics.getWidth() / 2, love.graphics.getHeight() / 2, self.rotation, self.scaleX, self.scaleY, self.x, self.y)
+ self.transform:setTransformation(love.graphics.getWidth() / 2, love.graphics.getHeight() / 2, self.rotation, self.scaleX, self.scaleY, self.x + dx, self.y + dy)
love.graphics.applyTransform(self.transform)
end -- function
@@ -341,7 +338,6 @@ end -- function
function luven.drawBegin()
if (useIntegratedCamera) then
- cameraDraw()
luven.camera:set()
end -- if
Edit2: Oops, I see you've dropped the shader. Still, the code was doing the shake outside of love.graphics.push(), which caused the issue, so the above patch fixes it.