From ba21a28ec9f58060d9cb324951e8f49ae26e3ce0 Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 7 Aug 2024 16:21:02 +0200 Subject: [PATCH] Trash!!! --- .gitignore | 8 +++++++ Tilemap.py | 62 ++++++++++++++++++++++++++++++++++++++++++++++++ Tileset.py | 19 +++++++++++++++ Tiletype.py | 6 +++++ Utils.py | 22 +++++++++++++++++ main.py | 67 +++++++++++++++++++++++++++++++++++++++++++--------- tileset.png | Bin 0 -> 4049 bytes 7 files changed, 173 insertions(+), 11 deletions(-) create mode 100644 Tilemap.py create mode 100644 Tileset.py create mode 100644 Tiletype.py create mode 100644 Utils.py create mode 100644 tileset.png diff --git a/.gitignore b/.gitignore index 8d7e475..f900edf 100644 --- a/.gitignore +++ b/.gitignore @@ -1665,3 +1665,11 @@ .venv/lib/python3.12/site-packages/pygame.libs/libvorbisenc-bb396c4a.so.2.0.12 .venv/lib/python3.12/site-packages/pygame.libs/libvorbisfile-8aced0b7.so.3.3.8 .venv/lib/python3.12/site-packages/pygame.libs/libwebp-3bee5bfa.so.7.1.8 +__pycache__/Tilemap.cpython-312.pyc +__pycache__/Tileset.cpython-312.pyc +__pycache__/Tiletype.cpython-312.pyc +__pycache__/Utils.cpython-312.pyc +modules/__pycache__/Tilemap.cpython-312.pyc +modules/__pycache__/Tileset.cpython-312.pyc +modules/__pycache__/Tiletype.cpython-312.pyc +modules/__pycache__/Utils.cpython-312.pyc diff --git a/Tilemap.py b/Tilemap.py new file mode 100644 index 0000000..64c3aa0 --- /dev/null +++ b/Tilemap.py @@ -0,0 +1,62 @@ +import pygame +import random +import Tileset + +class Tilemap(object): + def __init__(self) -> None: + self.tileset = Tileset.TileSet("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("water", 64,0) + self.tileset.add_tile("block", 0, 32) + + self.camera_x = 0 + self.camera_y = 0 + + self.width = 30 + self.height = 25 + + self.tiles = list() + + for i in range(0, self.height): + self.tiles.append(list()) + for j in range(0, self.width): + x = random.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") + + def render(self, screen): + + for y in range(0, int(screen.get_height() / self.tileset.tile_height) + 1): + ty = y + self.camera_y + if ty >= self.height or ty < 0: + continue + + line = self.tiles[ty] + + for x in range(0, int(screen.get_width() / self.tileset.tile_width)+ 1): + tx = x + self.camera_x + if tx >= self.width or tx < 0: + continue + tilename = line[tx] + tile = self.tileset.get_tile(tilename) + + if tile is not None: + screen.blit(self.tileset.image, (x * self.tileset.tile_width, y * self.tileset.tile_height), tile.rect) + + def handle_input(self, key): + if key == pygame.K_LEFT: + self.camera_x += 1 + if key == pygame.K_RIGHT: + self.camera_x -= 1 + + if key == pygame.K_UP: + self.camera_y += 1 + if key == pygame.K_DOWN: + self.camera_y -= 1 \ No newline at end of file diff --git a/Tileset.py b/Tileset.py new file mode 100644 index 0000000..783fd78 --- /dev/null +++ b/Tileset.py @@ -0,0 +1,19 @@ +import pygame +import Tiletype +import Utils + +class TileSet(object): + def __init__(self, image, colorkey, tile_width, tile_height) -> None: + self.image = Utils.load_image(image, colorkey) + self.tile_width = tile_width + self.tile_height = tile_height + self.tile_types = dict() + + def add_tile(self, name, start_x, start_y): + self.tile_types[name] = Tiletype.TileType(name, start_x, start_y, self.tile_width, self.tile_height) + + def get_tile(self, name): + try: + return self.tile_types[name] + except KeyError: + return None diff --git a/Tiletype.py b/Tiletype.py new file mode 100644 index 0000000..4fa1568 --- /dev/null +++ b/Tiletype.py @@ -0,0 +1,6 @@ +import pygame + +class TileType(object): + def __init__(self, name, start_x, start_y, width, height) -> None: + self.name = name + self.rect = pygame.rect.Rect(start_x, start_y, width, height) \ No newline at end of file diff --git a/Utils.py b/Utils.py new file mode 100644 index 0000000..c3abcbf --- /dev/null +++ b/Utils.py @@ -0,0 +1,22 @@ +import pygame + +# Hilfsfunktion, um ein Bild zu laden: +def load_image(filename, colorkey=None): + # Pygame das Bild laden lassen. + image = pygame.image.load(filename) + + # Das Pixelformat der Surface an den Bildschirm (genauer: die screen-Surface) anpassen. + # Dabei die passende Funktion verwenden, je nach dem, ob wir ein Bild mit Alpha-Kanal haben oder nicht. + if image.get_alpha() is None: + image = image.convert() + else: + image = image.convert_alpha() + + # Colorkey des Bildes setzen, falls nicht None. + # Bei -1 den Pixel im Bild an Position (0, 0) als Colorkey verwenden. + if colorkey is not None: + if colorkey is -1: + colorkey = image.get_at((0,0)) + image.set_colorkey(colorkey, pygame.RLEACCEL) + + return image \ No newline at end of file diff --git a/main.py b/main.py index e1da01d..0d04e39 100644 --- a/main.py +++ b/main.py @@ -1,17 +1,62 @@ import pygame +import Tilemap pygame.init() -MAINSCREEN_SIZE = (800,600) - -pygame.display.set_caption("Test-Sidescroller") -pygame.display.set_mode(MAINSCREEN_SIZE) - -gamestate = True +WEISS = (255,255,255) +SCHWARZ = (0,0,0) -while(gamestate): - for event in pygame.event.get(): - if (event.type == pygame.QUIT): - print("Programm wird geschlossen!") - gamestate = False \ No newline at end of file +def main(): + # Initialisieren aller Pygame-Module und + # Fenster erstellen (wir bekommen eine Surface, die den Bildschirm repräsentiert). + pygame.init() + screen = pygame.display.set_mode((800, 600)) + + # Titel des Fensters setzen, Mauszeiger nicht verstecken und Tastendrücke wiederholt senden. + pygame.display.set_caption("Pygame-Tutorial: Tilemap") + pygame.mouse.set_visible(1) + pygame.key.set_repeat(1, 30) + + # Clock Objekt erstellen, das wir benötigen, um die Framerate zu begrenzen. + clock = pygame.time.Clock() + + # Wir erstellen eine Tilemap. + map = Tilemap.Tilemap() + + # Die Schleife, und damit unser Spiel, läuft solange running == True. + running = True + while running: + # Framerate auf 30 Frames pro Sekunde beschränken. + # Pygame wartet, falls das Programm schneller läuft. + clock.tick(30) + + # screen Surface mit Schwarz (RGB = 0, 0, 0) füllen. + screen.fill((0, 0, 0)) + + # Alle aufgelaufenen Events holen und abarbeiten. + for event in pygame.event.get(): + # Spiel beenden, wenn wir ein QUIT-Event finden. + if event.type == pygame.QUIT: + running = False + + # Wir interessieren uns auch für "Taste gedrückt"-Events. + if event.type == pygame.KEYDOWN: + # Wenn Escape gedrückt wird posten wir ein QUIT-Event in Pygames Event-Warteschlange. + if event.key == pygame.K_ESCAPE: + pygame.event.post(pygame.event.Event(pygame.QUIT)) + + # Alle Tastendrücke auch der Tilemap mitteilen. + map.handle_input(event.key) + + # Die Tilemap auf die screen-Surface rendern. + map.render(screen) + + # Inhalt von screen anzeigen + pygame.display.flip() + + +# Überprüfen, ob dieses Modul als Programm läuft und nicht in einem anderen Modul importiert wird. +if __name__ == '__main__': + # Unsere Main-Funktion aufrufen. + main() \ No newline at end of file diff --git a/tileset.png b/tileset.png new file mode 100644 index 0000000000000000000000000000000000000000..325a2fa0a7c8d35a299b8e55480d55be847019cf GIT binary patch literal 4049 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