неділя, 27 травня 2018 р.

Обробка кліків по об'єкту


Модуль обробки події кліку по спрайту

Модуль 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.= pos.+ sprite_data.offset.* go_scale.x
                pos.= pos.+ sprite_data.offset.* go_scale.y
             
                local scaled_size = vmath.vector3(size.* go_scale.* sprite_scale.x, size.* go_scale.* sprite_scale.y, 0)
             
                if action.>= pos.- scaled_size./ 2 and action.<= pos.+ scaled_size./ 2 and action.>= pos.- scaled_size./ 2 and action.<= pos.+scaled_size./ 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ою видалятимуться