Pygame Vampire Survivors?
Hallo ich programmiere gerade ein Spiel in Pygame das dem Spiel Vampire Survivors ähnelt ich habe aktuell das problem das Problem das wenn der spieler auf die Gegner hinzu läuft die Gegener nach hinten verschoben werden staat nach vorn weil.
Also aktuell wenn ich stehe laufen die Gegner auf mich zu.
Und wenn ich von den Gegnern weg laufe werden sie aus dem Screen geschoben.
Aber wenn ich auf sie zu laufe werden sie auch aus dem Screen geschoben.
Obwohl sie dann normal laufen sollen als ob der spieler steth hier der wichtige code: def update(self, dt, player, screen_width, screen_height):
if not self.collided_with_enemy and self.is_visible:
dx = player.x - self.x
dy = player.y - self.y
distance = max(1, pygame.math.Vector2(dx, dy).length())
direction = pygame.math.Vector2(-dx / distance, -dy / distance)
player_rect = pygame.Rect(player.x, player.y, player.hitbox_width, player.hitbox_height)
enemy_rect = pygame.Rect(self.x, self.y, self.hitbox_width, self.hitbox_height)
if player_rect.colliderect(enemy_rect):
player.handle_collision()
self.speed = 0
return
if dx != 0 and dy != 0:
dx = 0
dy = 0
speed_multiplier = self.speed * dt
if player.is_moving:
speed_multiplier *= 0.5
# Anpassung der Bewegungsrichtung basierend auf dem Spielerstatus
if player.is_moving:
self.x -= direction.x * speed_multiplier
self.y -= direction.y * speed_multiplier
else:
self.x += direction.x * speed_multiplier
self.y += direction.y * speed_multiplier
self.x = max(-self.hitbox_width, min(self.x, screen_width))
self.y = max(-self.hitbox_height, min(self.y, screen_height))
self.animation_timer += dt
if self.animation_timer >= self.animation_speed:
self.animation_timer = 0
self.current_frame = (self.current_frame + 1) % self.animation_frames
# Anpassung der Geschwindigkeit basierend auf der Bewegungsrichtung des Spielers
player_direction = pygame.math.Vector2(player.x - self.x, player.y - self.y)
player_distance = max(1, player_direction.length())
player_direction = player_direction.normalize()
dot_product = player_direction.dot(direction)
if dot_product > 0.5:
# Spieler bewegt sich dem Gegner entgegen
self.speed = self.original_speed + 100
else:
# Spieler bewegt sich vom Gegner weg
self.speed = self.original_speed - 100
else:
self.x += self.direction * self.speed * dt
self.collided_with_enemy = False
for enemy in enemies:
if check_enemy_collision(player, enemy):
break
1 Antwort
Das Problem scheint darin zu liegen, dass Sie die Geschwindigkeit und Richtung des Spielers in die Bewegung des Gegners einbeziehen. In Ihrem Code hat die Variable
player.is_moving
Einfluss darauf, wie die Gegner sich bewegen. Wenn der Spieler sich bewegt, wird die Geschwindigkeit der Gegner halbiert und sie bewegen sich in die entgegengesetzte Richtung des Spielers.
Wenn der Spieler auf die Gegner zuläuft, würden Sie erwarten, dass sie in die gleiche Richtung laufen, als ob der Spieler stehen würde. Aber tatsächlich laufen sie in die entgegengesetzte Richtung, weil
player.is_moving
wahr ist.
Eine Möglichkeit, das Problem zu beheben, wäre, die Bewegung des Spielers nicht in die Bewegung der Gegner einfließen zu lassen. Das könnte so aussehen:
python
Copy code
# Gegner bewegen sich immer auf den Spieler zu, unabhängig davon, ob der Spieler sich bewegt oder nicht self.x += direction.x * speed_multiplier self.y += direction.y * speed_multiplier
Beachten Sie, dass es auch notwendig sein könnte, die Anpassung der Geschwindigkeit der Gegner basierend auf der Bewegungsrichtung des Spielers zu entfernen oder zu überarbeiten. Momentan erhöht sich die Geschwindigkeit der Gegner, wenn der Spieler sich auf sie zu bewegt, und verringert sich, wenn der Spieler sich von ihnen wegbewegt. Dies könnte dazu führen, dass die Gegner sehr schnell oder sehr langsam werden, je nachdem, wie sich der Spieler bewegt.