collisions
This commit is contained in:
parent
bdba197d59
commit
237abb4aa3
@ -1,7 +1,18 @@
|
||||
from .component import Component
|
||||
from ..servers.physics import PhysicsServer
|
||||
|
||||
|
||||
class CollideRect(Component):
|
||||
def __init__(self, rect):
|
||||
def __init__(self, rect, static=True, solid=True):
|
||||
super().__init__()
|
||||
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)
|
||||
|
@ -4,7 +4,47 @@ 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 component in self._components:
|
||||
pass
|
||||
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
|
||||
|
@ -37,8 +37,10 @@ class MovingEntity(Entity):
|
||||
super().__init__()
|
||||
sprite = Sprite(surf, 1)
|
||||
self.add(sprite)
|
||||
self.add(CollideRect(Rect(self.x, self.y,
|
||||
sprite.width, sprite.width)))
|
||||
self.phys = CollideRect(Rect(self.x, self.y,
|
||||
sprite.width, sprite.width),
|
||||
static=False)
|
||||
self.add(self.phys)
|
||||
|
||||
|
||||
class Ghost(MovingEntity):
|
||||
@ -52,21 +54,34 @@ class Ghost(MovingEntity):
|
||||
|
||||
class Lvl0(Scene):
|
||||
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))
|
||||
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)
|
||||
def pacman_script(entity):
|
||||
p = pacman.phys
|
||||
inputs = key.get_pressed()
|
||||
if inputs[K_UP]:
|
||||
entity.y -= 2
|
||||
# entity.y -= 2
|
||||
p.vy = -v
|
||||
if inputs[K_DOWN]:
|
||||
entity.y += 2
|
||||
# entity.y += 2
|
||||
p.vy = v
|
||||
if inputs[K_LEFT]:
|
||||
entity.x -= 2
|
||||
# entity.x -= 2
|
||||
p.vx = -v
|
||||
if inputs[K_RIGHT]:
|
||||
entity.x += 2
|
||||
# entity.x += 2
|
||||
p.vx = v
|
||||
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(Level('lvl0.png'))
|
||||
|
Reference in New Issue
Block a user