Created
May 30, 2018 12:09
-
-
Save lemilonkh/262e0bc2a73406bcab3da4b11a43b0c2 to your computer and use it in GitHub Desktop.
Milan's magic shaky cam
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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