From 9dac58f8bd5120e73a4ac879bfc3059dd7ef58c6 Mon Sep 17 00:00:00 2001 From: papush! Date: Mon, 9 Dec 2019 12:36:42 +0100 Subject: [PATCH] lol le retard --- engine/components/collide_rect.py | 18 ++-- engine/components/component.py | 9 +- engine/components/sprite.py | 4 +- engine/entity.py | 10 +- engine/game.py | 3 + engine/scene.py | 5 + engine/servers/physics.py | 8 +- res/pacman_1.png | Bin 0 -> 9817 bytes res/pacman_2.png | Bin 0 -> 739 bytes scenes/__init__.py | 0 scenes/game_objects/__init__.py | 0 scenes/game_objects/common.py | 1 + scenes/game_objects/ghost.py | 77 ++++++++++++++ scenes/game_objects/level.py | 39 +++++++ scenes/game_objects/pacdot.py | 34 ++++++ scenes/game_objects/pacman.py | 80 ++++++++++++++ scenes/lvl0.py | 170 ++---------------------------- 17 files changed, 282 insertions(+), 176 deletions(-) create mode 100644 res/pacman_1.png create mode 100644 res/pacman_2.png create mode 100644 scenes/__init__.py create mode 100644 scenes/game_objects/__init__.py create mode 100644 scenes/game_objects/common.py create mode 100644 scenes/game_objects/ghost.py create mode 100644 scenes/game_objects/level.py create mode 100644 scenes/game_objects/pacdot.py create mode 100644 scenes/game_objects/pacman.py diff --git a/engine/components/collide_rect.py b/engine/components/collide_rect.py index 3ca7d8d..39a6133 100644 --- a/engine/components/collide_rect.py +++ b/engine/components/collide_rect.py @@ -3,21 +3,23 @@ from ..servers.physics import PhysicsServer class CollideRect(Component): - def __init__(self, parent, rect, static=True, solid=True, cb=None): - super().__init__(parent) + def __init__(self, rect, static=True, solid=True, cb=None): + super().__init__() self.rect = rect - def x_change_cb(x): - self.rect.x = x - def y_change_cb(y): - self.rect.y = y - parent.subscribe('x', x_change_cb) - parent.subscribe('y', y_change_cb) self.static = static self.solid = solid self.cb = cb self.vx = 0 self.vy = 0 + def load(self): + def x_change_cb(x): + self.rect.x = x + def y_change_cb(y): + self.rect.y = y + self.parent.subscribe('x', x_change_cb) + self.parent.subscribe('y', y_change_cb) + def register(self): PhysicsServer().register_component(self) diff --git a/engine/components/component.py b/engine/components/component.py index 9da54ce..4e8a434 100644 --- a/engine/components/component.py +++ b/engine/components/component.py @@ -2,9 +2,12 @@ from abc import abstractmethod class Component: - def __init__(self, parent): - self.parent = parent - self.parent.add(self) + def __init__(self): + self.parent = None + + @abstractmethod + def load(self): + pass @abstractmethod def register(self): diff --git a/engine/components/sprite.py b/engine/components/sprite.py index 0fbfca4..f176b21 100644 --- a/engine/components/sprite.py +++ b/engine/components/sprite.py @@ -3,8 +3,8 @@ from ..servers.graphics import GraphicsServer class Sprite(Component): - def __init__(self, parent, surf, z): - super().__init__(parent) + def __init__(self, surf, z): + super().__init__() self.surf = surf self.width = self.surf.get_width() self.z = z diff --git a/engine/entity.py b/engine/entity.py index 8252e78..3b6a1c8 100644 --- a/engine/entity.py +++ b/engine/entity.py @@ -1,15 +1,23 @@ from .observer import Observer class Entity(Observer): - def __init__(self): + def __init__(self, name): super().__init__() self._components = [] + self.name = name + self.scene = None self.x = 0 self.y = 0 self.script = None + def load(self): + pass + def add(self, component): + component.parent = self + component.load() self._components.append(component) + return component def register(self): for component in self._components: diff --git a/engine/game.py b/engine/game.py index da21da4..3dae30f 100644 --- a/engine/game.py +++ b/engine/game.py @@ -8,6 +8,8 @@ from .scene_manager import SceneManager class Game: + cur_tick = 0 + def __init__(self, start_scene): self._graphics_server = GraphicsServer() self._sound_server = SoundServer() @@ -26,4 +28,5 @@ class Game: self._physics_server.step() self._sound_server.step() self._graphics_server.step() + Game.cur_tick += 1 clock.tick(60) diff --git a/engine/scene.py b/engine/scene.py index ede4c0f..7a7ae3e 100644 --- a/engine/scene.py +++ b/engine/scene.py @@ -2,6 +2,11 @@ class Scene: def __init__(self): self.entities = {} + def add(self, entity): + self.entities[entity.name] = entity + entity.scene = self + entity.load() + def unload(self): for entity in self.entities.values(): entity.unregister() diff --git a/engine/servers/physics.py b/engine/servers/physics.py index 4f3b55e..bdcc2de 100644 --- a/engine/servers/physics.py +++ b/engine/servers/physics.py @@ -34,7 +34,9 @@ class PhysicsServer(Server): c = self._check_collide(d) if c is not None: if c.cb: - c.cb() + c.cb(d) + if d.cb: + d.cb(c) if c.solid: d.parent.x -= x_step d.vx = 0 @@ -44,7 +46,9 @@ class PhysicsServer(Server): c = self._check_collide(d) if c is not None: if c.cb: - c.cb() + c.cb(d) + if d.cb: + d.cb(c) if c.solid: d.parent.y -= y_step d.vy = 0 diff --git a/res/pacman_1.png b/res/pacman_1.png new file mode 100644 index 0000000000000000000000000000000000000000..1357dcb2ec5feccc9f8707e46d5e6edcae56069c GIT binary patch literal 9817 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 Lu6{1-oD!MEt$^F0iMpz3I#>^X_+~x z3=A3*YbV-z9Cna78XvthR7>{Ff=3e;T15(o7GBX3S?IJvG^*5K=NIl-CMueGeNEX1 z5B48j)!e;#9pAbpg&&NM9=%%fLP_JK%CS$WN3KQS;DRGQwSFSOA7tXcfB5)S@7(4+=l@#%nzH94!+Zyu( zx25FV?<0X>lSCdBKQe6A^Z0Y3^yX9ZbFS@wZH%*0E`2@{n6&W5!6Np}lNJj33mz8< zU0hRtEw%NtSo+qW)FUW$iWdDtC$2kPRIa zY}8-mxYY%(OI|gR|T`3-YA`4#Xi!^*U{TC%S{pc!@$5GS>hT|;+&tGo0?a`;9QiNSdyBeP@Y+m zq2TW68xY>eC(gjYaMshsF~s8Z(kZrFEd~N^^LO2-X6ApuXw!6D_zf$+V$<^td|{cv zzxTIB7M8~L*44NQRm@CO6TYE&dWF`MBnb(&DT`K}F!GzS%;TiV-)&Qtykv}=*7I1= zvRX#-v}~lv{~3{|w`qi>OuA6YR&afyihM-J 0: + s.surf = self.surf[self.cur_anim][1] + elif p.vx < 0: + s.surf = self.surf[self.cur_anim][2] + elif p.vx > 0: + s.surf = self.surf[self.cur_anim][3] + + inputs = key.get_pressed() + if PacMan.SIZE > 1: + p.vx = 0 + p.vy = 0 + if inputs[K_UP]: + p.vy = -PacMan.SPEED + if inputs[K_DOWN]: + p.vy = PacMan.SPEED + if inputs[K_LEFT]: + p.vx = -PacMan.SPEED + if inputs[K_RIGHT]: + p.vx = PacMan.SPEED diff --git a/scenes/lvl0.py b/scenes/lvl0.py index 09e4614..de8aa9d 100644 --- a/scenes/lvl0.py +++ b/scenes/lvl0.py @@ -1,169 +1,19 @@ -from engine.resources import res from engine.scene import Scene -from engine.entity import Entity -from engine.components.sprite import Sprite -from engine.components.collide_rect import CollideRect -from engine.servers.graphics import GraphicsServer -from engine.scene_manager import SceneManager -from pygame import Rect -from pygame import image -from pygame import Surface -from pygame import draw -from pygame.locals import * -from pygame import key -from itertools import product - -S=20 - - -entities=[] - - -class PacDot(Entity): - s = Surface((S, S)) - draw.circle(s, (255, 255, 0), (S//2, S//2), S//4) - - def __init__(self): - super().__init__() - CollideRect(self, Rect(0, 0, S, S), - static=True, solid=False, cb=self.cb) - Sprite(self, PacDot.s, 1) - - def cb(self): - self.unregister() - - -def path(start, tgt, x, y, trace, length): - if start == tgt: - return length - if start is None or trace[y][x]: - return False - trace[y][x] = True - u = path(start.up, tgt, x, y-1, trace, length + 1) - d = path(start.down, tgt, x, y+1, trace, length + 1) - l = path(start.left, tgt, x-1, y, trace, length + 1) - r = path(start.right, tgt, x+1, y, trace, length + 1) - best = None - for subpath in (u, d, l, r): - if subpath and (best is None or subpath < best): - best = subpath - return best - - -class Node(): - def __init__(self): - self.up = None - self.down = None - self.left = None - self.right = None - - -graph = None - - -class Level(Entity): - def __init__(self, path): - super().__init__() - desc = image.load(res(path)) - w, h = desc.get_size() - GraphicsServer().resize((w * S, h * S)) - # graph = [[None for x in range(w)] for y in range(h)] - self.surf = Surface((w * S, h * S)).convert() - self.surf.fill((0, 0, 0)) - wall = Surface((S, S)).convert() - wall.fill((0, 0, 255)) - for x, y in product(range(w), range(h)): - col = desc.get_at((x, y)) - if col == (0, 0, 255): - CollideRect(self, Rect(x * S, y * S, S, S)) - self.surf.blit(wall, (x * S, y * S)) - elif col == (139, 139, 139): - pc = PacDot() - pc.x = x * S - pc.y = y * S - entities.append(pc) - # elif col == (0, 0, 0): - # graph[y][x] = Node() - # for y, line in enumerate(graph): - # for x, node in enumerate(line): - # if node is None: - # continue - # if x > 0: - # node.left = graph[y][x-1] - # if x < w: - # node.right = graph[y][x+1] - # if y > 0: - # node.up = graph[y-1][x] - # if y < h: - # node.down = graph[y+1][y] - Sprite(self, self.surf, 0) - - -class MovingEntity(Entity): - def __init__(self, surf): - super().__init__() - sprite = Sprite(self, surf, 2) - self.phys = CollideRect( - self, - Rect(self.x, self.y, sprite.width, sprite.width), - static=False) - - -class Ghost(MovingEntity): - def __init__(self): - super().__init__(image.load(res('ghost.png')).convert()) - self.script = Ghost.script - - def script(self): - # cur_node = graph[self.y//S][self.x//S] - pacman = SceneManager().scene.entities['pacman'] - # pacman_node = graph[pacman.y//S][pacman.x//S] - x_dist = pacman.x - self.x - y_dist = pacman.y - self.y - s = 1 - self.phys.vx = s if x_dist > 0 else -s - self.phys.vy = s if y_dist > 0 else -s +from .game_objects.common import S +from .game_objects.level import Level +from .game_objects.pacman import PacMan +from .game_objects.ghost import Ghost class Lvl0(Scene): def load(self): - T = 1 - 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*T), S//(2*T)), S//(2*T)) - pacman = MovingEntity(pac_surf) - def pacman_script(entity): - p = pacman.phys - inputs = key.get_pressed() - if T > 1: - p.vx = 0 - p.vy = 0 - if inputs[K_UP]: - p.vy = -v - if inputs[K_DOWN]: - p.vy = v - if inputs[K_LEFT]: - p.vx = -v - if inputs[K_RIGHT]: - p.vx = v - pacman.script = pacman_script - pacman.x = pacman.phys.rect.x = S*1 - pacman.y = pacman.phys.rect.y = S*1 - - pacman.phys.rect.w = S//T - pacman.phys.rect.h = S//T - - self.entities['level'] = Level('lvl0.png') - for i, entity in enumerate(entities): - self.entities[f'pacdot-{i}'] = entity - self.entities['pacman'] = pacman - self.entities['ghost'] = Ghost() - self.entities['ghost'].x = S*6 - self.entities['ghost'].y = S*2 - + self.add(Level('lvl0.png')) + self.add(PacMan(S, S)) + self.add(Ghost(S*6, S*2)) + self.add(Ghost(S*6, S*13)) + self.add(Ghost(S*18, S*13)) + self.add(Ghost(S*8, S*23)) super().load()