diff --git a/.luacheckrc b/.luacheckrc new file mode 100644 index 0000000..4b1717c --- /dev/null +++ b/.luacheckrc @@ -0,0 +1,42 @@ +std = "max" +files['.luacheckrc'].global = false +unused_args = false + +globals = { + "sys", + "go", + "gui", + "label", + "render", + "crash", + "sprite", + "sound", + "tilemap", + "spine", + "particlefx", + "physics", + "factory", + "collectionfactory", + "iac", + "msg", + "vmath", + "url", + "http", + "image", + "json", + "zlib", + "iap", + "push", + "facebook", + "hash", + "hash_to_hex", + "pprint", + "init", + "final", + "update", + "on_input", + "on_message", + "on_reload", + "window", + "unityads" +} diff --git a/example/popup.gui_script b/example/popup.gui_script index 99d872f..50215c6 100644 --- a/example/popup.gui_script +++ b/example/popup.gui_script @@ -8,10 +8,10 @@ function init(self) gui.set_render_order(15) self.transition = transitions.create(gui.get_node("root")) - .show_in(transitions.slide_in_top, gui.EASING_OUTQUAD, 0.6, 0) - .show_out(transitions.slide_out_top, gui.EASING_INQUAD, 0.6, 0) - .back_in(transitions.slide_in_top, gui.EASING_OUTQUAD, 0.6, 0) - .back_out(transitions.slide_out_top, gui.EASING_INQUAD, 0.6, 0) + .show_in(transitions.scale_in, gui.EASING_OUTBACK, 0.3, 0) + .show_out(transitions.scale_out, gui.EASING_INBACK, 0.3, 0) + .back_in(transitions.scale_in, gui.EASING_OUTBACK, 0.3, 0) + .back_out(transitions.scale_out, gui.EASING_INBACK, 0.3, 0) end function on_input(self, action_id, action) diff --git a/monarch/monarch.lua b/monarch/monarch.lua index c1a96ef..5049fa5 100644 --- a/monarch/monarch.lua +++ b/monarch/monarch.lua @@ -8,13 +8,25 @@ local CONTEXT = hash("monarch_context") local PROXY_LOADED = hash("proxy_loaded") local PROXY_UNLOADED = hash("proxy_unloaded") -M.TRANSITION_DONE = hash("transition_done") +local RELEASE_INPUT_FOCUS = hash("release_input_focus") +local ACQUIRE_INPUT_FOCUS = hash("acquire_input_focus") +local ASYNC_LOAD = hash("async_load") +local UNLOAD = hash("unload") +local ENABLE = hash("enable") + +M.TRANSITION = {} +M.TRANSITION.DONE = hash("transition_done") +M.TRANSITION.SHOW_IN = hash("transition_show_in") +M.TRANSITION.SHOW_OUT = hash("transition_show_out") +M.TRANSITION.BACK_IN = hash("transition_back_in") +M.TRANSITION.BACK_OUT = hash("transition_back_out") + M.FOCUS_GAINED = hash("monarch_focus_gained") M.FOCUS_LOST = hash("monarch_focus_lost") local function screen_from_proxy(proxy) - for _,screen in pairs(screens) do + for _, screen in pairs(screens) do if screen.proxy == proxy then return screen end @@ -23,7 +35,7 @@ end local function screen_from_script() local url = msg.url() - for _,screen in pairs(screens) do + for _, screen in pairs(screens) do if screen.script == url then return screen end @@ -31,7 +43,7 @@ local function screen_from_script() end local function in_stack(id) - for i=1,#stack do + for i = 1, #stack do if stack[i].id == id then return true end @@ -60,18 +72,18 @@ local function show_out(screen, next_screen, cb) local co co = coroutine.create(function() screen.co = co - msg.post(screen.script, "release_input_focus") + msg.post(screen.script, RELEASE_INPUT_FOCUS) msg.post(screen.script, CONTEXT) coroutine.yield() if not next_screen.popup then - msg.post(screen.transition_url, "transition_show_out") + msg.post(screen.transition_url, M.TRANSITION.SHOW_OUT) coroutine.yield() - msg.post(screen.proxy, "unload") + msg.post(screen.proxy, UNLOAD) coroutine.yield() screen.loaded = false end if screen.focus_url then - msg.post(screen.focus_url, M.FOCUS_LOST) + msg.post(screen.focus_url, M.FOCUS_LOST, {id = next_screen.id}) end screen.co = nil if cb then cb() end @@ -86,7 +98,7 @@ local function show_in(screen, reload, cb) msg.post(screen.script, CONTEXT) coroutine.yield() if reload and screen.loaded then - msg.post(screen.proxy, "unload") + msg.post(screen.proxy, UNLOAD) coroutine.yield() screen.loaded = false end @@ -94,17 +106,17 @@ local function show_in(screen, reload, cb) -- and the popup asked to show this screen again -- in that case we shouldn't attempt to load it again if not screen.loaded then - msg.post(screen.proxy, "async_load") + msg.post(screen.proxy, ASYNC_LOAD) coroutine.yield() - msg.post(screen.proxy, "enable") + msg.post(screen.proxy, ENABLE) screen.loaded = true end stack[#stack + 1] = screen - msg.post(screen.transition_url, "transition_show_in") + msg.post(screen.transition_url, M.TRANSITION.SHOW_IN) coroutine.yield() - msg.post(screen.script, "acquire_input_focus") + msg.post(screen.script, ACQUIRE_INPUT_FOCUS) if screen.focus_url then - msg.post(screen.focus_url, M.FOCUS_GAINED) + msg.post(screen.focus_url, M.FOCUS_GAINED, {id = screen.id}) end screen.co = nil if cb then cb() end @@ -119,16 +131,16 @@ local function back_in(screen, previous_screen, cb) msg.post(screen.script, CONTEXT) coroutine.yield() if not previous_screen.popup then - msg.post(screen.proxy, "async_load") + msg.post(screen.proxy, ASYNC_LOAD) coroutine.yield() - msg.post(screen.proxy, "enable") + msg.post(screen.proxy, ENABLE) screen.loaded = true - msg.post(screen.transition_url, "transition_back_in") + msg.post(screen.transition_url, M.TRANSITION.BACK_IN) coroutine.yield() end - msg.post(screen.script, "acquire_input_focus") + msg.post(screen.script, ACQUIRE_INPUT_FOCUS) if screen.focus_url then - msg.post(screen.focus_url, M.FOCUS_GAINED) + msg.post(screen.focus_url, M.FOCUS_GAINED, {id = previous_screen.id}) end screen.co = nil if cb then cb() end @@ -140,16 +152,16 @@ local function back_out(screen, cb) local co co = coroutine.create(function() screen.co = co - msg.post(screen.script, "release_input_focus") + msg.post(screen.script, RELEASE_INPUT_FOCUS) msg.post(screen.script, CONTEXT) coroutine.yield() - msg.post(screen.transition_url, "transition_back_out") + msg.post(screen.transition_url, M.TRANSITION.BACK_OUT) coroutine.yield() - msg.post(screen.proxy, "unload") + msg.post(screen.proxy, UNLOAD) coroutine.yield() screen.loaded = false if screen.focus_url then - msg.post(screen.focus_url, M.FOCUS_LOST) + msg.post(screen.focus_url, M.FOCUS_LOST, {id = screen.id}) end screen.co = nil if cb then cb() end @@ -254,7 +266,7 @@ function M.on_message(message_id, message, sender) local screen = screen_from_script() assert(screen, "Unable to find screen for current script url") coroutine.resume(screen.co) - elseif message_id == M.TRANSITION_DONE then + elseif message_id == M.TRANSITION.DONE then local screen = screen_from_script() assert(screen, "Unable to find screen for current script url") coroutine.resume(screen.co) @@ -263,7 +275,7 @@ end function M.dump_stack() local s = "" - for i,screen in ipairs(stack) do + for i, screen in ipairs(stack) do s = s .. ("%d = %s\n"):format(i, tostring(screen.id)) end return s diff --git a/monarch/screen.script b/monarch/screen.script index 5e39119..40728b6 100644 --- a/monarch/screen.script +++ b/monarch/screen.script @@ -22,12 +22,12 @@ function on_message(self, message_id, message, sender) monarch.back() elseif message_id == hash("back") then monarch.back() - elseif message_id == hash("transition_show_in") - or message_id == hash("transition_show_out") - or message_id == hash("transition_back_in") - or message_id == hash("transition_back_out") then - msg.post(sender, "transition_done") - else - monarch.on_message(message_id, message, sender) + elseif message_id == monarch.TRANSITION.SHOW_IN + or message_id == monarch.TRANSITION.SHOW_OUT + or message_id == monarch.TRANSITION.BACK_IN + or message_id == monarch.TRANSITION.BACK_OUT then + msg.post(sender, monarch.TRANSITION.DONE) + else + monarch.on_message(message_id, message, sender) + end end -end diff --git a/monarch/transitions/gui.lua b/monarch/transitions/gui.lua index 5ecef8a..836b34e 100644 --- a/monarch/transitions/gui.lua +++ b/monarch/transitions/gui.lua @@ -1,3 +1,5 @@ +local monarch = require "monarch.monarch" + local M = {} local WIDTH = tonumber(sys.get_config("display.width")) @@ -6,34 +8,36 @@ local HEIGHT = tonumber(sys.get_config("display.height")) local LEFT = vmath.vector3(-WIDTH * 2, 0, 0) local RIGHT = vmath.vector3(WIDTH * 2, 0, 0) local TOP = vmath.vector3(0, HEIGHT * 2, 0) -local BOTTOM = vmath.vector3(0, -HEIGHT * 2, 0) +local BOTTOM = vmath.vector3(0, - HEIGHT * 2, 0) + +local ZERO_SCALE = vmath.vector3(0, 0, 1) function M.instant(node, to, easing, duration, delay, url) - msg.post(url, "transition_done") + msg.post(url, monarch.TRANSITION.DONE) end local function slide_in(direction, node, to, easing, duration, delay, url) local from = to + direction gui.set_position(node, from) gui.animate(node, gui.PROP_POSITION, to, easing, duration, delay, function() - msg.post(url, "transition_done") + msg.post(url, monarch.TRANSITION.DONE) end) end function M.slide_in_left(node, to, easing, duration, delay, url) - return slide_in(LEFT, node, to, easing, duration, delay, url) + return slide_in(LEFT, node, to.pos, easing, duration, delay, url) end function M.slide_in_right(node, to, easing, duration, delay, url) - slide_in(RIGHT, node, to, easing, duration, delay, url) + slide_in(RIGHT, node, to.pos, easing, duration, delay, url) end function M.slide_in_top(node, to, easing, duration, delay, url) - slide_in(TOP, node, to, easing, duration, delay, url) + slide_in(TOP, node, to.pos, easing, duration, delay, url) end function M.slide_in_bottom(node, to, easing, duration, delay, url) - slide_in(BOTTOM, node, to, easing, duration, delay, url) + slide_in(BOTTOM, node, to.pos, easing, duration, delay, url) end @@ -41,24 +45,38 @@ local function slide_out(direction, node, from, easing, duration, delay, url) local to = from + direction gui.set_position(node, from) gui.animate(node, gui.PROP_POSITION, to, easing, duration, delay, function() - msg.post(url, "transition_done") + msg.post(url, monarch.TRANSITION.DONE) end) end function M.slide_out_left(node, from, easing, duration, delay, url) - slide_out(LEFT, node, from, easing, duration, delay, url) + slide_out(LEFT, node, from.pos, easing, duration, delay, url) end function M.slide_out_right(node, from, easing, duration, delay, url) - slide_out(RIGHT, node, from, easing, duration, delay, url) + slide_out(RIGHT, node, from.pos, easing, duration, delay, url) end function M.slide_out_top(node, from, easing, duration, delay, url) - slide_out(TOP, node, from, easing, duration, delay, url) + slide_out(TOP, node, from.pos, easing, duration, delay, url) end function M.slide_out_bottom(node, from, easing, duration, delay, url) - slide_out(BOTTOM, node, from, easing, duration, delay, url) + slide_out(BOTTOM, node, from.pos, easing, duration, delay, url) +end + +function M.scale_in(node, to, easing, duration, delay, url) + gui.set_scale(node, ZERO_SCALE) + gui.animate(node, gui.PROP_SCALE, to.scale, easing, duration, delay, function() + msg.post(url, monarch.TRANSITION.DONE) + end) +end + +function M.scale_out(node, from, easing, duration, delay, url) + gui.set_scale(node, from.scale) + gui.animate(node, gui.PROP_SCALE, ZERO_SCALE, easing, duration, delay, function() + msg.post(url, monarch.TRANSITION.DONE) + end) end --- Create a transition for a node @@ -67,23 +85,25 @@ function M.create(node) assert(node, "You must provide a node") local instance = {} - + local transitions = { - [hash("transition_show_in")] = M.instant, - [hash("transition_show_out")] = M.instant, - [hash("transition_back_in")] = M.instant, - [hash("transition_back_out")] = M.instant, + [monarch.TRANSITION.SHOW_IN] = M.instant, + [monarch.TRANSITION.SHOW_OUT] = M.instant, + [monarch.TRANSITION.BACK_IN] = M.instant, + [monarch.TRANSITION.BACK_OUT] = M.instant, } - - local initial_position = gui.get_position(node) - + + local initial_data = {} + initial_data.pos = gui.get_position(node) + initial_data.scale = gui.get_scale(node) + -- Forward on_message calls here function instance.handle(message_id, message, sender) if transitions[message_id] then transitions[message_id](sender) end end - + -- Specify the transition function when this node is transitioned -- to -- @param fn Transition function (see slide_in_left and other above) @@ -91,8 +111,8 @@ function M.create(node) -- @param duration Transition duration -- @param delay Transition delay function instance.show_in(fn, easing, duration, delay) - transitions[hash("transition_show_in")] = function(url) - fn(node, initial_position, easing, duration, delay or 0, url) + transitions[monarch.TRANSITION.SHOW_IN] = function(url) + fn(node, initial_data, easing, duration, delay or 0, url) end return instance end @@ -100,8 +120,8 @@ function M.create(node) -- Specify the transition function when this node is transitioned -- from when showing another screen function instance.show_out(fn, easing, duration, delay) - transitions[hash("transition_show_out")] = function(url) - fn(node, initial_position, easing, duration, delay or 0, url) + transitions[monarch.TRANSITION.SHOW_OUT] = function(url) + fn(node, initial_data, easing, duration, delay or 0, url) end return instance end @@ -109,8 +129,8 @@ function M.create(node) --- Specify the transition function when this node is transitioned -- to when navigating back in the screen stack function instance.back_in(fn, easing, duration, delay) - transitions[hash("transition_back_in")] = function(url) - fn(node, initial_position, easing, duration, delay or 0, url) + transitions[monarch.TRANSITION.BACK_IN] = function(url) + fn(node, initial_data, easing, duration, delay or 0, url) end return instance end @@ -118,13 +138,13 @@ function M.create(node) --- Specify the transition function when this node is transitioned -- from when navigating back in the screen stack function instance.back_out(fn, easing, duration, delay) - transitions[hash("transition_back_out")] = function(url) - fn(node, initial_position, easing, duration, delay or 0, url) + transitions[monarch.TRANSITION.BACK_OUT] = function(url) + fn(node, initial_data, easing, duration, delay or 0, url) end return instance end - + return instance end -return M \ No newline at end of file +return M