|
local camera = {} |
|
|
|
camera.init = function(param) |
|
local self = {} |
|
self.position = {x = param.position[1], y = param.position[2]} |
|
self.zoom = param.zoom |
|
self.set_zoom = param.set_zoom |
|
self.players = {} |
|
return self |
|
end |
|
|
|
camera.hold = function(self, param) |
|
if param.position then |
|
self.position = {x = param.position[1], y = param.position[2]} |
|
end |
|
if param.zoom then |
|
self.zoom = param.zoom |
|
end |
|
self.hold_time = game.tick + (param.time*60) |
|
end |
|
|
|
camera.move = function (self, param) |
|
local d_t = param.time * 60 |
|
local start_tick = game.tick + 1 |
|
local tick_to_finish = start_tick + d_t |
|
local o_x = self.position.x |
|
local o_y = self.position.y |
|
local o_z = self.zoom |
|
local v_x = o_x |
|
local v_y = o_y |
|
if param.position then |
|
v_x = param.position[1] |
|
v_y = param.position[2] |
|
elseif param.entity then |
|
v_x = param.entity.position.x |
|
v_y = param.entity.position.y |
|
end |
|
local d_x = (v_x-o_x)/d_t |
|
local d_y = (v_y-o_y)/d_t |
|
local d_z = (param.zoom - self.zoom)/d_t or 0 |
|
self.position_on_tick = {} |
|
local d = 1 |
|
for k = start_tick, tick_to_finish do |
|
self.position_on_tick[k] = {position = {x = (o_x + (d_x*d)), y = (o_y + (d_y*d))}, zoom = (o_z + d_z*d)} |
|
d = d + 1 |
|
end |
|
self.position_on_tick[tick_to_finish].last = true |
|
end |
|
|
|
camera.update = function(self) |
|
if not self then return end |
|
local tick = game.tick |
|
if self.position_on_tick then |
|
local new_position = self.position_on_tick[tick] |
|
if new_position then |
|
self.position = new_position.position |
|
self.zoom = new_position.zoom |
|
if new_position.last then |
|
self.position_on_tick = nil |
|
end |
|
end |
|
end |
|
if self.hold_time then |
|
if tick >= self.hold_time then |
|
self.hold_time = nil |
|
end |
|
end |
|
if self.following then |
|
if self.following.valid then |
|
self.position = self.following.position |
|
else |
|
self.following = nil |
|
end |
|
end |
|
for k, player in pairs (self.players) do |
|
player.teleport(self.position) |
|
if self.set_zoom then |
|
player.zoom = self.zoom |
|
end |
|
end |
|
end |
|
|
|
camera.follow = function(self, entity) |
|
self.following = entity |
|
end |
|
|
|
camera.idle = function(self) |
|
if self.position_on_tick then return false end |
|
if self.hold_time then return false end |
|
if self.following then return false end |
|
return true |
|
end |
|
|
|
return camera |
|
|