From: Simon Cross Date: Sat, 5 Mar 2016 13:29:39 +0000 (+0200) Subject: Merge branch 'master' of ctpug.org.za:koperkapel X-Git-Url: https://git.ctpug.org.za/?p=koperkapel.git;a=commitdiff_plain;h=20d1e19f23c04daf107ede8c9fe57b97005a37fd;hp=dda49d4fadc602bd8bc87137124843994e4c4e36 Merge branch 'master' of ctpug.org.za:koperkapel --- diff --git a/koperkapel/actors/orientatedsurf.py b/koperkapel/actors/orientatedsurf.py index 6db8570..720bb20 100644 --- a/koperkapel/actors/orientatedsurf.py +++ b/koperkapel/actors/orientatedsurf.py @@ -4,6 +4,7 @@ from pygame.transform import rotate from pgzero.actor import POS_TOPLEFT, ANCHOR_CENTER from .surf import SurfActor +from ..constants import TILE_SIZE class OrientatedSurfActor(SurfActor): @@ -22,8 +23,12 @@ class OrientatedSurfActor(SurfActor): @angle.setter def angle(self, angle): + cur_anchor = self._anchor_value + if angle not in (self._angle, self._angle + 180, self._angle - 180): + self._anchor_value = (cur_anchor[1], cur_anchor[0]) self._angle = angle self._surf = self._orig_surf = rotate(self._base_surf, angle) + print(self.anchor, self.angle) @property def surf(self): diff --git a/koperkapel/images/roach_management/inventory_pad.png b/koperkapel/images/roach_management/inventory_pad.png index ed524fd..b3fe662 100644 Binary files a/koperkapel/images/roach_management/inventory_pad.png and b/koperkapel/images/roach_management/inventory_pad.png differ diff --git a/koperkapel/roaches.py b/koperkapel/roaches.py index 6dedf30..95353ee 100644 --- a/koperkapel/roaches.py +++ b/koperkapel/roaches.py @@ -33,6 +33,15 @@ class RoachActor(OrientatedSurfActor): self.surf = self._frames[self._frame] +class WorldRoach(object): + """A roach proxy with no properties for display on the game level.""" + + def __init__(self): + self.smart = False + self.strong = False + self.fast = False + + class RoachFactory: def __init__(self, suffix, frames=4): @@ -59,3 +68,5 @@ default_roaches = RoachFactory("") t32_roaches = RoachFactory("_32") t21_roaches = RoachFactory("_21") big_roaches = RoachFactory("_big") +roaches_quartet = RoachFactory("_quartet") +roaches_nonet = RoachFactory("_nonet") diff --git a/koperkapel/scenes/level.py b/koperkapel/scenes/level.py index ea37e15..d2c7d16 100644 --- a/koperkapel/scenes/level.py +++ b/koperkapel/scenes/level.py @@ -6,7 +6,7 @@ import pygame.locals as pgl from ..loaders.levelloader import levels from .base import Scene, ChangeSceneEvent, MoveViewportEvent from ..constants import TILE_SIZE, WIDTH, HEIGHT -from ..roaches import default_roaches +from ..vehicles.base import Vehicle class BaseLevelScene(Scene): @@ -76,17 +76,18 @@ class GameLevelScene(BaseLevelScene): def enter(self, world): super().enter(world) self._roaches = self.actors.add_layer("roaches", level=10) + self._vehicle = Vehicle.current(world) self._mode = 'walk' - return self._init_roaches(world.roaches) + self._angle = 0 + return self._init_roaches(world) - def _init_roaches(self, roaches): - for roach in roaches: - roach_actor = self._roaches.add(default_roaches.assemble(roach)) - roach_actor.anchor = (0, 0) - roach_actor.pos = (WIDTH // 2, HEIGHT // 2) + def _init_roaches(self, world): x, y = self._level.start_pos - self._set_pos(x, y) self._level_layer = 'floor' + self._avatar = self._vehicle.get_avatar(world) + self._set_pos(x, y) + self._avatar.pos = (WIDTH // 2, HEIGHT // 2) + self._roaches.add(self._avatar) # Fix viewport offset return [MoveViewportEvent((x * TILE_SIZE - WIDTH // 2, y * TILE_SIZE - HEIGHT // 2))] @@ -103,8 +104,17 @@ class GameLevelScene(BaseLevelScene): return self._level.can_crawl(x, y, self._level_layer) def _set_angle(self, angle): - for roach in self._roaches: - roach.angle = angle + self._angle = angle + self._avatar.angle = angle + + 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) def on_key_down(self, key, mod, unicode): offset = None @@ -149,7 +159,6 @@ class GameLevelScene(BaseLevelScene): elif key == keys.V: # Leave vehicle print('Vehicle key pressed') - if offset: return [MoveViewportEvent(offset)] return super(GameLevelScene, self).on_key_down(key, mod, unicode) diff --git a/koperkapel/vehicles/base.py b/koperkapel/vehicles/base.py index c2a24f6..47588a5 100644 --- a/koperkapel/vehicles/base.py +++ b/koperkapel/vehicles/base.py @@ -16,6 +16,7 @@ class Vehicle: def __init__(self): self.seats = self.init_seats() + self.game_pos = (0, 0) def roach_management_overlay(self): return Actor("vehicles/%s/background" % (self.vehicle_type,)) @@ -66,6 +67,9 @@ class Vehicle: from .walking import Walking cls.register(Walking) + def get_avatar(self, world): + raise NotImplementedError("Vehicles should know how to create their own avatars.") + class Seat: """ A space in a vehicle for a roach. diff --git a/koperkapel/vehicles/walking.py b/koperkapel/vehicles/walking.py index 9c19aa2..aa88bc6 100644 --- a/koperkapel/vehicles/walking.py +++ b/koperkapel/vehicles/walking.py @@ -2,7 +2,7 @@ import math from .base import Vehicle, Seat - +from ..roaches import default_roaches, roaches_quartet, roaches_nonet, WorldRoach class Walking(Vehicle): @@ -17,3 +17,20 @@ class Walking(Vehicle): pos=(math.sin(i * d_theta), math.cos(i * d_theta))) for i in range(n_seats) ] + + def get_avatar(self, world): + num_roaches = len(world.roaches) + roach = WorldRoach() + if num_roaches == 1: + # Return a single large roach + avatar = default_roaches.assemble(roach) + avatar.anchor = (0, 0) + elif num_roaches < 6: + avatar = roaches_quartet.assemble(roach) + avatar.anchor = (-16, 0) + else: + avatar = roaches_nonet.assemble(roach) + return avatar + + def changed(self): + return False diff --git a/sources/vector/roach_management/inventory_pad.svg b/sources/vector/roach_management/inventory_pad.svg index a600548..4c7e48a 100644 --- a/sources/vector/roach_management/inventory_pad.svg +++ b/sources/vector/roach_management/inventory_pad.svg @@ -26,7 +26,7 @@ inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="1.413958" - inkscape:cx="117.75416" + inkscape:cx="4.5966263" inkscape:cy="188.28195" inkscape:document-units="px" inkscape:current-layer="layer1" @@ -55,7 +55,7 @@ id="layer1" transform="translate(0,-700.36216)">