Advertisement
alestane

Event-driven UI

Feb 2nd, 2012
220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.51 KB | None | 0 0
  1. local character = require "characters.character"
  2. local sprite = require "sprite"
  3.  
  4. -- these should probably be moved into a new module
  5. local function trackButton(event)
  6.     local button = event.target
  7.     if event.phase == "began" then
  8.         display.getCurrentStage():setFocus(button)
  9.         button._isFocused = true
  10.         button._down = true
  11.         button:dispatchEvent{name='Button.State'; target=button, down=true}
  12.     elseif button._isFocused then
  13.         if event.phase == "moved" then
  14.             local bounds = button.contentBounds
  15.             local isWithinBounds = bounds.xMin <= event.x and bounds.xMax >= event.x and bounds.yMin <= event.y and bounds.yMax >= event.y
  16.             if isWithinBounds ~= button._down then
  17.                 button._down = isWithinBounds
  18.                 button:dispatchEvent{name='Button.State'; target=button, down=button._down}
  19.             end
  20.         elseif event.phase == "ended" or event.phase == "cancelled" then
  21.             button:dispatchEvent{name='Button.State'; target=button, down=false}
  22.             button:dispatchEvent{name='Button'; target=button, activate=button._down and event.phase == "ended"}
  23.             display.getCurrentStage():setFocus(button, nil)
  24.             button._down = nil
  25.             button._isFocused = nil
  26.         end
  27.     end
  28.     return true
  29. end
  30.    
  31. end
  32. local button = {}
  33. function button.new(object)
  34.     object:addEventListener('touch', trackButton)
  35. end
  36.  
  37. local resistance = {}
  38.  
  39. local menuSheet = sprite.newSpriteSheet("visuals/resistance_buttons.png", 60, 20)
  40. local menuButtonMove = sprite.newSpriteSet(menuSheet, 1, 2)
  41. local menuButtonAttack = sprite.newSpriteSet(menuSheet, 3, 2)
  42. local menuButtonDone = sprite.newSpriteSet(menuSheet, 5, 2)
  43.  
  44. function resistance.ToggleMenu(group, self)
  45.     group.isVisible = not group.isVisible
  46.     if group.isVisible then
  47.         self:prepare("Selected")
  48.     else
  49.         self:prepare("Stationary")
  50.     end
  51.     self:play()
  52. end
  53.  
  54. local function triggerMenu(event)
  55.     event.target.menu:Open()
  56.     return true
  57. end
  58.  
  59. local function monitorMenu(self, event)
  60.     local sequence = "Stationary"
  61.     if event.action == "open" then
  62.         sequence = "Selected"
  63.     end
  64.     if self.sequence ~= sequence then
  65.         self:prepare(sequence)
  66.         self:play()
  67.     end
  68. end
  69.  
  70. local function animateButton(event)
  71.     event.target.currentFrame = event.down and 2 or 1
  72. end
  73.  
  74. local function newMenuButton(parent, spriteSet, x, y)
  75.     local self = sprite.newSprite(spriteSet)
  76.     parent:insert(self)
  77.     self:setReferencePoint(display.TopLeftReferencePoint)
  78.     self.x, self = x, y
  79.     self:addEventListener('Button.State', animateButton)
  80.     self:addEventListener('Button', parent)
  81.     self:addEventListener('Button', self)
  82.     return self
  83. end
  84.  
  85. local menuFunctions = {}
  86.  
  87. function menuFunctions:Open(event)
  88.     self.isVisible = true
  89.     self:dispatchEvent{name='Menu'; target=self, action='open'}
  90. end
  91.  
  92. function menuFunctions:Close(event)
  93.     self.isVisible = false
  94.     self:dispatchEvent{name='Menu'; target=self, action='close'}
  95. end
  96.  
  97. function menuFunctions:Button(event)
  98.     if event.activate then
  99.         self:Close()
  100.     end
  101. end
  102.  
  103. function resistance.Create(spritesheet, size, health, move, attack, defense, xTile, yTile)
  104.     local self = character.Create(spritesheet, size, health, move, attack, defense, xTile, yTile)
  105.         self:addEventListener("tap", triggerMenu)
  106.     self.menu = display.newGroup() do local menu = self.menu
  107.         menu.owner = self
  108.         menu.x, menu.y = 145, 173
  109.         menu.Block = display.newRect(0, 0, display.contentWidth, display.contentHeight)
  110.             menu:insert(menu.Block)
  111.             menu.Block:setFillColor(0, 0)
  112.             menu.Block:addEventListener("tap", function() return true end)
  113.         menu.Background = display.newImage("visuals/resistance_background.png", 0, 0)
  114.             menu.Background:setReferencePoint(display.CenterReferencePoint)
  115.             menu.Background.x, menu.Background.y = display.contentWidth / 2, display.contentHeight / 2
  116.             menu:insert(menu.Background)
  117.         menu.Icon = display.newImage(menu, ("visuals/character_" .. spritesheet .. "icon.png"), 0, -45)
  118.         menu.ButtonMove = newMenuButton(menu, menuButtonMove, 0, 0)
  119.             function menu.ButtonMove:Button(event)
  120.                 if event.activate then
  121.                     character.Move(self, 30, math.random(0, 15), math.random(0, 9))
  122.                 end
  123.             end
  124.         menu.ButtonAttack = newMenuButton(menu, menuButtonAttack, 65, 0)
  125.         menu.ButtonDone = newMenuButton(menu, menuButtonDone, 130, 0)
  126.  
  127.         for name, method in pairs(menuFunctions) do
  128.             menu[name] = method
  129.         end
  130.  
  131.         menu.isVisible = false
  132.     end
  133.     self.Menu = monitorMenu
  134.     self.menu:addEventListener('Menu', self)
  135.     return self
  136. end
  137.  
  138. return resistance
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement