123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- # (c) Hochschule Anhalt, veröffentlicht unter MIT-Lizenz
- # Monster-Klasse
- # Autor: Viktor Lysow, Johannes Tümler
- # Letzte Änderung: 03.08.2022
- # Zweck: Definition der Monster
- #
- # Monster erbt Alles von Figur
- # Monster können selbst laufen
- # Sterben, wenn sie mit der Magie des Helden in Berührung kommen
- # können den Helden bei Berührung töten
- # Der Nachfolgende Codeblock "BLOCK1" sorgt dafür, dass man aus jeder Datei heraus das Hauptprogramm starten kann.
- # Dadurch kann man in jeder Datei auf "play" drücken und es wird automatisch main.py gestartet.
- if __name__=="__main__":
- import subprocess
- # Auf Linux oder Mac aktivieren Sie die folgende Zeile und deaktivieren Sie die Zeile danach:
- #subprocess.call("python3 main.py", shell=True) # die richtige Main-Datei aufrufen (unser eigentliches Hauptprogramm)
- subprocess.call("main.py", shell=True) # die richtige Main-Datei aufrufen (unser eigentliches Hauptprogramm)
- exit(0) # nun das Programm hier beenden .. wir wollen ja nur das Hauptprogramm starten und nicht *diese* Datei.
- # Ende "BLOCK1"
- from importlib import import_module
- import pygame
- from random import randint
- from time import time
- from KlasseFigur import Figur
- from screen import screen
- import sounds
- class Monster(Figur):
- zeitDupl = 0
- monsterListe = []
- angriffsradius = 150 # je größer, je schwieriger. Dies ist der Abstand, unter dem Monster auf den Spieler zu laufen
- def __init__(self, x, y, geschw, breite, hoehe, level, bildFigur, zeitMonster):
- super().__init__(x, y, geschw, breite, hoehe, level, bildFigur)
- self.xReset = x
- self.yReset = y
- self.richtung = 1
- self.zeitMonster = zeitMonster
- self.leben = True
- self.heldTot = False
- self.feuerWechsel = 0
- self.heldDaten = None
- self.monsterDaten = None
- self.bildSterben = [pygame.image.load(f"Bilder/Geist/tot.png")]
- self.bildSterbenAngezeigt = False
- self.bildTot = [pygame.image.load(f"Bilder/Feuer/F1.png"),
- pygame.image.load(f"Bilder/Feuer/F2.png"),
- pygame.image.load(f"Bilder/Feuer/F3.png")]
- self.letzteX = 0
- self.letzteY = 0
- def reset(self):
- self.x = self.xReset
- self.y = self.yReset
- self.leben = True
- self.heldTot = False
- def spielerRichtung(self, spieler):
- absX = self.x - spieler.x
- absY = self.y - spieler.y
- abstand = (abs(absX)**2 + abs(absY)**2)**0.5 # Pythagoras .. schlechte Performance
- 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!
- # Ausnahme: wenn wir uns beim letzten Schritt nicht bewegt haben (z.B. vor einer Wand fest stehen)
- 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
- # wir sollten also in x Richtung gehen
- if absX < 0:
- return 2 # nach rechts gehen
- else:
- return 3 # nach links gehen
- else:
- if absY > 0:
- return 0 # 0...nach oben
- else:
- return 1 # 1...nach unten
- else:
- return randint(0,3)
- def mlaufen(self, spieler , monster = None): #Monster können selber laufen
- if self.leben:
- self.heldDaten = spieler #Alle Daten vom Held werden hier gespeichert
- self.monsterDaten = monster #Alle Daten von einem Monster werden hier gespeichert
- if time() - self.zeitMonster >= randint(5,10) * 0.1: # zwischen 0,5 und 1,0 Sekunden laufen die Monster in die gleiche Richtung
- if self.richtung != -1: #abhängig von der Zeit ändern sie die Richtung
- self.richtung = self.spielerRichtung(spieler) #in Richtung Spieler laufen
- self.zeitMonster = time()
- self.letzteX = self.x # den alten Wert der Bewegung speichern um in spielerRichtung festzustellen, ob wir uns bewegt haben
- self.letzteY = self.y
- self.laufen(self.richtung) #Laufen in eine Richtung
- self.sterben()
- self.faehigkeit()
- return self.heldTot #Rückgabe ob der Held tot ist
- else:
- if not self.bildSterbenAngezeigt:
- screen.blit(self.bildSterben[0], (self.x, self.y)) #Monster hinterlassen kurz eine Spur, wenn sie tot sind
- if time() - self.zeitMonster >= 1.0:
- self.bildSterbenAngezeigt = True
- self.zeitMonster = time()
- else:
- if time() - self.zeitMonster >= 0.15:
- self.feuerWechsel = (self.feuerWechsel + 1) % len(self.bildTot)
- self.zeitMonster = time()
- screen.blit(self.bildTot[self.feuerWechsel], (self.x, self.y)) #Monster brennen, wenn sie tot sind
- def toeten(self): #Held wird getötet bei Kollision
- if self.rechteck.colliderect(self.heldDaten.rechteck):
- sounds.soundTot()
- screen.blit(self.heldDaten.bildtot, (self.heldDaten.x, self.heldDaten.y))
- self.heldTot = True
- def sterben(self): # Monster ist tot nach der Berührung von der Magie des Helden
- for k in self.heldDaten.kugeln:
- if self.rechteck.colliderect(k.waffeRec):
- self.heldDaten.kugeln.remove(k)
- self.leben = False
- sounds.soundFeuer()
- def faehigkeit(self): #Alle Fähigkeiten von Monster kommen hier rein
- self.toeten()
|