KlasseMonster.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. # (c) Hochschule Anhalt, veröffentlicht unter MIT-Lizenz
  2. # Monster-Klasse
  3. # Autor: Viktor Lysow, Johannes Tümler
  4. # Letzte Änderung: 03.08.2022
  5. # Zweck: Definition der Monster
  6. #
  7. # Monster erbt Alles von Figur
  8. # Monster können selbst laufen
  9. # Sterben, wenn sie mit der Magie des Helden in Berührung kommen
  10. # können den Helden bei Berührung töten
  11. # Der Nachfolgende Codeblock "BLOCK1" sorgt dafür, dass man aus jeder Datei heraus das Hauptprogramm starten kann.
  12. # Dadurch kann man in jeder Datei auf "play" drücken und es wird automatisch main.py gestartet.
  13. if __name__=="__main__":
  14. import subprocess
  15. # Auf Linux oder Mac aktivieren Sie die folgende Zeile und deaktivieren Sie die Zeile danach:
  16. #subprocess.call("python3 main.py", shell=True) # die richtige Main-Datei aufrufen (unser eigentliches Hauptprogramm)
  17. subprocess.call("main.py", shell=True) # die richtige Main-Datei aufrufen (unser eigentliches Hauptprogramm)
  18. exit(0) # nun das Programm hier beenden .. wir wollen ja nur das Hauptprogramm starten und nicht *diese* Datei.
  19. # Ende "BLOCK1"
  20. from importlib import import_module
  21. import pygame
  22. from random import randint
  23. from time import time
  24. from KlasseFigur import Figur
  25. from screen import screen
  26. import sounds
  27. class Monster(Figur):
  28. zeitDupl = 0
  29. monsterListe = []
  30. angriffsradius = 150 # je größer, je schwieriger. Dies ist der Abstand, unter dem Monster auf den Spieler zu laufen
  31. def __init__(self, x, y, geschw, breite, hoehe, level, bildFigur, zeitMonster):
  32. super().__init__(x, y, geschw, breite, hoehe, level, bildFigur)
  33. self.xReset = x
  34. self.yReset = y
  35. self.richtung = 1
  36. self.zeitMonster = zeitMonster
  37. self.leben = True
  38. self.heldTot = False
  39. self.feuerWechsel = 0
  40. self.heldDaten = None
  41. self.monsterDaten = None
  42. self.bildSterben = [pygame.image.load(f"Bilder/Geist/tot.png")]
  43. self.bildSterbenAngezeigt = False
  44. self.bildTot = [pygame.image.load(f"Bilder/Feuer/F1.png"),
  45. pygame.image.load(f"Bilder/Feuer/F2.png"),
  46. pygame.image.load(f"Bilder/Feuer/F3.png")]
  47. self.letzteX = 0
  48. self.letzteY = 0
  49. def reset(self):
  50. self.x = self.xReset
  51. self.y = self.yReset
  52. self.leben = True
  53. self.heldTot = False
  54. def spielerRichtung(self, spieler):
  55. absX = self.x - spieler.x
  56. absY = self.y - spieler.y
  57. abstand = (abs(absX)**2 + abs(absY)**2)**0.5 # Pythagoras .. schlechte Performance
  58. if (abstand < Monster.angriffsradius) and not (self.x == self.letzteX and self.y == self.letzteY): # wenn der Abstand zum Spieler < Monster.angriffsradius Pixel ist, in seine Richtung laufen!
  59. # Ausnahme: wenn wir uns beim letzten Schritt nicht bewegt haben (z.B. vor einer Wand fest stehen)
  60. if (abs(absX) > abs(absY)): # der X-Wert ist größer, d.h. der Spieler ist weiter in x von uns entfernt, als in y
  61. # wir sollten also in x Richtung gehen
  62. if absX < 0:
  63. return 2 # nach rechts gehen
  64. else:
  65. return 3 # nach links gehen
  66. else:
  67. if absY > 0:
  68. return 0 # 0...nach oben
  69. else:
  70. return 1 # 1...nach unten
  71. else:
  72. return randint(0,3)
  73. def mlaufen(self, spieler , monster = None): #Monster können selber laufen
  74. if self.leben:
  75. self.heldDaten = spieler #Alle Daten vom Held werden hier gespeichert
  76. self.monsterDaten = monster #Alle Daten von einem Monster werden hier gespeichert
  77. if time() - self.zeitMonster >= randint(5,10) * 0.1: # zwischen 0,5 und 1,0 Sekunden laufen die Monster in die gleiche Richtung
  78. if self.richtung != -1: #abhängig von der Zeit ändern sie die Richtung
  79. self.richtung = self.spielerRichtung(spieler) #in Richtung Spieler laufen
  80. self.zeitMonster = time()
  81. self.letzteX = self.x # den alten Wert der Bewegung speichern um in spielerRichtung festzustellen, ob wir uns bewegt haben
  82. self.letzteY = self.y
  83. self.laufen(self.richtung) #Laufen in eine Richtung
  84. self.sterben()
  85. self.faehigkeit()
  86. return self.heldTot #Rückgabe ob der Held tot ist
  87. else:
  88. if not self.bildSterbenAngezeigt:
  89. screen.blit(self.bildSterben[0], (self.x, self.y)) #Monster hinterlassen kurz eine Spur, wenn sie tot sind
  90. if time() - self.zeitMonster >= 1.0:
  91. self.bildSterbenAngezeigt = True
  92. self.zeitMonster = time()
  93. else:
  94. if time() - self.zeitMonster >= 0.15:
  95. self.feuerWechsel = (self.feuerWechsel + 1) % len(self.bildTot)
  96. self.zeitMonster = time()
  97. screen.blit(self.bildTot[self.feuerWechsel], (self.x, self.y)) #Monster brennen, wenn sie tot sind
  98. def toeten(self): #Held wird getötet bei Kollision
  99. if self.rechteck.colliderect(self.heldDaten.rechteck):
  100. sounds.soundTot()
  101. screen.blit(self.heldDaten.bildtot, (self.heldDaten.x, self.heldDaten.y))
  102. self.heldTot = True
  103. def sterben(self): # Monster ist tot nach der Berührung von der Magie des Helden
  104. for k in self.heldDaten.kugeln:
  105. if self.rechteck.colliderect(k.waffeRec):
  106. self.heldDaten.kugeln.remove(k)
  107. self.leben = False
  108. sounds.soundFeuer()
  109. def faehigkeit(self): #Alle Fähigkeiten von Monster kommen hier rein
  110. self.toeten()