From bb1af4e7df3a093c4c419ec9354dbdd25eeea990 Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 7 Aug 2024 21:47:01 +0200 Subject: [PATCH] Other changes... --- Player.py | 59 ++++++++++++++++++++-- Tilemap.py | 76 +++++++++++++++++------------ __pycache__/Player.cpython-312.pyc | Bin 0 -> 2445 bytes main.py | 20 ++++---- 4 files changed, 110 insertions(+), 45 deletions(-) create mode 100644 __pycache__/Player.cpython-312.pyc diff --git a/Player.py b/Player.py index a32b729..26a3ab3 100644 --- a/Player.py +++ b/Player.py @@ -1,5 +1,58 @@ import pygame - +import Utils +import Animation + +# Die Player Klasse verwendet zwei Animationen, um eine steuerbare Spielfigur dazustellen. class Player(object): - def __init__(self) -> None: - pass \ No newline at end of file + def __init__(self): + # Bild laden und erste Animation erstellen: + self.anim_image_right = Utils.load_image("tileset.png", (255, 0, 255)) + self.anim_right = Animation.Animation(self.anim_image_right, 32, 32, 2, 32, 64, 15) + + # Die Grafik spiegeln und in einer neuen Surface speichern, + # dann können wir die linke Animation erstellen. + self.anim_image_left = pygame.transform.flip(self.anim_image_right, True, False) + self.anim_left = Animation.Animation(self.anim_image_left, 32, 32, 2, 32, 64, 15) + + # Start-Position des Players festlegen und + # merken in welche Richtung wir schauen und ob wir überhaupt laufen. + self.pos_x = 10*32 + self.pos_y = 13*32 + self.dir = 0 + self.walking = False + + + def render(self, screen): + # Die Blickrichtung ist links: + if self.dir == -1: + # Wenn der Spieler die linke oder rechte Pfeiltaste gedrückt hat sind wir am laufen, + if self.walking: + # nur dann die Animation updaten. + self.anim_left.update() + # Blickrichtung links rendern. + self.anim_left.render(screen, (self.pos_x, self.pos_y)) + else: + # Und das gleiche nochmal für rechts: + if self.walking: + self.anim_right.update() + self.anim_right.render(screen, (self.pos_x, self.pos_y)) + + # De Laufen-Zustand zurücksetzen, im nächsten Frame bleiben wir stehen. + self.walking = False + + + def handle_input(self, key): + # Linke Pfeiltaste wird gedrückt: + if key == pygame.K_LEFT: + # x-Position der Spielfigur anpassen, + # die Blickrichtung festlegen + # und den Laufen-Zustand einschalten. + self.pos_x -= 1 + self.dir = -1 + self.walking = True + + # Und nochmal für die rechte Pfeiltaste. + if key == pygame.K_RIGHT: + self.pos_x += 1 + self.dir = 1 + self.walking = True diff --git a/Tilemap.py b/Tilemap.py index d64aa3f..03a412e 100644 --- a/Tilemap.py +++ b/Tilemap.py @@ -1,61 +1,73 @@ import pygame -import random import Tileset - +import Player + +# Die Tilemap Klasse verwaltet die Tile-Daten, die das Aussehen der Karte beschreiben. class Tilemap(object): - def __init__(self) -> None: - self.tileset = Tileset.TileSet("tileset.png", (255,0,255), 32, 32) + def __init__(self): + # Wir erstellen ein neues Tileset. + # Hier im Tutorial fügen wir manuell vier Tile-Typen hinzu. + 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.tileset.add_tile("mud", 32, 0) + self.tileset.add_tile("grass-mud", 0, 64) + self.tileset.add_tile("empty", 0, 96) + + # 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 == 15: - self.tiles[i].append("grass") + if i == 14: + self.tiles[i].append("grass") elif i == 15: - self.tiles[i].append("water") + self.tiles[i].append("grass-mud") elif i > 15: self.tiles[i].append("mud") else: self.tiles[i].append("empty") - + + # Player-Objekt erstellen. + self.player = 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] - - for x in range(0, int(screen.get_width() / self.tileset.tile_width)+ 1): + # 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) - - if tile is not None: + # 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) - - 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 + + # 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) \ No newline at end of file diff --git a/__pycache__/Player.cpython-312.pyc b/__pycache__/Player.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..314feecd1c001e31605272e3c4c1a1bf6894de2a GIT binary patch literal 2445 zcmcIlO>7fK6rT0Z#IRsWY!b=Qf~rXECAWys3m5v{u6LbONjY^azxU?- z&D(k3%sdSS{R9U4^rzf!K0^M)i9NhcVf`csGejmbQy>|OGa1I5yD}~pxkzN!T_U>` z_ng~`$#^PE%(IG3HhqPNH|7vtwF3A8yIEw9Ptgvd`W}$PZny##?LVZO<0pre@qjbI9$mf>XEb zhgra}1z_fUiR^<}(6&`bj7wDmx>`^)Mei*ahhpy4H(;f>#T55+RX~E%)pJPj`_mWH zbI>pKArR9u7BakFKo-sL7fO;Ws-x17V(?N?9kpbUszbxN(S9B@lCGADhTk+=YPMV% zl13GyU8hn}%a!P;;mH-$vJu{pp`hd-fvGS>Z@Hw2w+)k347aROqwSVd7*XLP7{j9} zg`9?<5?+6p7%q(}iR>^{HC>g8iO)+p{gy-(rKsOhvm=GE;!vVo(T7XLgsy0M!h&mW zxnlT4Q7x*vC|1KwrL92ZXtO}>kiUe(4dFyxIPs)wKDa2PCOk{Nt{0JmjYzy6iOI}4xHt_{}G*K0R2i;=G;Jom$|d_?GJL=*LBq7m(@NBf?n8>f=>Q^|#a z+TfRq(Hod-|BKE8jn3os&f~M`M*Ms|et!PsJY9Hy;hWlEx_14>V&_fB6+FV=aOLHDg&Tn|IJasHMgrjWP7#v zTkGE{=6|g}=1#4?fpH<`qkEuGx)(_Y5Q7~n%aX1bELDoKLg_BF>_&ozHRht7rk9pQ z#A~<sCHo7MuLi`%SKA#hK7Qmcq&iVto&#!`GG4EC~k<&z6(tK$wTjJC_-;HMWarR~DCy}GjrfQ`!IkY2k91Yr>RzGo&r9e);x!W9$TF_pZR{GogD z>VxF+p3aGZ`bHcx3`xs&3`ribY8T$|2XVjqp literal 0 HcmV?d00001 diff --git a/main.py b/main.py index db7d0f7..9a5b01b 100644 --- a/main.py +++ b/main.py @@ -1,13 +1,13 @@ +# Pygame Modul importieren. import pygame + +# Unser Tilemap Modul import Tilemap -import Animation - -pygame.init() - -WEISS = (255,255,255) -SCHWARZ = (0,0,0) - - + +# Überprüfen, ob die optionalen Text- und Sound-Module geladen werden konnten. +if not pygame.font: print('Fehler pygame.font Modul konnte nicht geladen werden!') +if not pygame.mixer: print('Fehler pygame.mixer Modul konnte nicht geladen werden!') + def main(): # Initialisieren aller Pygame-Module und # Fenster erstellen (wir bekommen eine Surface, die den Bildschirm repräsentiert). @@ -15,11 +15,11 @@ def main(): 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.display.set_caption("Pygame-Tutorial: Animation") pygame.mouse.set_visible(1) pygame.key.set_repeat(1, 30) - # Clock Objekt erstellen, das wir benötigen, um die Framerate zu begrenzen. + # Clock-Objekt erstellen, das wir benötigen, um die Framerate zu begrenzen. clock = pygame.time.Clock() # Wir erstellen eine Tilemap.