From e288cc4e11b3d1ed788c0c5fc201423bc8af39d9 Mon Sep 17 00:00:00 2001 From: Sakse Dalum Date: Fri, 10 Aug 2012 14:43:08 +0200 Subject: [PATCH] The robot now works when using levers. --- robotgame/player.py | 138 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 106 insertions(+), 32 deletions(-) diff --git a/robotgame/player.py b/robotgame/player.py index a0e9271..32bc54d 100644 --- a/robotgame/player.py +++ b/robotgame/player.py @@ -30,6 +30,7 @@ import os import worldobject import boulder +import lever class Player(worldobject.WorldObject): def __init__(self, level, x, y, z=1, movable=True): @@ -42,6 +43,8 @@ class Player(worldobject.WorldObject): self.frame = 0 self.anim_speed = 15 + self.working = False + self.ignore_list.append(boulder.Boulder) self.load() @@ -57,7 +60,32 @@ class Player(worldobject.WorldObject): ('carry_up', os.path.join('robot_carry', 'up')), ('carry_down', os.path.join('robot_carry', 'down')), ('carry_right', os.path.join('robot_carry', 'right')), - ('carry_left', os.path.join('robot_carry', 'right'))] + ('carry_left', os.path.join('robot_carry', 'right')), + + # Lever + + ('lever_down_right', os.path.join('robot_lever', 'down_left')), + ('lever_down_left', os.path.join('robot_lever', 'down_left')), + ('lever_down_up', os.path.join('robot_lever', 'vertical_down')), + ('lever_down_down', os.path.join('robot_lever', 'vertical_down')), + + ('lever_right_right', os.path.join('robot_lever', + 'right_horizontal')), + ('lever_right_left', os.path.join('robot_lever', + 'right_horizontal')), + ('lever_right_up', os.path.join('robot_lever', 'right_down')), + ('lever_right_down', os.path.join('robot_lever', 'right_down')), + + ('lever_up_right', os.path.join('robot_lever', 'up_right')), + ('lever_up_left', os.path.join('robot_lever', 'up_right')), + ('lever_up_up', os.path.join('robot_lever', 'vertical_up')), + ('lever_up_down', os.path.join('robot_lever', 'vertical_up')), + + ('lever_left_right', os.path.join('robot_lever', 'right_down')), + ('lever_left_left', os.path.join('robot_lever', 'right_down')), + ('lever_left_up', os.path.join('robot_lever', 'right_down')), + ('lever_left_down', os.path.join('robot_lever', 'right_down')) + ] ): self.imgs[anim] = [] @@ -75,13 +103,25 @@ class Player(worldobject.WorldObject): img = pygame.image.load(f) # Special treatment: - if anim in ['idle_left', 'carry_left']: + if anim in ['idle_left', 'carry_left', + 'lever_down_right', 'lever_left_down', + 'lever_up_left']: img = pygame.transform.flip(img, 1, 0) self.imgs[anim].append(img) self.img = self.imgs[self.anim_root + '_' + self.anim][int(self.frame)] + def direction_as_string(self): + if self.direction == (1, 0): + return "right" + if self.direction == (-1, 0): + return "left" + if self.direction == (0, -1): + return "up" + if self.direction == (0, 1): + return "down" + def touch(self, touch_x, touch_y): for obj in self.level.objects: if (obj.x == self.x + touch_x * self.tile_x @@ -89,43 +129,77 @@ class Player(worldobject.WorldObject): and obj != self): obj.use(self) - def update(self, e, t, dt): - for event in e: - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_SPACE: - self.touch(*self.direction) + # Concerning levers + if type(obj) == lever.Lever: + self.working = True - keys = pygame.key.get_pressed() - if keys[pygame.K_UP]: - if not self.holding and not self.is_moving: - self.direction = (0, -1) - self.anim = 'up' - self.move(0, -1) - elif keys[pygame.K_DOWN]: - if not self.holding and not self.is_moving: - self.direction = (0, 1) - self.anim = 'down' - self.move(0, 1) - elif keys[pygame.K_RIGHT]: - if not self.holding and not self.is_moving: - self.direction = (1, 0) - self.anim = 'right' - self.move(1, 0) - elif keys[pygame.K_LEFT]: - if not self.holding and not self.is_moving: - self.direction = (-1, 0) - self.anim = 'left' - self.move(-1, 0) + # List all possible combinations ... + lever_direction = ( + 'up' if obj.anim == 'lever_updown' and obj.setting + else + 'right' if obj.anim == 'lever_leftright' and obj.setting + else + 'down' if obj.anim == 'lever_updown' and not obj.setting + else + 'left') + + self.anim_root = 'lever' + self.frame = 0 + self.anim = ( + self.direction_as_string() + '_' + lever_direction) + + def update(self, e, t, dt): + if not self.working: + self.anim_root = 'carry' if self.holding else 'idle' + + for event in e: + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_SPACE: + self.touch(*self.direction) + + keys = pygame.key.get_pressed() + if keys[pygame.K_UP]: + if not self.holding and not self.is_moving: + self.direction = (0, -1) + self.anim = self.direction_as_string() + self.move(0, -1) + elif keys[pygame.K_DOWN]: + if not self.holding and not self.is_moving: + self.direction = (0, 1) + self.anim = self.direction_as_string() + self.move(0, 1) + elif keys[pygame.K_RIGHT]: + if not self.holding and not self.is_moving: + self.direction = (1, 0) + self.anim = self.direction_as_string() + self.move(1, 0) + elif keys[pygame.K_LEFT]: + if not self.holding and not self.is_moving: + self.direction = (-1, 0) + self.anim = self.direction_as_string() + self.move(-1, 0) + + else: + self.working = not (self.frame == len( + self.imgs[self.anim_root + '_' + self.anim]) - 1) + if not self.working: + self.anim = self.direction_as_string() + self.anim_root = 'carry' if self.holding else 'idle' # Update the animation - self.frame = ((self.frame + self.anim_speed * dt) % - len(self.imgs[self.anim_root + '_' + self.anim])) + if not self.working: + self.frame = ((self.frame + self.anim_speed * dt) % + len(self.imgs[self.anim_root + '_' + self.anim])) + else: + self.frame = min( + self.frame + self.anim_speed * dt, + len(self.imgs[self.anim_root + '_' + self.anim]) - 1) + worldobject.WorldObject.update(self, e, t, dt) def draw(self, window): - self.anim_root = 'carry' if self.holding else 'idle' - + print(self.anim_root + '_' + self.anim, int(self.frame)) self.img = self.imgs[self.anim_root + '_' + self.anim][int(self.frame)] self.img.set_alpha(128) window.blit(self.img, (self.x - 32 - self.level.camera_x,