papush!
e8be8b52ab
implémentation du patron Observateur dans la classe Observer qui permet à un objet d’être notifié quand une propriété d’un autre objet est modifiée. CollideRect observe maintenant les propriétés x et y de l’entité à laquelle il appartient et met à jour son rect accordément.
51 lines
1.6 KiB
Python
51 lines
1.6 KiB
Python
from .server import Server
|
|
|
|
|
|
class PhysicsServer(Server):
|
|
def __init__(self):
|
|
super().__init__()
|
|
self._static = []
|
|
self._dynamic = []
|
|
|
|
def register_component(self, component):
|
|
if component.solid:
|
|
if component.static:
|
|
self._static.append(component)
|
|
else:
|
|
self._dynamic.append(component)
|
|
else:
|
|
self._area.append(component)
|
|
|
|
def unregister_component(self, component):
|
|
self._static.remove(component)
|
|
self._dynamic.remove(component)
|
|
|
|
def step(self):
|
|
for d in self._dynamic:
|
|
for x in range(abs(d.vx)):
|
|
stop = False
|
|
for s in self._static:
|
|
if s.rect.colliderect(d.rect):
|
|
stop = True
|
|
break
|
|
if stop:
|
|
d.parent.x += -1 if d.vx > 0 else 1
|
|
d.rect.x = d.parent.x
|
|
break
|
|
d.parent.x += 1 if d.vx > 0 else -1
|
|
# d.rect.x = d.parent.x
|
|
for y in range(abs(d.vy)):
|
|
stop = False
|
|
for s in self._static:
|
|
if s.rect.colliderect(d.rect):
|
|
stop = True
|
|
break
|
|
if stop:
|
|
d.parent.y += -1 if d.vy > 0 else 1
|
|
d.rect.y = d.parent.y
|
|
break
|
|
d.parent.y += 1 if d.vy > 0 else -1
|
|
# d.rect.y = d.parent.y
|
|
d.vx = 0
|
|
d.vy = 0
|