def move(self, direction): nearpos = self.player.pos + direction farpos = nearpos + direction near = self.tm.at(nearpos) far = self.tm.at(farpos) if near == '#': return if near in 'xX' and far in '#xX': return else: # move possible moves = MoveGroup() self.player.add_move(direction) moves.add(self.player) if near in 'xX': # crate moved floor = near=='x' and '.' or '*' insert = far=='*' and 'X' or 'x' moves.add(MapMove(self.tm, nearpos, direction, 1, floor_tile=floor, insert_tile=insert)) wait_for_move(moves, self.screen, self.draw, 0.01) self.tm.cache_map() self.draw() self.check_complete()
def get_explosions(self, multiplets): explosions = MoveGroup() for pos in multiplets.get_positions(): self.tmap.set_tile(pos, '.') explosions.add(AnimatedTile(EXPLOSION, self.tmap.tile_factory, self.tmap.frame, pos)) self.tmap.cache_map() if len(explosions.moves) == 0: return None return explosions
def get_dropped_bricks(self): drop_moves = MoveGroup() for x in range(self.tmap.size.x): pos = Vector(x, self.tmap.size.y - 1) while pos.y > 0: pos_above = pos + UP if self.tmap.at(pos) == '.' and self.tmap.at(pos_above) != '.': drop_moves.add(MapMove(self.tmap, pos_above, DOWN, speed=4)) pos = pos_above return drop_moves
def get_explosions(self, multiplets): explosions = [] for pos in multiplets.get_positions(): self.tmap.set_tile(pos, '.') explosions.append(AnimatedTile(EXPLOSION, self.tmap.tile_factory, self.tmap.frame, pos)) if len(explosions) == 0: return None explosions = MoveGroup(explosions) return explosions
def get_dropped_bricks(self): moves = [] for x in range(self.tmap.size.x): pos = Vector(x, self.tmap.size.y - 1) while pos.y > 0: pos_above = pos + UP if self.tmap.at(pos) == '.' and self.tmap.at(pos_above) != '.': moves.append(MapMove(self.tmap, pos_above, DOWN, speed=4)) pos = pos_above return MoveGroup(moves)
def wait_for_move(self, move=None, draw_func=None, delay=0.01): if type(move) is list: move = MoveGroup(move) while not move.finished: move.move() if draw_func: self.screen.clear() draw_func() move.draw() pygame.display.update() time.sleep(delay)