dcearth/camera.lua

62 lines
1.7 KiB
Lua
Raw Normal View History

local tf = love.math.newTransform()
2023-07-28 23:23:08 +00:00
local tfTerritory = love.math.newTransform()
local tfNodes = love.math.newTransform()
local lg = assert( love.graphics )
local Camera = {
x = 0, y = 0,
w = 360, h = 200,
zoom = 1, tf = tf,
tfTerritory = tfTerritory, tfNodes = tfNodes }
function Camera.GetWorldCoordinate( x, y )
return tf:inverseTransformPoint( x, y )
end
2023-07-28 23:23:08 +00:00
function Camera.GetBitmapCoordinate( x, y )
return tfTerritory:inverseTransformPoint( x, y )
end
function Camera.GetNodeCoordinate( x, y )
return tfNodes:inverseTransformPoint( x, y )
end
function Camera.Zoom( delta )
local scale = 1.0 + delta
if Camera.zoom < 25.0 and delta > 0 or --zooming in
Camera.zoom > 0.5 and delta < 0 then --zooming out
return Camera.Set( Camera.x , Camera.y, Camera.w * scale, Camera.h * scale )
end
end
function Camera.Translate( x, y )
x = x or 0
y = y or 0
2023-07-28 05:42:16 +00:00
return Camera.Set( math.max(-180, math.min(360, Camera.x + x)), math.min(100, Camera.y + y), Camera.w, Camera.h)
end
--In world coordinates: top left corner at x, y, extent of w, h.
function Camera.Set( x, y, w, h )
Camera.x, Camera.y, Camera.w, Camera.h = x, y, w, h
Camera.zoom = w / 800
tf:reset()
tf:scale( w / 360, -h / 200 )
tf:translate( 180 - x, -y - 100 )
2023-07-28 23:23:08 +00:00
tfTerritory:reset()
tfTerritory:scale( w / 512, h / 285 )
tfTerritory:translate( -x * 512 / 360, y * 512 / 360 )
tfNodes:reset()
tfNodes:scale( w / 360, h / 200 )
tfNodes:translate( 180 - x , y + 100 )
--tfNodes:translate( -x * 800 / 360, y * 400 / 200 )
end
function Camera.Resize( w, h )
w, h = math.min( w, h * 360 / 200 ), math.min( h, w * 200 / 360 )
return Camera.Set( Camera.x, Camera.y, w, h )
end
Camera.Resize( lg.getDimensions() )
return Camera