KlasseFigur.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. # Hinweis fürs Debugging: Das VSCode-Debugging funktioniert jedoch nur, wenn man das Debugging in der "main.py" beginnt! D.h. wer debuggen möchte, muss die main.py öffnen und dort Debug starten.
  19. # Ende "BLOCK1"
  20. import pygame
  21. from KlasseLevelmanagement import LevelManagement
  22. from screen import screen
  23. from hindernisse import grenzeLevel
  24. class Figur:
  25. def __init__(self, x, y, geschw, breite, hoehe, level, bildFigur):
  26. self.x = x
  27. self.y = y
  28. self.geschw = geschw
  29. # falls das Spiel bei Ihnen zu langsam / zu schnell läuft, ändern Sie die nachfolgende Zeile:
  30. self.geschw_FPS_trick = self.geschw * (30 / LevelManagement.fpsTarget) # hier mit der "30" experimentieren, falls nötig
  31. self.breite = breite
  32. self.hoehe = hoehe
  33. self.level = level #In welchem Level befindet sich die Figur (wichtg für die Hindernisse)
  34. self.kugeln = []
  35. self.rechteck = pygame.Rect(self.x, self.y, self.breite, self.hoehe) #Welchen Raum nimmt die Figur ein
  36. self.obenKollision = pygame.Rect(self.x + self.breite / 2 - 2, self.y, 4, 4) #diese Rechtecke fungieren als Sensor
  37. self.untenKollision = pygame.Rect(self.x + self.breite / 2 - 2, self.y + self.hoehe - 4, 4, 4)
  38. self.rechtsKollision = pygame.Rect(self.x + self.breite - 2, self.y + self.hoehe / 2 - 2, 4, 4)
  39. self.linksKollision = pygame.Rect(self.x, self.y + self.hoehe / 2 - 2, 4, 4)
  40. self.schritt = True #Es gibt nur zwei Bilder für Laufen, deswegen Bollien (True, False)
  41. self.schritteZaehler = 0
  42. self.schussZaehler = 0
  43. self.bildFigur = bildFigur
  44. self.bildOben = [pygame.image.load(f"Bilder/{bildFigur}/Hinten1.png"),
  45. pygame.image.load(f"Bilder/{bildFigur}/Hinten2.png")]
  46. self.bildUnten = [pygame.image.load(f"Bilder/{bildFigur}/Vorn1.png"),
  47. pygame.image.load(f"Bilder/{bildFigur}/Vorn2.png")]
  48. self.bildRechts = [pygame.image.load(f"Bilder/{bildFigur}/Rechts1.png"),
  49. pygame.image.load(f"Bilder/{bildFigur}/Rechts2.png")]
  50. self.bildLinks = [pygame.image.load(f"Bilder/{bildFigur}/Links1.png"),
  51. pygame.image.load(f"Bilder/{bildFigur}/links2.png")]
  52. def laufen(self, richtung):
  53. self.schritteZaehler += 1
  54. if self.schritteZaehler % (LevelManagement.fpsTarget / 4) == 0: # Alle 0.25 Sekunden Bild wechseln
  55. self.schritt = not self.schritt
  56. #self.schritteZaehler = 0 # hier darf nicht auf 0 gesetzt werden, sonst wird die Schrittzahl nicht korrekt gespeichert
  57. if richtung == 0: # 0...nach oben
  58. if self.hindernis(self.obenKollision): #wenn kein Hindernis im Weg ist
  59. self.y -= self.geschw_FPS_trick
  60. screen.blit(self.bildOben[self.schritt], (self.x, self.y))
  61. elif richtung == 1: # 1...nach unten
  62. if self.hindernis(self.untenKollision):
  63. self.y += self.geschw_FPS_trick
  64. screen.blit(self.bildUnten[self.schritt], (self.x, self.y))
  65. elif richtung == 2: # 2...nach rechts
  66. if self.hindernis(self.rechtsKollision):
  67. self.x += self.geschw_FPS_trick
  68. screen.blit(self.bildRechts[self.schritt], (self.x, self.y))
  69. elif richtung == 3: #3...nach links
  70. if self.hindernis(self.linksKollision):
  71. self.x -= self.geschw_FPS_trick
  72. screen.blit(self.bildLinks[self.schritt], (self.x, self.y))
  73. elif richtung == -1: # -1 .. nicht laufen! Stehen bleiben.
  74. screen.blit(self.bildLinks[self.schritt], (self.x, self.y))
  75. self.rechteck = pygame.Rect(self.x, self.y, self.breite, self.hoehe) #Aktualisierung der Rechtecke
  76. self.obenKollision = pygame.Rect(self.x + self.breite / 2 - 2, self.y, 4, 4)
  77. self.untenKollision = pygame.Rect(self.x + self.breite / 2 - 2, self.y + self.hoehe - 4, 4, 4)
  78. self.rechtsKollision = pygame.Rect(self.x + self.breite - 2, self.y + self.hoehe / 2 - 2, 4, 4)
  79. self.linksKollision = pygame.Rect(self.x, self.y + self.hoehe / 2 - 2, 4, 4)
  80. def hindernis(self, richtung): #Hindernisse für die Figur werden überprüft
  81. r = True
  82. for i in grenzeLevel[self.level-1]:
  83. if richtung.colliderect(i):
  84. r = False
  85. #print("Hindernis getroffen")
  86. return r