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

Java, JavaScript, Minecraft, C Sharp, Programmiersprache, Python, Python 3, Unity, Pygame
Pinball-Game / JavaScript: Wie kann ich die Kollisionserkennung implementieren?

Hallo zusammen,

ich muss für die Uni ein kleines Single Page 2D-Spiel entwickeln. Die Backend REST-API mit Python, das Frontend mit HTML/CSS, die Logik mit JavaScript. Die Animationen sollen wir selbst entwickeln und nicht z.B. von canvas-Objekten übernehmen.

Ich versuche zurzeit ein Pinball-Spiel (Flipper-Automaten) und habe das Grundgerüst mit CSS gebaut. Nur habe ich mir die Kollisionserkennung deutlich leichter vorgestellt, als sie wahrscheinlich ist.

So sieht das Spielfeld momentan aus:

Die JavaScript-Logik sodass der Ball im Spielfeld bleibt, ist ja recht simpel:

  var ball = document.getElementById('ball');
  var playArea = document.getElementById('play-area');
  var ballRadius = 10;
  var playAreaWidth = playArea.offsetWidth; // 600
  var playAreaHeight = playArea.offsetHeight; // 820
  var ballX = playAreaWidth / 2; // Startposition des Balls in der Mitte des Spielfelds
  var ballY = playAreaHeight / 2; // X = 300, Y = 410
  var ballSpeedX = 3; // Geschwindigkeit des Balls in horizontaler Richtung
  var ballSpeedY = 3; // Geschwindigkeit des Balls in vertikaler Richtung
  
  function updateBallPosition() {
    // Aktualisiere die Position des Balls basierend auf der aktuellen Geschwindigkeit
    ballX += ballSpeedX;
    ballY += ballSpeedY;
  
    if (ballX + ballRadius > playAreaWidth || ballX - ballRadius < 0) {
      ballSpeedX *= -1; // Richtungswechsel in der horizontalen Richtung
    }
  
    if (ballY + ballRadius > playAreaHeight || ballY - ballRadius < 0) {
      ballSpeedY *= -1; // Richtungswechsel in der vertikalen Richtung
    }
  
    // Setze die neue Position des Balls
    ball.style.left = ballX + 'px';
    ball.style.top = ballY + 'px';
  }
  
  // Aktualisiere die Position des Balls alle 16 Millisekunden (ca. 60 Frames pro Sekunde)
  setInterval(updateBallPosition, 16);
}

Aber wie man es implementiert, sodass der Ball von den Hindernissen und Banden richtig abprallt, sodass ein Richtungswechsel entsteht, habe ich noch nicht wirklich verstanden. Hätte da jemand eine Idee oder Erfahrung, wie man hier an die Kollisionserkennung herangehen könnte?

LG und danke im Voraus. :)

Bild zum Beitrag
HTML, CSS, Java, JavaScript, HTML5, Informatik, Programmiersprache, Webentwicklung
Strato Web-Baukasten anpassen?

Noch einmal vorab, nicht ich habe mir den Mis... gekauft, wollte jemanden helfen, der die Seite benötigt. Wenn sich also jemand mit Tricks im Strato Baukasten auskennt und so lieb sein mag, konstruktive Ansätze mit mir zu teilen, wäre ich sehr dankbar.

Hallo,

Es geht um einfachste Abläufe, die sich im Strato Baukasten nicht verwirklichen lassen. Der Strato Service war sehr hilfreich (Ironie)! Wenn jemand selbst schon Ideen über Umwege gefunden hat, würde ich mich sehr über einen Ideenaustausch freuen.

Alle Fragen wurden beantwortet mit "Ja, das sehen Sie leider richtig, dies ist nicht vorgesehen" weitere Aussage "Aber schreiben Sie das bitte als Wunsch und Beschwerde, das hören wir seit Jahren." :-(

Zu den Problemen:

Also lange Texte kann man nicht einfach kürzen und mit beispielsweise ...weiter kürzen, dies geht nur über eine versteckte Seite im Untermenü! Ebenso auf dieser versteckten Seite mit einem ...zurück!

Soweit so Gut (Schlecht), denn die ...zurück Verlinkung, kann man intern nur auf den Hauptreiter oder Unterseite oder versteckte Seite lenken! Bin ich aber in der Mitte der "Home" Seite (habe also dort drüber schon verschiedene Themen) und möchte jetzt ein Produkt beschreiben.

Also binde ich dort den ...weiter Link ein und möchte dann zurück auf die gleiche Höhe, ist dies nicht möglich, sondern man fängt ganz oben bei "Home" wieder an, da man den Bereich nicht wählen kann, wohin es zurückgehen soll :-(

Es gibt noch nicht einmal die Möglichkeit eines simplen "Ziehharmonika Effektes!"

Mit dem “Embed-Widget” hatte ich die Hoffnung, eine Art von Code einbinden zu können, aber trotz richtiger Codes, versteht das Tool wohl nur bestimmte Codes von Fremdseiten?!

Sollte sich schon einmal jemand mit diesem furchtbaren Baukasten beschäftigt haben und Ideen oder Tricks benennen können, wäre ich sehr dankbar. Es kann ja nicht sein, dass ich, dem Service von Strato erkläre, wie man gewisse Sachen bei Ihnen “faken” kann und dies leider auch nonstop muss (Thema Mehrsprachigkeit).

Mein Kopf raucht und ist müde, also sollte es jemanden da draußen geben, der am besten einen Ordner mit allen Strato-Tricks besitzt, wie man den Strato-Baukasten nutzen kann, lasse es mich bitte wissen. 

Fragen, warum ich mir den Stress überhaupt antue?! Ich wurde leider gefragt, ob ich helfen kann, da diejenige es für ein Jahr gekauft hat (Geld weg und 14 Tage um), wurde ich um eine Lösung für das Produkt/Problem gebeten.

Ich freue mich auf hilfreiche Antworten.

Danke GPM

Homepage, HTML, Webseite, CSS, JavaScript, Strato, Webentwicklung

Meistgelesene Beiträge zum Thema JavaScript