Skip to content

Instantly share code, notes, and snippets.

@lemilonkh
Created May 30, 2018 12:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lemilonkh/262e0bc2a73406bcab3da4b11a43b0c2 to your computer and use it in GitHub Desktop.
Save lemilonkh/262e0bc2a73406bcab3da4b11a43b0c2 to your computer and use it in GitHub Desktop.
Milan's magic shaky cam
local camera = {x = 0, y = 0, scaleX = 1, scaleY = 1, rotation = 0, trauma = 0}
local util = require "src.util"
local settings = require "src.settings"
function camera:set()
local shakeOffsetX, shakeOffsetY, shakeAngle = self:getScreenShake()
love.graphics.push()
love.graphics.rotate(self.rotation + shakeAngle)
love.graphics.scale(self.scaleX, self.scaleY)
love.graphics.translate(self.x + shakeOffsetX, self.y + shakeOffsetY)
end
function camera:getCenter()
local centerX = self.x -- + math.floor(love.graphics.getWidth() / self.scaleX * 2)
local centerY = self.y -- + math.floor(love.graphics.getHeight() / self.scaleY * 2)
return centerX, centerY
end
function camera:getValues()
local shakeOffsetX, shakeOffsetY, shakeAngle = self:getScreenShake()
return self.x + shakeOffsetX, self.y + shakeOffsetY, self.scaleX, self.scaleY, self.rotation + shakeAngle
end
function camera:getScreenShake()
local screenShake = self.trauma ^ 2
local shakeAngle = settings.screenShakeAngle * screenShake * util.timeNoise(-1, 1, 1)
local shakeOffsetX = settings.screenShakeOffset * screenShake * util.timeNoise(-1, 1, 2.5)
local shakeOffsetY = settings.screenShakeOffset * screenShake * util.timeNoise(-1, 1, 3.1)
return shakeOffsetX, shakeOffsetY, shakeAngle
end
function camera:addTrauma(trauma)
self.trauma = math.min(self.trauma + trauma, 1.0)
end
function camera:unset()
love.graphics.pop()
end
function camera:update(dt)
self.trauma = math.max(self.trauma - settings.traumaDecay * dt, 0.0)
end
function camera:move(dx, dy)
self.x = self.x + (dx or 0)
self.y = self.y + (dy or 0)
end
function camera:rotate(dr)
self.rotation = self.rotation + dr
end
function camera:scale(sx, sy)
sx = sx or 1
self.scaleX = self.scaleX * sx
self.scaleY = self.scaleY * (sy or sx)
end
function camera:setPosition(x, y)
self.x = x or self.x
self.y = y or self.y
end
function camera:moveTowards(x, y)
self.x = self.x + (x - self.x) * settings.cameraSmoothing
self.y = self.y + (y - self.y) * settings.cameraSmoothing
end
function camera:setCenterPosition(x, y)
self.x = x - love.graphics.getWidth() * self.scaleX / 2
self.y = y - love.graphics.getHeight() * self.scaleY / 2
end
function camera:setScale(sx, sy)
self.scaleX = sx or self.scaleX
self.scaleY = sy or self.scaleY
end
function camera:mousePosition()
-- TODO account for rotation (use hump.vector to rotate)
return love.mouse.getX() * self.scaleX + self.x, love.mouse.getY() * self.scaleY + self.y
end
return camera
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment