Level1.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. # (c) Hochschule Anhalt, veröffentlicht unter MIT-Lizenz
  2. # Level1
  3. # Autor: Viktor Lysow, Johannes Tümler
  4. # Letzte Änderung: 22.04.2022
  5. # Zweck: Organisation und Steuerung des ersten Levels
  6. # Der Nachfolgende Codeblock "BLOCK1" sorgt dafür, dass man aus jeder Datei heraus das Hauptprogramm starten kann.
  7. # Dadurch kann man in jeder Datei auf "play" drücken und es wird automatisch main.py gestartet.
  8. if __name__=="__main__":
  9. import subprocess
  10. # Auf Linux oder Mac aktivieren Sie die folgende Zeile und deaktivieren Sie die Zeile danach:
  11. #subprocess.call("python3 main.py", shell=True) # die richtige Main-Datei aufrufen (unser eigentliches Hauptprogramm)
  12. subprocess.call("main.py", shell=True) # die richtige Main-Datei aufrufen (unser eigentliches Hauptprogramm)
  13. exit(0) # nun das Programm hier beenden .. wir wollen ja nur das Hauptprogramm starten und nicht *diese* Datei.
  14. # 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.
  15. # Ende "BLOCK1"
  16. from KlasseLevelmanagement import LevelManagement
  17. import pygame
  18. import sounds
  19. import DatenSammeln as ds # Für den Matlab Beleg
  20. from screen import screen
  21. from screen import feld
  22. from screen import feldHalbe
  23. from screen import myfont
  24. from time import time
  25. from KlasseMonster import Monster
  26. from KlasseGeist import Geist
  27. zeitStart = True
  28. hintergrundLevel1 = pygame.image.load("Bilder/Karte/Level1.png")
  29. tor = pygame.Rect(3*feld,0,48,48) #Ziel in Level 1
  30. def Level1(spieler):
  31. global zeitStart
  32. # display text
  33. screen.blit(hintergrundLevel1, (0, 0))
  34. def resetLvl1():
  35. global zeitStart
  36. ds.daten_csv(8,len(Monster.monsterListe)) #Level1 Moster Anzahl (für Matlab)
  37. Monster.monsterListe = []
  38. Monster.lebendeMonster = 0
  39. Monster.zeitDupl = time()
  40. zeitStart = True
  41. if len(Monster.monsterListe) == 0 : # falls bereits alle Monster getötet wurden, erstellen wir ein neues Monster für den Neustart des Levels
  42. # hier darf nicht (if Monster.lebendeMonster == 0) verwendet werden, weil diese Zahl nicht die bereits getöteten beinhaltet
  43. Geist(x = 100, y = 200, geschw= 3, breite = feld, hoehe = feld, level = LevelManagement.Level,bildFigur= "Geist",zeitMonster= time())
  44. if LevelManagement.debug:
  45. pygame.draw.rect(screen, (0,255,0), (spieler.x,spieler.y, spieler.breite,spieler.hoehe),0) # Spieler
  46. pygame.draw.rect(screen, (255,255,0), (3*feld,0,48,48),0) # Tor
  47. oben = (spieler.x + spieler.breite / 2 - 2, spieler.y, 4, 4)
  48. unten = (spieler.x + spieler.breite / 2 - 2, spieler.y + spieler.hoehe - 4, 4, 4)
  49. rechts = (spieler.x + spieler.breite - 2, spieler.y + spieler.hoehe / 2 - 2, 4, 4)
  50. links = (spieler.x, spieler.y + spieler.hoehe / 2 - 2, 4, 4)
  51. pygame.draw.rect(screen,(255,0,0), oben)
  52. pygame.draw.rect(screen,(0,0,255), unten)
  53. pygame.draw.rect(screen,(255,255,0), rechts)
  54. pygame.draw.rect(screen,(0,0,128), links)
  55. if LevelManagement.numFrames >= LevelManagement.fpsTarget:
  56. LevelManagement.fpsCurrent = (LevelManagement.timeNeeded / LevelManagement.numFrames)
  57. LevelManagement.numFrames = 0
  58. LevelManagement.timeNeeded = 0
  59. textsurface = myfont.render("%i fps" % (1000/LevelManagement.fpsCurrent), False, (255, 255, 0))
  60. screen.blit(textsurface,(10,0))
  61. if zeitStart: #Zeit wird ab den ersten aufruf gemäßen (für Matlab)
  62. zeitStart = False
  63. for dupli in Monster.monsterListe: #Alle erschaffenen Monster in Bewegung bringen
  64. if LevelManagement.debug:
  65. pygame.draw.rect(screen, (255,0,0), (dupli.x,dupli.y,dupli.breite,dupli.hoehe),0)
  66. pygame.draw.circle(surface = screen, color = (255,0,0), center = (dupli.x + feldHalbe,dupli.y + feldHalbe), radius = Monster.angriffsradius, width = 2) # die Koordinate der Figur bezieht sich auf "Ecke oben links" des Figur-Icons, daher müssen wir ein halbes Feld dazu rechnen
  67. pygame.draw.rect(screen,(128,255,0), (dupli.x + dupli.breite / 2 - 2, dupli.y, 4, 4))
  68. pygame.draw.rect(screen,(128,255,0), (dupli.x + dupli.breite / 2 - 2, dupli.y + dupli.hoehe - 4, 4, 4))
  69. pygame.draw.rect(screen,(128,255,0), (dupli.x + dupli.breite - 2, dupli.y + dupli.hoehe / 2 - 2, 4, 4))
  70. pygame.draw.rect(screen,(128,255,0), (dupli.x, dupli.y + dupli.hoehe / 2 - 2, 4, 4))
  71. if dupli.mlaufen(spieler): #mit mlaufen läuft der Geist und es wird überprüft, ob der Held getötet wurde
  72. pygame.display.update()
  73. pygame.time.wait(1000)
  74. gameOver = 3
  75. #monster.reset() #Es wird Alles für den Geist zurück gesetzt
  76. # ich muss kein monster.reset machen, weil ich einfach alle Monster lösche. Damit müssen sie sowieso neu erstellt werden
  77. resetLvl1()
  78. ds.daten_csv(11,1) #Nehmendas letzte Level des Spiels auf
  79. return gameOver
  80. if spieler.obenKollision.colliderect(tor): #Held muss mit dem Kopf den Eingang berühren
  81. LevelManagement.Level += 1
  82. spieler.neu_Position(582, 476, LevelManagement.Level) #Neue Position für das nächste Level
  83. sounds.soundTor()
  84. pygame.time.wait(500)
  85. #monster.reset() #Es wird Alles für den Geist zurück gesetzt
  86. # ich muss kein monster.reset machen, weil ich einfach alle Monster lösche. Damit müssen sie sowieso neu erstellt werden
  87. resetLvl1()
  88. #ds.daten_csv(8, round(time() - zeit)) #Zeit für Level1 (für Matlab)
  89. return LevelManagement.Level
  90. else: #Das Level läuft weiter
  91. spieler.steuerung()
  92. return LevelManagement.Level