X-Git-Url: https://git.ctpug.org.za/?a=blobdiff_plain;f=koperkapel%2Fscenes%2Flevel.py;h=31e1269f281a47e3a396ce1e49e16e5fa5894e81;hb=c0c4478e4a5748feb30c0923103d90a9ecc23063;hp=d2c7d162ef28b99007850086b1a1f45ee02a74bc;hpb=20d1e19f23c04daf107ede8c9fe57b97005a37fd;p=koperkapel.git diff --git a/koperkapel/scenes/level.py b/koperkapel/scenes/level.py index d2c7d16..31e1269 100644 --- a/koperkapel/scenes/level.py +++ b/koperkapel/scenes/level.py @@ -4,14 +4,19 @@ from pgzero.constants import keys from pygame import Surface import pygame.locals as pgl from ..loaders.levelloader import levels -from .base import Scene, ChangeSceneEvent, MoveViewportEvent +from .base import Scene, ChangeSceneEvent, MoveViewportEvent, defer_to_update from ..constants import TILE_SIZE, WIDTH, HEIGHT +from ..roaches import build_roach from ..vehicles.base import Vehicle class BaseLevelScene(Scene): """ Level scene. """ + def __init__(self): + super().__init__() + self._level = None + def enter(self, world): self._level = levels.load(world.level.name) self._tiles = self._level.tiles @@ -47,22 +52,27 @@ class BaseLevelScene(Scene): def update(self, world, engine, dt): """Fix the door and keypad positions""" + super().update(world, engine, dt) for door in self._doors: - door.pos = engine.calc_offset(door.game_pos[0] * TILE_SIZE, door.game_pos[1] * TILE_SIZE) + door.pos = self.calc_offset( + door.game_pos[0] * TILE_SIZE, door.game_pos[1] * TILE_SIZE) for keypad in self._keypads: - keypad.pos = engine.calc_offset(keypad.game_pos[0] * TILE_SIZE, keypad.game_pos[1] * TILE_SIZE) + keypad.pos = self.calc_offset( + keypad.game_pos[0] * TILE_SIZE, keypad.game_pos[1] * TILE_SIZE) - def draw(self, screen, viewport): + def draw(self, screen): screen.clear() # Viewport is the position of the screen relative to the # surface. We need the position of the surface relative to # the screen for the blit, so this conversion + viewport = self.viewport screen.surface.blit(self._surfaces[self._level_layer], (0, 0), area=(viewport[0], viewport[1], WIDTH, HEIGHT)) if self._level_layer != 'floor': - screen.surface.blit(self._overlay, (0, 0), - area=(viewport[0], viewport[1], WIDTH, HEIGHT), - special_flags=pgl.BLEND_MULT) + screen.surface.blit( + self._overlay, (0, 0), + area=(viewport[0], viewport[1], WIDTH, HEIGHT), + special_flags=pgl.BLEND_MULT) self.actors.draw(screen) def on_key_down(self, key, mod, unicode): @@ -74,8 +84,11 @@ class BaseLevelScene(Scene): class GameLevelScene(BaseLevelScene): def enter(self, world): + if self._level is not None: + return super().enter(world) self._roaches = self.actors.add_layer("roaches", level=10) + self._friends = self.actors.add_layer("friendly roaches", level=9) self._vehicle = Vehicle.current(world) self._mode = 'walk' self._angle = 0 @@ -88,12 +101,17 @@ class GameLevelScene(BaseLevelScene): self._set_pos(x, y) self._avatar.pos = (WIDTH // 2, HEIGHT // 2) self._roaches.add(self._avatar) + for friend in self._level.friends: + self._friends.add(friend) # Fix viewport offset - return [MoveViewportEvent((x * TILE_SIZE - WIDTH // 2, y * TILE_SIZE - HEIGHT // 2))] + return [ + MoveViewportEvent(( + x * TILE_SIZE - WIDTH // 2, + y * TILE_SIZE - HEIGHT // 2))] def _set_pos(self, x, y): self._player_pos = (x, y) - print('Now at ', x, y) + # print('At ', (x, y)) def _can_move(self, x, y): if self._mode == 'walk': @@ -107,14 +125,33 @@ class GameLevelScene(BaseLevelScene): self._angle = angle self._avatar.angle = angle + @defer_to_update + def _vehicle_changed(self, world): + self._roaches.remove(self._avatar) + self._vehicle = Vehicle.current(world) + self._avatar = self._vehicle.get_avatar(world) + self._avatar.pos = (WIDTH // 2, HEIGHT // 2) + self._roaches.add(self._avatar) + self._set_angle(self._angle) + + @defer_to_update + def _add_roach(self, world): + world.roaches.append(build_roach(world)) + self._vehicle_changed() + + @defer_to_update + def _change_vehicle(self, world): + vehicle = Vehicle.random() + world.vehicles.current = vehicle + self._vehicle_changed() + def update(self, world, engine, dt): - if self._vehicle.changed(): - self._roaches.remove(self._avatar) - self._avatar = self._vehicle.get_avatar(world) - self._avatar.pos = (WIDTH // 2, HEIGHT // 2) - self._roaches.add(self._avatar) - self._avatar.set_angle(self._angle) super().update(world, engine, dt) + events = world.pop_events() + for friend in self._friends: + friend.pos = self.calc_offset( + friend.game_pos[0] * TILE_SIZE, friend.game_pos[1] * TILE_SIZE) + return events def on_key_down(self, key, mod, unicode): offset = None @@ -152,15 +189,21 @@ class GameLevelScene(BaseLevelScene): self._mode = 'walk' elif self._level.is_keypad(x, y): self._level.press_keypad(x, y, self._roaches) + elif self._level.is_on_friend(x, y): + friend = self._level.remove_friend(x, y) + self._friends.remove(friend) + self._add_roach() return elif key == keys.X: # Fire print('Boom') elif key == keys.V: # Leave vehicle - print('Vehicle key pressed') + self._change_vehicle() + elif key == keys.Z: + # Vehicle management + from .roach_management import RoachesScene + return[ChangeSceneEvent(RoachesScene(level_scene=self))] if offset: return [MoveViewportEvent(offset)] return super(GameLevelScene, self).on_key_down(key, mod, unicode) - -