--[[ Basic code for rendering a HUD overlay and getting menu input Uses the Stingray3D interface. ]] require 'core/appkit/lua/class' Project.S3DUI = Appkit.class(Project.S3DUI) local UI = Project.S3DUI local font = 'core/performance_hud/debug' local font_material = 'debug' function UI:init(gui) self.gui = gui self.current_menu_item = 1 end local function draw_text(gui, text, size, at, color) stingray.Gui.text(gui, text, font, size, font_material, at, color) local min, max = stingray.Gui.text_extents(gui, text, font, size) min = min + at max = max + at return max.x end local function hit_text(gui, pos, text, size, at) local min, max= stingray.Gui.text_extents(gui, text, font, size) if pos.x < at.x + min.x then return false end if pos.x > at.x + max.x then return false end if pos.y < at.y + min.y then return false end if pos.y > at.y + max.y then return false end return true end --A helper function for displaying and interacting with --the overlayed menu. If the menu is visible and a menu item is --selected it will return the specified key value. --If the menu is hidden, this code will return the --key pressed, if any, when executed. function UI:display_menu(t) local w,h = stingray.Application.back_buffer_size() local key_x = 50 local desc_x = key_x + 60 local param_x = desc_x + 170 local title_y = h-65 local y = title_y - 50 local font_size = 16 local title_font_size = 40 local line_height = 20 local key_color = stingray.Color(255,255,255) local title_color = stingray.Color(255,255,255) local desc_color = stingray.Color(200,150,150) local selection_color = stingray.Color(200,255,0) local param_color = stingray.Color(150,150,200) local back_color = stingray.Color(128,0,0,0) local touch_color = stingray.Color(255,255,0,0) local result = nil local sel = self.current_menu_item if not sel then sel = 1 end if sel > #t.items then sel = 1 end if sel < 1 then sel = #t.items end local enabled_items = {} for i,item in ipairs(t.items or {}) do if not item.disabled then table.insert(enabled_items, item) end end local touch_pos = nil local touch_up local touch = Appkit.Util.touch_interface() if Appkit.Util.use_touch() then sel = nil if touch.num_contacts() > 0 then local id = touch.contacts() touch_pos = Appkit.Util.location(touch, id) touch_up = touch.is_touch_up(id) end end for i,item in ipairs(enabled_items) do local key = item.key or "" local desc = item.text or "" local enabled = item.enabled or true local param = tostring(item.param or "") y = y - line_height local ki = stingray.Keyboard.button_id(key) if ki and stingray.Keyboard.pressed(ki) then result = key end end local select = function (s) local b = stingray.Keyboard.button_id("enter") if b and stingray.Keyboard.pressed(b) then return true end local b = stingray.Pad1.button_id("cross") if b and stingray.Pad1.pressed(b) then return true end local b = stingray.Pad1.button_id("a") if b and stingray.Pad1.pressed(b) then return true end return touch_up end local down = function (s) local b = stingray.Keyboard.button_id("down") if b and stingray.Keyboard.pressed(b) then return true end local b = stingray.Pad1.button_id("d_down") if b and stingray.Pad1.pressed(b) then return true end local b = stingray.Pad1.button_id("down") if b and stingray.Pad1.pressed(b) then return true end return false end local up = function (s) local b = stingray.Keyboard.button_id("up") if b and stingray.Keyboard.pressed(b) then return true end local b = stingray.Pad1.button_id("d_up") if b and stingray.Pad1.pressed(b) then return true end local b = stingray.Pad1.button_id("up") if b and stingray.Pad1.pressed(b) then return true end return false end local help = function (s) local b = stingray.Keyboard.button_id("f1") if b and stingray.Keyboard.pressed(b) then return true end local b = stingray.Pad1.button_id("start") if b and stingray.Pad1.pressed(b) then return true end local b = stingray.Pad1.button_id("options") if b and stingray.Pad1.pressed(b) then return true end local w,h = stingray.Gui.resolution() for _,id in ipairs{touch.contacts()} do if touch.is_touch_down(id) and Appkit.Util.location(touch, id).y > h-50 then return true end end return false end if sel then self.current_menu_item = sel end return result end return UI