Модуль обробки події кліку по спрайту
Модуль goput.lua
--- Модуль, який спрощує обробку вхідних даних об'єктами гри за допомогою спрайтів
local M = {}
local sprites = {}
local function key_from_url(url)
return tostring(url.socket) .. hash_to_hex(url.path) .. hash_to_hex(url.fragment)
end
--sprite_url урл спрайта
--sprite_offset зміщення спрайта від нуля вектор
--on_input_callback функція яка повертається при події кліку на спрайт
--goput.add("go1#sprite", nil, handle_click)
function M.add(sprite_url, sprite_offset, on_input_callback)
assert(sprite_url)
assert(on_input_callback)
sprite_offset = sprite_offset or vmath.vector3()
sprite_url = type(sprite_url) == "string" and msg.url(sprite_url) or sprite_url
sprites[key_from_url(sprite_url)] = {
sprite_url = sprite_url,
go_url = msg.url(sprite_url.socket, sprite_url.path, nil),
offset = sprite_offset,
callback = on_input_callback, size = go.get(sprite_url, "size") }
end
--- видалити слухача спрайту
--goput.remove("go1#sprite")
function M.remove(sprite_url)
assert(sprite_url)
sprite_url = type(sprite_url) == "string" and msg.url(sprite_url) or sprite_url
sprites[key_from_url(sprite_url)] = nil
end
--- Forward input from a script that has acquire input focus
-- @param action_id Action id as received from on_input
-- @param action Action table as received from on_input
-- @return Will return value returned by the callback function for
-- tge game object that received input or false if no game object
-- received input
function M.on_input(action_id, action)
for _,sprite_data in pairs(sprites) do
local go_scale = go.get_scale_vector(sprite_data.go_url)
local sprite_scale = go.get(sprite_data.sprite_url, "scale")
local size = sprite_data.size
local pos = go.get_position(sprite_data.go_url)
pos.x = pos.x + sprite_data.offset.x * go_scale.x
pos.y = pos.y + sprite_data.offset.y * go_scale.y
local scaled_size = vmath.vector3(size.x * go_scale.x * sprite_scale.x, size.y * go_scale.y * sprite_scale.y, 0)
if action.x >= pos.x - scaled_size.x / 2 and action.x <= pos.x + scaled_size.x / 2 and action.y >= pos.y - scaled_size.y / 2 and action.y <= pos.y +scaled_size.y / 2 then
return sprite_data.callback(sprite_data.go_url, action_id, action)
end
end
return false
end
return M
Синтаксис: Lua
Приклад використання модуля
local goput = require "click_game_object.goput" -- папка,назва_файлу
local function random_position()
local w = sys.get_config("display.width")
local h = sys.get_config("display.height")
return vmath.vector3(math.random(1, w), math.random(1, h), 0)
end
local function handle_click(url, action_id, action)
if action.released then
go.animate(url, "position", go.PLAYBACK_ONCE_FORWARD, random_position(), go.EASING_INOUTCIRC, 0.5)
end
end
function init(self)
msg.post(".", "acquire_input_focus")
msg.post("@render:", "clear_color", { color = vmath.vector4(95 /256, 129 / 256, 161 / 256, 1 ) })
go.set("go1#sprite", "scale", vmath.vector3(1.5, 1.5, 1))
goput.add("go1#sprite", nil, handle_click)
goput.add("go2#sprite", nil, handle_click)
goput.add("go3#sprite", nil, handle_click)
goput.add("go4#sprite", nil, handle_click)
goput.add("go5#sprite", vmath.vector3(100, 50, 0), handle_click)
end
function final(self)
msg.post(".", "release_input_focus")
goput.remove("go1#sprite")
goput.remove("go2#sprite")
goput.remove("go3#sprite")
goput.remove("go4#sprite")
goput.remove("go5#sprite")
end
function on_input(self, action_id, action)
return goput.on_input(action_id, action)
end
Немає коментарів:
Дописати коментар
Kоментарі неуkраїнсьkою видалятимуться