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, fixed_to_free_position = viewport.fixed_to_free_position } 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:fixed_to_free_position(nx, ny) 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 -- print("FIXED TO FREE") -- print(" nx,ny= "..nx.." , "..ny) -- if sm_x~=nil then print(" sm_x= "..sm_x) else print(" sm_x= nil") end -- if sm_y~=nil then print(" sm_y= "..sm_y) else print(" sm_y= nil") end -- print(" sp_x,sp_y= "..speed_x.." , "..speed_y) -- print("") -- Ajustar eix X self.x = nx if sm_x~=nil then if math.abs(nx-sm_x)<=speed_x then sm_x = nil else if nx Ajustar suau self:fixed_to_free_position(nx, ny) end else -- viewport fixe self.x = nx -- moure viewport left - right if nxself.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 nyself.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