KlasseFigur.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. # (c) Hochschule Anhalt, veröffentlicht unter MIT-Lizenz
  2. # Figur-Klasse
  3. # Autor: Viktor Lysow, Johannes Tümler
  4. # Letzte Änderung: 12.04.2022
  5. # Zweck: Figur-Entität definieren
  6. #
  7. # Klasse Figur ist die Oberklasse
  8. # Figuren können laufen
  9. # Figuren können nicht durch Hindernisse laufen
  10. # Der Nachfolgende Codeblock "BLOCK1" sorgt dafür, dass man aus jeder Datei heraus das Hauptprogramm starten kann.
  11. # Dadurch kann man in jeder Datei auf "play" drücken und es wird automatisch main.py gestartet.
  12. if __name__=="__main__":
  13. import subprocess
  14. # Auf Linux oder Mac aktivieren Sie die folgende Zeile und deaktivieren Sie die Zeile danach:
  15. #subprocess.call("python3 main.py", shell=True) # die richtige Main-Datei aufrufen (unser eigentliches Hauptprogramm)
  16. subprocess.call("main.py", shell=True) # die richtige Main-Datei aufrufen (unser eigentliches Hauptprogramm)
  17. exit(0) # nun das Programm hier beenden .. wir wollen ja nur das Hauptprogramm starten und nicht *diese* Datei.
  18. # Ende "BLOCK1"
  19. import pygame
  20. from KlasseLevelmanagement import LevelManagement
  21. from screen import screen
  22. from hindernisse import grenzeLevel
  23. class Figur:
  24. def __init__(self, x, y, geschw, breite, hoehe, level, bildFigur):
  25. self.x = x
  26. self.y = y
  27. self.geschw = geschw
  28. # falls das Spiel bei Ihnen zu langsam / zu schnell läuft, ändern Sie die nachfolgende Zeile:
  29. self.geschw_FPS_trick = self.geschw * (30 / LevelManagement.fpsTarget) # hier mit der "30" experimentieren, falls nötig
  30. self.breite = breite
  31. self.hoehe = hoehe
  32. self.level = level #In welchem Level befindet sich die Figur (wichtg für die Hindernisse)
  33. self.kugeln = []
  34. self.rechteck = pygame.Rect(self.x, self.y, self.breite, self.hoehe) #Welchen Raum nimmt die Figur ein
  35. self.obenKollision = pygame.Rect(self.x + self.breite / 2 - 2, self.y, 4, 4) #diese Rechtecke fungieren als Sensor
  36. self.untenKollision = pygame.Rect(self.x + self.breite / 2 - 2, self.y + self.hoehe - 4, 4, 4)
  37. self.rechtsKollision = pygame.Rect(self.x + self.breite - 2, self.y + self.hoehe / 2 - 2, 4, 4)
  38. self.linksKollision = pygame.Rect(self.x, self.y + self.hoehe / 2 - 2, 4, 4)
  39. self.schritt = True #Es gibt nur zwei Bilder für Laufen, deswegen Bollien (True, False)
  40. self.schritteZaehler = 0
  41. self.schussZaehler = 0
  42. self.bildFigur = bildFigur
  43. self.bildOben = [pygame.image.load(f"Bilder/{bildFigur}/Hinten1.png"),
  44. pygame.image.load(f"Bilder/{bildFigur}/Hinten2.png")]
  45. self.bildUnten = [pygame.image.load(f"Bilder/{bildFigur}/Vorn1.png"),
  46. pygame.image.load(f"Bilder/{bildFigur}/Vorn2.png")]
  47. self.bildRechts = [pygame.image.load(f"Bilder/{bildFigur}/Rechts1.png"),
  48. pygame.image.load(f"Bilder/{bildFigur}/Rechts2.png")]
  49. self.bildLinks = [pygame.image.load(f"Bilder/{bildFigur}/Links1.png"),
  50. pygame.image.load(f"Bilder/{bildFigur}/links2.png")]
  51. def laufen(self, richtung):
  52. self.schritteZaehler += 1
  53. if self.schritteZaehler % (LevelManagement.fpsTarget / 4) == 0: # Alle 0.25 Sekunden Bild wechseln
  54. self.schritt = not self.schritt
  55. #self.schritteZaehler = 0 # hier darf nicht auf 0 gesetzt werden, sonst wird die Schrittzahl nicht korrekt gespeichert
  56. if richtung == 0: # 0...nach oben
  57. if self.hindernis(self.obenKollision): #wenn kein Hindernis im Weg ist
  58. self.y -= self.geschw_FPS_trick
  59. screen.blit(self.bildOben[self.schritt], (self.x, self.y))
  60. elif richtung == 1: # 1...nach unten
  61. if self.hindernis(self.untenKollision):
  62. self.y += self.geschw_FPS_trick
  63. screen.blit(self.bildUnten[self.schritt], (self.x, self.y))
  64. elif richtung == 2: # 2...nach rechts
  65. if self.hindernis(self.rechtsKollision):
  66. self.x += self.geschw_FPS_trick
  67. screen.blit(self.bildRechts[self.schritt], (self.x, self.y))
  68. elif richtung == 3: #3...nach links
  69. if self.hindernis(self.linksKollision):
  70. self.x -= self.geschw_FPS_trick
  71. screen.blit(self.bildLinks[self.schritt], (self.x, self.y))
  72. elif richtung == -1: # -1 .. nicht laufen! Stehen bleiben.
  73. screen.blit(self.bildLinks[self.schritt], (self.x, self.y))
  74. self.rechteck = pygame.Rect(self.x, self.y, self.breite, self.hoehe) #Aktualisierung der Rechtecke
  75. self.obenKollision = pygame.Rect(self.x + self.breite / 2 - 2, self.y, 4, 4)
  76. self.untenKollision = pygame.Rect(self.x + self.breite / 2 - 2, self.y + self.hoehe - 4, 4, 4)
  77. self.rechtsKollision = pygame.Rect(self.x + self.breite - 2, self.y + self.hoehe / 2 - 2, 4, 4)
  78. self.linksKollision = pygame.Rect(self.x, self.y + self.hoehe / 2 - 2, 4, 4)
  79. def hindernis(self, richtung): #Hindernisse für die Figur werden überprüft
  80. r = True
  81. for i in grenzeLevel[self.level-1]:
  82. if richtung.colliderect(i):
  83. r = False
  84. return r