Ejemplo n.º 1
0
class Tilemap(object):
    def __init__(self):
        # Wir erstellen ein neues Tileset.
        # Hier im Tutorial fügen wir manuell vier Tile-Typen hinzu.
        self.tileset = Tileset("res/tileset.jpg", (255, 0, 255), 32, 32)
        self.tileset.add_tile("grass", 0, 0)
        self.tileset.add_tile("mud", 32, 0)
        self.tileset.add_tile("water", 64, 0)
        self.tileset.add_tile("block", 0, 32)

        # Festlegen der Startposition der Kamera. Hier (0, 0).
        self.camera_x = 0
        self.camera_y = 0

        # Die Größe der Maps in Tiles.
        self.width = 30
        self.height = 25

        # Erstellen einer leeren Liste für die Tile Daten.
        self.tiles = list()

        # Manuelles Befüllen der Tile-Liste:
        # Jedes Feld bekommt ein zufälliges Tile zugewiesen.
        for i in range(0, self.height):
            self.tiles.append(list())
            for j in range(0, self.width):
                x = randint(0, 4)
                if x == 0:
                    self.tiles[i].append("grass")
                elif x == 1:
                    self.tiles[i].append("water")
                elif x == 2:
                    self.tiles[i].append("mud")
                else:
                    self.tiles[i].append("block")

# Hier rendern wir den sichtbaren Teil der Karte.

    def render(self, screen):
        # Zeilenweise durch die Tiles durchgehen.
        for y in range(0,
                       int(screen.get_height() / self.tileset.tile_height) +
                       1):
            # Die Kamera Position mit einbeziehen.
            ty = y + self.camera_y
            if ty >= self.height or ty < 0:
                continue
            # Die aktuelle Zeile zum einfacheren Zugriff speichern.
            line = self.tiles[ty]
            # Und jetzt spaltenweise die Tiles rendern.
            for x in range(
                    0,
                    int(screen.get_width() / self.tileset.tile_width) + 1):
                # Auch hier müssen wir die Kamera beachten.
                tx = x + self.camera_x
                if tx >= self.width or tx < 0:
                    continue
                # Wir versuchen, die Daten des Tiles zu bekommen.
                tilename = line[tx]
                tile = self.tileset.get_tile(tilename)
                # Falls das nicht fehlschlägt können wir das Tile auf die screen-Surface blitten.
                if tile is not None:
                    screen.blit(self.tileset.image,
                                (x * self.tileset.tile_width,
                                 y * self.tileset.tile_height), tile.rect)

    # Tastendrücke verarbeiten:
    def handle_input(self, key):
        # Pfeiltaste links oder rechts erhöht bzw. verringert die x-Position der Kamera.
        if key == pygame.K_LEFT:
            self.camera_x += 1
        if key == pygame.K_RIGHT:
            self.camera_x -= 1

        # Und das gleiche nochmal für die y-Position.
        if key == pygame.K_UP:
            self.camera_y += 1
        if key == pygame.K_DOWN:
            self.camera_y -= 1
Ejemplo n.º 2
0
class Tilemap(object):
    def __init__(self):
        # Wir erstellen ein neues Tileset.
        # Hier im Tutorial fügen wir manuell vier Tile-Typen hinzu.
        self.tileset = Tileset("res/tileset.png", (255, 0, 255), 32, 32)
        self.tileset.add_tile("grass", 0, 0)
        self.tileset.add_tile("mud", 32, 0)
        self.tileset.add_tile("grass-mud", 0, 64)
        self.tileset.add_tile("empty", 0, 96)

        self.objectset = Objectset("res/tileset.png", (255, 0, 255), 32, 32)
        self.objectset.add_object("block", 0, 32)

        # Festlegen der Startposition der Kamera. Hier (0, 0).
        self.camera_x = 0
        self.camera_y = 0

        # Die Größe der Maps in Tiles.
        self.width = 30
        self.height = 25

        # Erstellen einer leeren Liste für die Tile Daten.
        self.tiles = list()

        # Sehr einfache Karte basteln:
        for i in range(0, self.height):
            self.tiles.append(list())
            for j in range(0, self.width):
                if i == 14:
                    self.tiles[i].append("grass")
                elif i == 15:
                    self.tiles[i].append("grass-mud")
                elif i > 15:
                    self.tiles[i].append("mud")
                else:
                    self.tiles[i].append("empty")

        self.objects = list()

        for i in range(0, self.height):
            self.objects.append(list())
            for j in range(0, self.width):
                if i == 14:
                    if j == 10:
                        self.objects[i].append("block")
                    else:
                        self.objects[i].append("")
                else:
                    self.objects[i].append("")
        # Player-Objekt erstellen.
        self.player = Player()

    # Hier rendern wir den sichtbaren Teil der Karte.
    def render(self, screen):
        # Zeilenweise durch die Tiles durchgehen.
        for y in range(0,
                       int(screen.get_height() / self.tileset.tile_height) +
                       1):
            # Die Kamera Position mit einbeziehen.
            ty = y + self.camera_y
            if ty >= self.height or ty < 0:
                continue
            # Die aktuelle Zeile zum einfacheren Zugriff speichern.
            line = self.tiles[ty]
            objectLine = self.objects[ty]
            # Und jetzt spaltenweise die Tiles rendern.
            for x in range(
                    0,
                    int(screen.get_width() / self.tileset.tile_width) + 1):
                # Auch hier müssen wir die Kamera beachten.
                tx = x + self.camera_x
                if tx >= self.width or tx < 0:
                    continue
                # Wir versuchen, die Daten des Tiles zu bekommen.
                tilename = line[tx]
                tile = self.tileset.get_tile(tilename)
                # Falls das nicht fehlschlägt können wir das Tile auf die screen-Surface blitten.
                if tile is not None:
                    screen.blit(self.tileset.image,
                                (x * self.tileset.tile_width,
                                 y * self.tileset.tile_height), tile.rect)
                objectname = objectLine[tx]
                if objectname != "":
                    object = self.objectset.get_object(objectname)
                    if object is not None:
                        screen.blit(self.objectset.image,
                                    (x * self.tileset.tile_width,
                                     y * self.tileset.tile_height),
                                    object.rect)
        # Und zuletzt den Player rendern.
        self.player.render(screen)

    # Tastendrücke an den Player weiterreichen:
    def handle_input(self, key):
        self.player.handle_input(key)