-
Notifications
You must be signed in to change notification settings - Fork 0
/
GraphicModels.py
155 lines (133 loc) · 4.84 KB
/
GraphicModels.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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
from Settings import *
class Block:
'''
THIS IS A INTERFACE
All classes that use pygame Surface should inherit this
'''
def __init__(self):
self.image = None
self.pos = None
def move(self, x, y):
self.pos = self.pos.move( x, y )
return self.pos
class Obstacles( Block ):
"""
Obstacles that source object has to avoid to reach destination object
"""
def __init__(self, x, y, width, height):
self.image = pygame.Surface( (width, height) )
self.image.fill( Color.brown )
self.pos = pygame.Rect( x, y, width, height )
class Source( Block ):
'''
Source is the 25 X 25 object that moves and reaches the destination
'''
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface( ( S_D_SIZE, S_D_SIZE ) )
self.image.fill( Color.green )
self.pos = self.image.get_rect()
self.move( x, y )
class Destination( Block ):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface( ( S_D_SIZE, S_D_SIZE ) )
self.image.fill( Color.red )
self.pos = self.image.get_rect()
self.move( x, y )
class SourcePath( pygame.Rect ):
'''
-SourcePath are pygame rect objects whose dimension are equal to that of source
-Each step a source takes is an instance of SourcePath
-They act like stepping stone for Source. And when one of the instances of Source Path,
collides with the destination, then the complete set of sourcePaths are traced out using
parent child relationship
- has and eq are modified so to detect if the current SourcePath had already been visited
'''
def __init__(self, x, y):
super().__init__( x, y, S_D_SIZE, S_D_SIZE)
self.parent = None
self.child = None
def __hash__(self):
'''
if source path had x 10 and y 10 then the hash would be equal to that of (10-10)
'''
return hash( str(self.x) + "-" + str(self.y) )
def __eq__(self, other):
'''
Two source path objects are equal if their x's and y's match
'''
if type(other) == SourcePath:
return self.x == other.x and self.y == other.y
return False
class Button(Block):
'''
Buttons on the MENU_PORTION of the screen
'''
def __init__(self, name):
"""
@param name, Text inscribed inside button
"""
super().__init__()
self.name = name
self.image = Button._makeButton( name )
self.pos = self.image.get_rect()
@staticmethod
def _makeButton(text):
'''
returns a Surface object that encapsulates the text surface with 5px padding
All the button objects are initialized this way
'''
text = Font.render( text, False, Color.white )
textArea = text.get_rect()
#makes the surface that encapsulates text lil bit bigger than text object
surf = pygame.Surface( (textArea.width + 10, textArea.height + 10) )
surf.fill( Color.grey )
#centering the textObject inside the surface
textArea= textArea.move( 5, 5)
surf.blit( text, textArea )
return surf
class ButtonGroup:
def __init__(self):
self.buttons = []
def check_if_triggered(self):
'''
Checks if the any of the buttons is self.buttons was clicked
If the buttton was clicked and it had event_handler registered, returns the button
'''
click = pygame.mouse.get_pos()
x, y = click[0], click[1]
dummy_rect = pygame.Rect( x, y, 1, 1)
for i in self.buttons:
if (dummy_rect.colliderect( i.pos )):
return i
def add(self, button):
self.buttons.append( button )
def bulk_add(self, buttons):
for button in buttons:
self.buttons.append( button )
class RenderButtonGroup( ButtonGroup ):
'''
-Buttons that could be aligned and rendered horizontally make use of this class
-After adding each button they are immediately blitted with supposition that,
buttons are placed in menu section and menu section display is not flushed everytime rendering happens
'''
def __init__(self, spacing = 10):
super().__init__()
self.spacing = spacing
#Override
def add(self, button):
self.renderButton( button )
self.buttons.append( button )
#Override
def bulk_add( self, buttons):
for button in buttons:
self.renderButton( button )
self.buttons.append( button )
def renderButton( self, button ):
if len(self.buttons) == 0:
button.move( self.spacing, 0)
else:
lastButton = self.buttons[-1]
button.move( lastButton.pos.x + lastButton.pos.width + self.spacing, 0 )
blit( button )