Files
cacaus-arcade/data/viewport.lua

139 lines
4.0 KiB
Lua

require "map"
viewport={}
function viewport.new(_width, _height)
return { x=0, y=0,
width=_width,
height=_height,
get=viewport.get,
position=viewport.position,
print=viewport.print,
room=viewport.coord2room,
--roomXY= viewport.room2coord,
tile= viewport.tile,
last_tile= viewport.last_tile,
screen_coords = viewport.screen_coords,
inside = viewport.inside,
fixed = viewport.fixed,
free_move = viewport.free_move,
range = nil, -- rang de moviment quan està fixat {r= , l=, u=, d= }
fixed_coord = nil, -- coordenades fixades
smooth_adjust = nil,
adjust_speed = 2
}
end
function viewport:fixed(range, _x, _y)
self.range = range
_x = _x or self.x
_y = _y or self.y
self.fixed_coord = {x=_x, y=_y}
end
function viewport:free_move()
self.range = nil
if self.fixed_coord~=nil then print ("FIXED COORD= "..self.fixed_coord.x..", "..self.fixed_coord.y) end
self.smooth_adjust = self.fixed_coord
self.fixed_coord = nil
end
function viewport:get()
return self.x, self.y, self.x+self.width, self.y+self.height
end
function viewport:screen_coords ( x, y )
local scr_x = x-self.x
local scr_y = y-self.y
return scr_x, scr_y
end
function viewport:inside( x, y, w, h )
local result = false
if self.x<=x+w and self.x+self.width>=x and self.y<=y+h and self.y+self.height>=y then result = true end
return result
end
function viewport:tile ()
return coords.world_to_tile(self.x, self.y)
end
function viewport:last_tile ()
return coords.world_to_tile(self.x+self.width, self.y+self.height)
end
function viewport:coord2room ()
return coords.world_to_room(self.x, self.y)
end
function viewport:position(x, y)
local nx = (x ~= nil) and x or self.x
local ny = (y ~= nil) and y or self.y
if self.range==nil then
if self.smooth_adjust == nil then
self.x = nx
self.y = ny
else
-- viewport lliure després de fixar-lo -> Ajustar suau
local speed_x = self.adjust_speed
local speed_y = self.adjust_speed
local sm_x = self.smooth_adjust.x
local sm_y = self.smooth_adjust.y
self.x = nx
if sm_x~=nil then
if math.abs(nx-sm_x)<speed_x then
sm_x = nil
else
if nx<sm_x-speed_x then speed_x = -speed_x end
self.x=sm_x+speed_x
sm_x =sm_x+speed_x
end
self.smooth_adjust.x = sm_x
end
self.y = ny
if sm_y~=nil then
if math.abs(ny-sm_y)<speed_y then
sm_y = nil
else
if ny<sm_y-speed_y then speed_y = -speed_y end
self.y=sm_y+speed_y
sm_y =sm_y+speed_y
end
self.smooth_adjust.y = sm_y
end
if sm_x == nil and sm_y == nil then
self.smooth_adjust = nil
end
end
else
-- viewport fixe
self.x = nx
-- moure viewport left - right
if nx<self.fixed_coord.x-self.range.l then
self.x = self.fixed_coord.x-self.range.l
elseif nx>self.fixed_coord.x+self.range.r then
self.x = self.fixed_coord.x+self.range.r
end
self.y = ny
-- moure viewport up - down
if ny<self.fixed_coord.y-self.range.u then
self.y = self.fixed_coord.y-self.range.u
elseif ny>self.fixed_coord.y+self.range.d then
self.y = self.fixed_coord.y+self.range.d
end
end
return self.x, self.y
end
function viewport:print()
local room = self:room()
draw.rectf(0,7,45,14,16)
draw.text("X="..self.x.." , Y= "..self.y..", R"..room,1,8,2)
end
return viewport