# (c) Hochschule Anhalt, veröffentlicht unter MIT-Lizenz # Level2 # Autor: Viktor Lysow, Johannes Tümler, Wending Huang # Letzte Änderung: 19.04.2023 # Zweck: Organisation und Steuerung des zweiten Levels # 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 KlasseLevelmanagement import LevelManagement import pygame import sounds from screen import screen from hindernisse import feld from hindernisse import drawLevel2 from time import time from KlassePrinzessin import Prinzessin from KlasseHarpyie import Harpyie from KlasseMonster import Monster import DatenSammeln as ds # Für den Matlab Beleg zeitStart = True zeit = 0 hintergrundLevel = pygame.image.load("Bilder/Karte/Level2.png") tor = pygame.Rect(3*feld,0,48,48) #Ziel in Level 2 LevelManagement.Level = 2 prinzessin = Prinzessin(x = feld*10, y = feld*3, geschw = 7, breite = feld, hoehe = feld, level = LevelManagement.Level, bildFigur = "Prinzessin", zeitMonster= time()) # display text pygame.font.init() # you have to call this at the start, if you want to use this module. myfont = pygame.font.SysFont('Comic Sans MS', 30) gewonnen = False def Level2(spieler): global zeitStart, zeit, gewonnen def resetLvl2(): global gewonnen, zeitStart ds.daten_csv(9,len(Monster.monsterListe)) #Level2 Moster Anzahl (für Matlab) Monster.anzahlGeister = 0 Monster.monsterListe = [] Monster.zeitDupl = 0 prinzessin.reset() #Es wird Alles für die Prinzessin zurück gesetzt gewonnen = False zeitStart = True screen.blit(hintergrundLevel, (0, 0)) if len(Monster.monsterListe) == 0: # falls bereits alle Monster getötet wurden, erstellen wir ein neues Monster für den Neustart des Levels monster1 = Harpyie(x = feld*4, y = feld*3, geschw = 4, breite = feld, hoehe = feld, level = LevelManagement.Level, bildFigur ="Harpyie", zeitMonster = time()) Monster.monsterListe.append(monster1) if LevelManagement.debug: pygame.draw.rect(screen, (0,255,0), (spieler.x,spieler.y,spieler.breite,spieler.hoehe),0) # Zeile aktivieren, falls man die Kollisionsboxen der Monster sichtbar machen möchte pygame.draw.rect(screen, (255,255,0), (3*feld,0,48,48),0) pygame.draw.rect(screen, (255,0,255), (prinzessin.x, prinzessin.y, prinzessin.breite, prinzessin.hoehe), 0) # Tor anzeigen if LevelManagement.numFrames >= LevelManagement.fpsTarget: LevelManagement.fpsCurrent = LevelManagement.timeNeeded / LevelManagement.numFrames LevelManagement.numFrames = 0 LevelManagement.timeNeeded = 0 textsurface = myfont.render("%i fps" % (1000/LevelManagement.fpsCurrent), False, (255, 255, 0)) screen.blit(textsurface,(10,0)) #drawLevel2() if zeitStart: #Zeit wird ab den ersten aufruf gemäßen (für Matlab) zeitStart = False LevelManagement.Level = 2 zeit = time() prinzessin.mlaufen(spieler) lebendeMonster = 0 if not gewonnen: # wenn noch nicht gewonnen: aktuelle Anzahl Monster zählen for dupli in Monster.monsterListe: if dupli.leben: lebendeMonster += 1 if lebendeMonster == 0: gewonnen = True sounds.soundGewonnen() for dupli in Monster.monsterListe: #Alle erschaffenen Monster in Bewegung bringen if LevelManagement.debug: pygame.draw.rect(screen, (255,0,0), (dupli.x,dupli.y,dupli.breite,dupli.hoehe),0) pygame.draw.circle(surface = screen, color = (255,0,0), center = (dupli.x,dupli.y), radius = Monster.angriffsradius, width = 2) if dupli.mlaufen(spieler) or not prinzessin.leben: #mit mlaufen läuft der Boss und es wird überprüft ob der Held getötet wurde pygame.display.update() #mit mlaufen läuft die Prinzessin und es wird überprüft ob die Prinzessin getötet wurde pygame.time.wait(1000) #Monster.reset() #Es wird Alles für den Geist zurück gesetzt # ich muss kein monster.reset machen, weil ich einfach alle Monster lösche. Damit müssen sie sowieso neu erstellt werden LevelManagement.Level = 3 #ds.daten_csv(9, round(time() - zeit)) #Zeit für Level3 (für Matlab) ds.daten_csv(11, 2) resetLvl2() return LevelManagement.Level if spieler.obenKollision.colliderect(tor): #Held muss mit dem Kopf den Eingang berühren LevelManagement.Level = 4 ds.daten_csv(11, 3) #Nehmen das letzte Level des Spiels auf for monster in Monster.monsterListe: #Kein Monster mehr da? Wir haben gewonnen. if monster.leben: LevelManagement.Level = 3 ds.daten_csv(11, 2) #Nehmen das letzte Level des Spiels auf break sounds.soundTor() pygame.time.wait(500) #Monster.reset() #Es wird Alles für den Geist zurück gesetzt # man muss kein monster.reset machen, weil einfach alle Monster gelöscht werden. Damit müssen sie sowieso neu erstellt werden resetLvl2() return LevelManagement.Level else: #Das Level läuft weiter spieler.steuerung() return LevelManagement.Level