1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
s = require("ui.sprites")
util = require("util")
color = require("color")
world = require("world")
states = {"up","down"}
rows = {"upper","mid","lower"}
cols = {"left","mid","right"}
class Button
--am.sprite() only works once the window is created
@initalized = false
@initalize: =>
for _, state, _, row, _, col in util.cartesian(states, rows, cols)
name = table.concat({state,row,col},"_")
assert(s["button_" .. name], "Failed to find sprite:" .. name)
@[name] = am.sprite(s["button_" .. name],"left","top")
@initalized = true
new: (x,y,w,h,text)=>
if not @@initalized
@@initalize!
@em = 16 -- width of a character
text = text or ""
assert(w > 15, "Button must have at least width 15")
@node = am.group!
position = am.translate(x,y+h)\tag("position")
@up_sprites = am.group!
position\append(@up_sprites)
@down_sprites = am.group!
@node\append(position)
@up_sprites\append(@@up_upper_left)
@up_sprites\append(
am.translate(@@up_upper_left.width,0)\append(
am.scale(w - @@up_upper_left.width - @@up_upper_right.width,1)\append(
@@up_upper_mid
)))
@up_sprites\append(
am.translate(w - @@up_upper_right.width, 0)\append(
@@up_upper_right
))
mid_height = h - @@up_upper_left.height - @@up_lower_left.height
@up_sprites\append(
am.translate(0,-@@up_upper_left.height)\append(
am.scale(1,mid_height)\append(
@@up_mid_left
)))
@up_sprites\append(
am.translate(@@up_upper_left.width, -@@up_upper_left.height)\append(
am.scale(w - @@up_mid_left.width - @@up_mid_right.width, h - @@up_upper_mid.height - @@up_lower_mid.height)\append(
@@up_mid_mid
)))
@up_sprites\append(
am.translate(w - @@up_mid_right.width,-@@up_upper_right.height)\append(
am.scale(1,h - @@up_upper_right.height - @@up_lower_right.height)\append(
@@up_mid_right
)))
@up_sprites\append(
am.translate(0,-(h - @@up_lower_left.height))\append(
@@up_lower_left
))
@up_sprites\append(
am.translate(@@up_lower_left.width,-(h - @@up_lower_mid.height))\append(
am.scale(w - @@up_lower_left.width - @@up_lower_right.width,1)\append(
@@up_lower_mid
)))
@up_sprites\append(
am.translate(w - @@up_lower_right.width, -(h - @@up_lower_right.height))\append(
@@up_lower_right
))
@down_sprites\append(@@down_upper_left)
@down_sprites\append(
am.translate(@@down_upper_left.width,0)\append(
am.scale(w - @@down_upper_left.width - @@down_upper_right.width,1)\append(
@@down_upper_mid
)))
@down_sprites\append(
am.translate(w - @@down_upper_right.width, 0)\append(
@@down_upper_right
))
mid_height = h - @@down_upper_left.height - @@down_lower_left.height
@down_sprites\append(
am.translate(0,-@@down_upper_left.height)\append(
am.scale(1,mid_height)\append(
@@down_mid_left
)))
@down_sprites\append(
am.translate(@@down_upper_left.width, -@@down_upper_left.height)\append(
am.scale(w - @@down_mid_left.width - @@down_mid_right.width, h - @@down_upper_mid.height - @@down_lower_mid.height)\append(
@@down_mid_mid
)))
@down_sprites\append(
am.translate(w - @@down_mid_right.width,-@@down_upper_right.height)\append(
am.scale(1,h - @@down_upper_right.height - @@down_lower_right.height)\append(
@@down_mid_right
)))
@down_sprites\append(
am.translate(0,-(h - @@down_lower_left.height))\append(
@@down_lower_left
))
@down_sprites\append(
am.translate(@@down_lower_left.width,-(h - @@down_lower_mid.height))\append(
am.scale(w - @@down_lower_left.width - @@down_lower_right.width,1)\append(
@@down_lower_mid
)))
@down_sprites\append(
am.translate(w - @@down_lower_right.width, -(h - @@down_lower_right.height))\append(
@@down_lower_right
))
@text = am.text(text, "left","top", color.am_color.foreground)
position\append(
am.translate(@@down_upper_left.width, -@@down_upper_right.height)\append(
am.scale(world.controller.text_size)\append(
@text
)))
@depressed = false
down: () =>
@depressed = true
@.node("position")\replace(@up_sprites, @down_sprites)
up: () =>
@depressed = false
@.node("position")\replace(@down_sprites, @up_sprites)
fire: (e) =>
if e.event == "touches_began" or e.event == "mouse_down"
@down!
if @on
@on(e)
if e.event == "touches_ended" or e.event == "mouse_up"
@up!
Button
|