-
Notifications
You must be signed in to change notification settings - Fork 0
/
Menu.py
117 lines (94 loc) · 3.57 KB
/
Menu.py
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
from direct.showbase.DirectObject import DirectObject
from direct.gui.OnscreenImage import OnscreenImage
from pandac.PandaModules import TransparencyAttrib
class Menu(DirectObject):
MENU_TEXT = 0
MENU_VAL = 1
MENU_IMAGE = 2
MENU_X = 0
MENU_Y = 0
MENU_DX = 0
MENU_DY = -.4
IMAGE_SCALE = .2
IMAGE_SELECTED = 0
IMAGE_DESELECTED = 1
KEY_FORWARD = 'arrow_down'
KEY_BACKWARD = 'arrow_up'
KEY_SELECT = 'enter'
def __init__(self, menuOptions = None, position = (0, 0)):
if menuOptions != None:
self._menuOptions = menuOptions
else:
self._menuOptions = [
('Play', 0, 'menu_play'),
('Quit', 1, 'menu_quit')
]
self._selection = 0
self._selected = False
self._rootNode = aspect2d.attachNewNode('menuRootNode')
self._rootNode.setPos((position[0], 0, position[1]))
self._menuImages = []
x = self.MENU_X
y = self.MENU_Y
for item in self._menuOptions:
filename = 'textures/' + item[self.MENU_IMAGE]
df = filename + '_deselected.png'
sf = filename + '_selected.png'
deselected = OnscreenImage(image = df, pos = (x, 0, y), parent = self._rootNode)
selected = OnscreenImage(image = sf, pos = (x, 0, y), parent = self._rootNode)
self._menuImages.append((selected, deselected))
selected.hide()
for i in [selected, deselected]:
i.setScale(self.IMAGE_SCALE)
i.setTransparency(TransparencyAttrib.MAlpha)
x += self.MENU_DX
y += self.MENU_DY
self.accept(self.KEY_FORWARD, self.moveForward)
self.accept(self.KEY_BACKWARD, self.moveBackward)
self.accept(self.KEY_SELECT, self.makeSelection)
self.setSelectionIndex(self._selection)
def setSelectionIndex(self, newSelection):
self._setMenuItemState(self._selection, False)
self._selection = newSelection
self._setMenuItemState(self._selection, True)
def getSelectionIndex(self):
return self._selection
def getSelection(self):
'''returns the value corresponding to the menu item currently selected.
Use this method instead of getSelectionIndex.'''
return self._menuOptions[self._selection][self.MENU_VAL]
def getLen(self):
return len(self._menuOptions)
def moveForward(self):
a = self.getSelectionIndex()
a += 1
if a < self.getLen():
self.setSelectionIndex(a)
def moveBackward(self):
a = self.getSelectionIndex()
a -= 1
if a >= 0:
self.setSelectionIndex(a)
def makeSelection(self):
self._selected = True
self._setMenuItemState(self._selection, False)
# TODO do some animation to show selection was made?
self.ignore(self.KEY_BACKWARD)
self.ignore(self.KEY_FORWARD)
def _setMenuItemState(self, index, selected):
if index < 0 or index > self.getLen():
raise Exception('menu item index out of range')
a = self._menuImages[index]
if selected == True:
a[self.IMAGE_SELECTED].show()
a[self.IMAGE_DESELECTED].hide()
elif selected == False:
a[self.IMAGE_SELECTED].hide()
a[self.IMAGE_DESELECTED].show()
else:
raise Exception('Invalid selection state: must be true or false')
def getSelected(self):
return self._selected
def destroy(self):
self._rootNode.removeNode()
self.ignoreAll()