feat: tower sound effects

- integrate sound_manager into Tower class
- add sfx for buy success/fail, tower shoot, and monster hit
This commit is contained in:
Berger Lena
2026-05-08 18:57:20 +02:00
parent 20c47e5d55
commit daf2de0e73
+10 -25
View File
@@ -1,5 +1,3 @@
from turtledemo.lindenmayer import draw
import pygame import pygame
import random import random
import math import math
@@ -13,7 +11,9 @@ respawn_delay = 10000 # ms bis neues Feld spawnt
class Tower: class Tower:
def __init__(self) -> None: def __init__(self, sound_manager) -> None:
self.sound_manager = sound_manager
# Feld und Tower -> None wenn nicht aktiv # Feld und Tower -> None wenn nicht aktiv
# Position interagierbares Feld # Position interagierbares Feld
self.field_rect: pygame.Rect = None self.field_rect: pygame.Rect = None
@@ -24,7 +24,7 @@ class Tower:
# Zeitpunkt, wann der Tower gebaut wurde # Zeitpunkt, wann der Tower gebaut wurde
self.tower_start: int = None self.tower_start: int = None
# Zeitpunkt, wann Tower despawnt ist # Zeitpunkt, wann Tower despawnt ist
self.despawn_timer: int = None self.despawn_time: int = None
# Zeitpunkt des letzten Schusses # Zeitpunkt des letzten Schusses
self.last_shot: int = 0 self.last_shot: int = 0
@@ -65,9 +65,11 @@ class Tower:
return False return False
# prüft alle Bedingungen gleichzeitig # prüft alle Bedingungen gleichzeitig
if not (self.field_rect.colliderect(player_rect) and keys[pygame.K_e] and ects.balance >= TOWER_COST): if not (self.field_rect.colliderect(player_rect) and keys[pygame.K_e] and ects.balance >= TOWER_COST):
self.sound_manager.play_sfx("buy_fail")
return False return False
# ECTS abziehen und Tower bauen # ECTS abziehen und Tower bauen
self.sound_manager.play_sfx("buy_success")
ects.balance -= TOWER_COST ects.balance -= TOWER_COST
self.tower_rect = self.field_rect self.tower_rect = self.field_rect
self.field_rect = None self.field_rect = None
@@ -100,6 +102,7 @@ class Tower:
"vel_y": (dy / distance) * PROJECTILE_SPEED, "vel_y": (dy / distance) * PROJECTILE_SPEED,
}) })
self.sound_manager.play_sfx("tower_shoot")
self.last_shot = now self.last_shot = now
# Bewegung der Projektile und Kollision mit Monster prüfen # Bewegung der Projektile und Kollision mit Monster prüfen
@@ -110,6 +113,7 @@ class Tower:
# Projektil trifft auf Monster -> Schaden wird addiert und Projektil entfernt # Projektil trifft auf Monster -> Schaden wird addiert und Projektil entfernt
if monster_rect and pygame.Rect(int(p["x"]), int(p["y"]), projectile_size, projectile_size).colliderect(monster_rect): if monster_rect and pygame.Rect(int(p["x"]), int(p["y"]), projectile_size, projectile_size).colliderect(monster_rect):
total_damage += PROJECTILE_DMG total_damage += PROJECTILE_DMG
self.sound_manager.play_sfx("monster_hit")
self.projectiles.remove(p) self.projectiles.remove(p)
# wenn der Tower abgelaufen ist, soll er despawnen und ein Timer starten # wenn der Tower abgelaufen ist, soll er despawnen und ein Timer starten
@@ -165,8 +169,7 @@ class Tower:
else: else:
# Fallback - gelbes Rechteck # Fallback - gelbes Rechteck
pygame.draw.rect(surface, COLOR_PROJECTILE, pygame.draw.rect(surface, COLOR_PROJECTILE,
pygame.Rect(int(p["x"]) - cam_x, int(p["y"]) - cam_y, projectile_size, projectile_size)) pygame.Rect(draw_x, draw_y, projectile_size, projectile_size))
@@ -175,22 +178,4 @@ class Tower:
self.field_rect = None self.field_rect = None
self.tower_rect = None self.tower_rect = None
self.projectiles = [] self.projectiles = []
self.despawn_timer = None self.despawn_time = None