collisions

This commit is contained in:
papush! 2019-12-05 11:31:53 +01:00
parent bdba197d59
commit 237abb4aa3
3 changed files with 77 additions and 11 deletions

View File

@ -1,7 +1,18 @@
from .component import Component from .component import Component
from ..servers.physics import PhysicsServer
class CollideRect(Component): class CollideRect(Component):
def __init__(self, rect): def __init__(self, rect, static=True, solid=True):
super().__init__() super().__init__()
self.rect = rect self.rect = rect
self.static = static
self.solid = solid
self.vx = 0
self.vy = 0
def register(self):
PhysicsServer().register_component(self)
def unregister(self):
PhysicsServer().register_component(self)

View File

@ -4,7 +4,47 @@ from .server import Server
class PhysicsServer(Server): class PhysicsServer(Server):
def __init__(self): def __init__(self):
super().__init__() 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): def step(self):
for component in self._components: for d in self._dynamic:
pass 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

View File

@ -37,8 +37,10 @@ class MovingEntity(Entity):
super().__init__() super().__init__()
sprite = Sprite(surf, 1) sprite = Sprite(surf, 1)
self.add(sprite) self.add(sprite)
self.add(CollideRect(Rect(self.x, self.y, self.phys = CollideRect(Rect(self.x, self.y,
sprite.width, sprite.width))) sprite.width, sprite.width),
static=False)
self.add(self.phys)
class Ghost(MovingEntity): class Ghost(MovingEntity):
@ -52,21 +54,34 @@ class Ghost(MovingEntity):
class Lvl0(Scene): class Lvl0(Scene):
def load(self): def load(self):
pac_surf = Surface((S, S)).convert() T = 2
v = 2
pac_surf = Surface((S//T, S//T)).convert()
pac_surf.fill((0, 0, 0)) pac_surf.fill((0, 0, 0))
draw.circle(pac_surf, (255, 255, 0), (S//2, S//2), S//2) draw.circle(pac_surf, (255, 255, 0), (S//(2*T), S//(2*T)), S//(2*T))
pacman = MovingEntity(pac_surf) pacman = MovingEntity(pac_surf)
def pacman_script(entity): def pacman_script(entity):
p = pacman.phys
inputs = key.get_pressed() inputs = key.get_pressed()
if inputs[K_UP]: if inputs[K_UP]:
entity.y -= 2 # entity.y -= 2
p.vy = -v
if inputs[K_DOWN]: if inputs[K_DOWN]:
entity.y += 2 # entity.y += 2
p.vy = v
if inputs[K_LEFT]: if inputs[K_LEFT]:
entity.x -= 2 # entity.x -= 2
p.vx = -v
if inputs[K_RIGHT]: if inputs[K_RIGHT]:
entity.x += 2 # entity.x += 2
p.vx = v
pacman.script = pacman_script pacman.script = pacman_script
pacman.x = pacman.phys.rect.x = S*15
pacman.y = pacman.phys.rect.y = S*15
pacman.phys.rect.w = S//T
pacman.phys.rect.h = S//T
self.entities.append(pacman) self.entities.append(pacman)
self.entities.append(Level('lvl0.png')) self.entities.append(Level('lvl0.png'))