Exemplo n.º 1
0
    def update(self, window):
        direction = Vector(0, 0)
        if window.keys[key.LEFT]:
            direction.x = -1
            self.side = Side.LEFT
            self._update_step()
        if window.keys[key.RIGHT]:
            direction.x = 1
            self.side = Side.RIGHT
            self._update_step()
        if window.keys[key.UP]:
            direction.y = 1
            self.side = Side.UP
            self._update_step()
        if window.keys[key.DOWN]:
            direction.y = -1
            self.side = Side.DOWN
            self._update_step()
        if window.keys[key.LSHIFT] or window.keys[key.RSHIFT]:
            self.speed = 2
        else:
            self.speed = 4
        self.pushing = bool(window.keys[key.SPACE])

        self._update_frame()
        if direction != Vector(0, 0):
            direction = direction * self.speed
            self.rect.move(direction.x, direction.y)
            self._check_map_collision(direction.x, direction.y)
            self._adjust_rectangle()
            self._update_camera(window)
Exemplo n.º 2
0
 def __init__(self):
     self._batch = Batch()
     self.tile_images = []
     self.tiles = []
     self.tile_width = 0
     self.tile_height = 0
     self.camera_position = Vector()
Exemplo n.º 3
0
class TileMap(object):

    def __init__(self):
        self._batch = Batch()
        self.tile_images = []
        self.tiles = []
        self.tile_width = 0
        self.tile_height = 0
        self.camera_position = Vector()

    def load_from_file(self, filename):
        mapfile = resource.file(filename)
        data = json.load(mapfile)

        self._load_images(data['images'])

        self.tiles = []
        for line in reversed(data['tiles']):
            tile_line = []
            for tile_number in line:
                image = self.tile_images[tile_number]
                tile = Tile(image=image, batch=self._batch)
                tile.solid = image.solid
                tile_line.append(tile)
            self.tiles.append(tile_line)

        self.set_camera_position(0, 0)

    def draw(self):
        self._batch.draw()

    def set_camera_position(self, x, y):
        self.camera_position.set(x, y)
        self._adjust_position()

    def move_camera(self, x, y):
        self.camera_position.move(x, y)
        self._adjust_position()

    def get_tile_at(self, x, y):
        tile_x = x / self.tile_width
        tile_y = y / self.tile_height
        return self.tiles[tile_y][tile_x]

    def get_solid_tiles(self, tiles):
        for tile in tiles:
            if tile.solid:
                return tile

    def _adjust_position(self):
        x, y = self.camera_position.xy
        for pos_y, line in enumerate(self.tiles):
            for pos_x, tile in enumerate(line):
                if tile is not None:
                    tile.x = pos_x * self.tile_width - x
                    tile.y = pos_y * self.tile_height - y

    def _load_images(self, tiles):
        self.tile_images = []
        for path, solid in tiles:
            image = resource.image(path)
            image.solid = solid
            self.tile_images.append(image)

        self.tile_width = max(image.width for image in self.tile_images)
        self.tile_height = max(image.height for image in self.tile_images)