-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathul_framework.py
More file actions
149 lines (117 loc) · 4.02 KB
/
ul_framework.py
File metadata and controls
149 lines (117 loc) · 4.02 KB
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
import pygame, sys
size = width, height = 320, 240
class Controller:
""""
Clase Controladora Generica.
Solamente se debe de sobreescribir el metodo on_create.
"""
def __init__(self):
self._views = []
self.on_create()
def on_create(self):
""" Metodo a sobreescribir que se ejecutara al inicializar la pantalla"""
pass
def add_view(self, view):
self._views.append(view)
def _render(self, screen):
for view in self._views:
view._render(screen)
def _update(self):
for view in self._views:
view._update()
def serve_event(self, event):
if event["type"] == "QUIT":
sys.exit()
for view in self._views:
view.serve_event(event)
class ControllerManager:
"""
Clase encargada de la gestion de los distintos controllers (pantallas)
que puede manejar una aplicacion.
"""
def __init__(self, event_queue):
self._controllers = []
self._event_queue = event_queue
def push_controller(self, controller):
self._event_queue.add_observer(controller)
self._controllers.append(controller)
def get_controller(self):
return self._controllers[len(self._controllers)-1]
def pop_controller(self):
self._controllers.pop()
return self._controllers[len(self._controllers)-1]
class View:
"""
Clase Generica de View.
Debe implementar el metodo _update para definir como se vera
el componente grafico.
"""
def __init__(self, ruta_imagen):
self._imagen = pygame.image.load(ruta_imagen)
self._rect = self._imagen.get_rect()
#observadores
self._observers = []
def serve_event(self, event):
if event["type"] == "MOUSE_CLICK":
for observer in self._observers:
observer.on_click(event)
def set_onclick_observer(self, observer):
self._observers.append(observer)
def _render(self, screen):
screen.blit(self._imagen, self._rect)
def _update(self):
pass
class GameMain:
"""
Clase que representar al juego.
"""
_BLACK = 0, 0, 0
def __init__(self):
pygame.init()
self._screen = pygame.display.set_mode(size)
self._event_queue = EventQueue()
self._controller_manager = ControllerManager(self._event_queue)
def start_controller(self, controller):
"""
Metodo para setear un controller en la pila de controllers.
Keyword arguments:
controller -- Controlador que se iniciara y se vera en pantalla.
"""
self._controller_manager.push_controller(controller)
def start(self):
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
self._event_queue.post({
"type" : "QUIT"
})
if event.type == pygame.MOUSEBUTTONUP:
posx, posy = pygame.mouse.get_pos()
self._event_queue.post({
"type" : "MOUSE_CLICK",
"x" : posx,
"y" : posy
})
self._screen.fill(GameMain._BLACK)
self._event_queue.dispatch()
self._controller_manager.get_controller()._update()
self._controller_manager.get_controller()._render(self._screen)
#self._screen.blit(ball, ballrect)
pygame.display.flip()
class EventQueue:
"""
Cola de eventos.
Tener en cuenta que se sirve esta cola de manera lineal (no asincrona).
"""
def __init__(self):
self._events = []
self._observers = []
def add_observer(self, view):
self._observers.append(view)
def post(self, event):
self._events.append(event)
def dispatch(self):
for event in self._events:
for observer in self._observers:
observer.serve_event(event)
self._events = []