__blackjack__ hat geschrieben: ↑Mittwoch 27. November 2024, 21:18
Die Klasse sieht komisch eingerückt aus, das ``class`` sollte direkt am Zeilenanfang stehen.
So sieht der Code über der ersten Klasse aus:
Code: Alles auswählen
#!/usr/bin/env python3
import pygame, gif_pygame, random, time
# initialisieren von pygame
pygame.init()
print("---- Initialisierung gestartet -----")
print()
print()
# Displayerkennung
print("---- Displayerkennung gestartet -----")
aufloesung = pygame.display.Info()
print("Auflösung: ", aufloesung.current_w, " x ", aufloesung.current_w)
print()
# Gamepaderkennung
print("---- Gamepads werden gesucht -----")
if pygame.joystick.get_count() > 0:
joystick_0 = pygame.joystick.Joystick (0)
joystick_0.init()
print("Gamepad(s) erkannt")
print("Anzahl: ", pygame.joystick.get_count())
print()
name = joystick_0.get_name()
print("Gamepad 1: ", name)
print()
print()
else:
print("KEIN Gamepad gefunden")
print()
print()
print("---- Spiel wurde gestartet -----")
print()
## Mouse Cursor hidden in game
pygame.mouse.set_visible(False)
# Load graphics
bg = pygame.image.load("img/bg.jpg")
player_img = pygame.image.load("img/cruiser.png")
player_hurt_img = pygame.image.load("img/cruiser_hurt.png")
alien1_img = pygame.image.load("img/alien1.png")
alien2_img = pygame.image.load("img/alien2.png")
alien3_img = pygame.image.load("img/alien3.png")
alien4_img = pygame.image.load("img/alien4.png")
boss_img = pygame.image.load("img/alien_boss.png")
boss_hurt_img = pygame.image.load("img/alien_boss_hurt.png")
alien_hurt_img = pygame.image.load("img/alien_hurt.png")
bullet_img = pygame.image.load("img/bullet.png")
bullet2_img = pygame.image.load("img/bullet2.png")
bullet_alien_img = pygame.image.load("img/bullet_alien.png")
bullet_random_img = pygame.image.load("img/bullet_random.png")
bomb_img = pygame.image.load("img/bomb.png")
bullet_speed_img = pygame.image.load("img/bullet_speed.png")
explosion_gif = gif_pygame.load("img/explosion2.gif")
big_explosion_gif = gif_pygame.load("img/explosion.gif")
# Define constants
FPS = 60
BORDER = 20
def main():
pygame.init()
try:
# Open a window
window = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
# set windowtitel
pygame.display.set_caption("Space Invaders by Maro Hutzfeld")
# set variable to run the game
game_active = True
# activate screenrate
clock = pygame.time.Clock()
# Load music and soundeffekts
bg_sound = pygame.mixer.Sound('sound/bgmusic.mp3')
laser_sound = pygame.mixer.Sound('sound/lasershot.mp3')
alien_died_sound = pygame.mixer.Sound('sound/alien_died.mp3')
attack_sound = pygame.mixer.Sound('sound/attack.mp3')
gameover_sound = pygame.mixer.Sound('sound/gameover.mp3')
# Define variables
starttime = time.time()
timedifference = 1
gametime = 0
alien_died = 0
collidetime = 0
hurttime = 0.05
hits = 0
Deswegen ist die Klasse so weit eingerückt.
__blackjack__ hat geschrieben: ↑Mittwoch 27. November 2024, 21:18
Eine `Bullet.collision()` sollte nichts direkt am internen Zustand von einem `Player` machen. Die kann dem `Player`-Objekt mitteilen, dass es getroffen wurde, und entsprechend selbst reagieren sollte, aber eine Bullet setzt beim Player kein neues Bild.
Das hatte ich mir auch gedacht, aber die Klasse Player wird vor der Klasse Bullet erstellt. Und scheinbar hat es dann keinen Effekt, wenn Player mit Bullet kollidiert.
Da passiert dann nicht, weshalb ich es dann so gemacht habe.
Ich wollte in die jeweiligen Kollisionen nur Änderungen eintrage, welches die eigene Klasse betrifft. Das ging leider nicht.
__blackjack__ hat geschrieben: ↑Mittwoch 27. November 2024, 21:18
Statt `time.time()` sollte man für so etwas `time.monotonic()` verwenden. Oder gar keine reale Zeit und das in Anzahl der `update()`-Aufrufe lösen, denn die Hauptschleife sollte ja mit einem Clock-Objekt auf eine FPS-Anzahl begrenzt sein, womit ein `update()` gleich einem “Frame“ ist.
Danke für Hinweis.
__blackjack__ hat geschrieben: ↑Mittwoch 27. November 2024, 21:18
Ansonsten steht die Lösung ja bereits im Titel des Themas: Wenn man eine aktuelle Zeitangabe aus der Hauptschleife haben möchte, muss man die den Methoden übergeben. Wenn man dann irgendwann anfängt zu viel Spielzustand übergeben zu müssen, macht es Sinn den Zustand des Spiels in eine Klasse zu stecken.
Und da weiß ich nicht, wie ich das genau bewerkstellige. Kannst du mir da mal zeigen, wie das geht?
Ich hatte es so probiert, dass ich in der Hauptschleife eine Variabl "actual_time" erstellt habe und dann in der Methode stehen hatte:
Aber das funktionierte auch nicht. "actual_time" war innerhalb der Methode auch nur ein Zeitstempel.....
Edit:
Ich habe den Fehler für die fehlende Kollidierung für den Player gefunden.
Die Klasse Bullet bemerkt die Kollision und setzt die Kugel zurück.
Aber der Player regisitriert davon nichts.