Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann man in PyGame Kugeln dazu bringen, dem Mauszeiger zu folgen?

Wie kann man in PyGame Kugeln dazu bringen, dem Mauszeiger zu folgen?

Barbara Streisand
Barbara StreisandOriginal
2024-11-03 18:53:29790Durchsuche

How to Make Bullets Follow the Mouse Cursor in PyGame?

Kugeln auf den Cursor in PyGame abfeuern

In PyGame kann das Erstellen von Projektilen, die der Richtung des Mauszeigers folgen, eine Herausforderung darstellen. Lassen Sie uns den bereitgestellten Code untersuchen und seine Mängel beheben.

Analyse des vorhandenen Codes

Der aktuelle Code zielt darauf ab:

  • Eine Bullet-Klasse zu erstellen um Projektile darzustellen.
  • Initialisieren Sie eine Game-Klasse, um die Erzeugung und Bewegung von Kugeln zu handhaben.

Die Implementierung weist jedoch einige Mängel auf:

  • Es verwendet Pygame .transform.rotate falsch, was eine neue gedrehte Oberfläche zurückgibt, anstatt das ursprüngliche Objekt zu transformieren.
  • Es wird versucht, die Bewegungsrichtung und den Rotationswinkel dynamisch zu berechnen, was zu unvorhersehbarem Geschossverhalten führt.

Korrigierter Ansatz

Um diese Probleme zu beheben, verfolgen wir einen anderen Ansatz:

  1. Aufzählungsparameter bei der Erstellung initialisieren:

    • Berechnen Sie beim Erstellen eines neuen Aufzählungszeichens seine Startposition und den Richtungsvektor in Richtung des Mauszeigers.
    • Normalisieren Sie den Richtungsvektor, um einen Einheitsvektor zu erstellen.
  2. Drehen Sie das Geschoss vorab:

    • Drehen Sie die Geschossoberfläche, um sie am berechneten Richtungsvektor auszurichten.
  3. Kontinuierliche Positionsaktualisierung:

    • Aktualisieren Sie die Position des Geschosses, indem Sie den skalierten Richtungsvektor schrittweise zur aktuellen Position hinzufügen.

Beispielimplementierung

<code class="python">import pygame
import math

# Bullet Class
class Bullet:
    def __init__(self, x, y):
        # Calculate initial position and direction
        self.pos = (x, y)
        mx, my = pygame.mouse.get_pos()
        self.dir = (mx - x, my - y)
        # Normalize direction vector
        length = math.hypot(*self.dir)
        self.dir = (self.dir[0]/length, self.dir[1]/length)
        
        # Create bullet surface and rotate it
        self.bullet = pygame.Surface((7, 2)).convert_alpha()
        self.bullet.fill((255, 255, 255))
        angle = math.degrees(math.atan2(-self.dir[1], self.dir[0]))
        self.bullet = pygame.transform.rotate(self.bullet, angle)
        self.speed = 2  # Adjust bullet speed as desired

    def update(self):
        # Update position based on scaled direction vector
        self.pos = (self.pos[0]+self.dir[0]*self.speed, self.pos[1]+self.dir[1]*self.speed)

    def draw(self, surface):
        # Draw bullet aligned with the correct direction
        bullet_rect = self.bullet.get_rect(center=self.pos)
        surface.blit(self.bullet, bullet_rect)

# PyGame Main Loop
pygame.init()
window = pygame.display.set_mode((500, 500))
clock = pygame.time.Clock()
bullets = []  # List to store bullet objects

while True:
    clock.tick(60)  # Set desired frame rate
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.MOUSEBUTTONDOWN:
            # Create a new bullet and add it to the list
            bullets.append(Bullet(*pygame.mouse.get_pos()))

    # Update and draw bullets
    for bullet in bullets[:]:
        bullet.update()
        if not window.get_rect().collidepoint(bullet.pos):
            # Remove bullets that leave the window boundary
            bullets.remove(bullet)
        else:
            # Draw bullet at its current position
            bullet.draw(window)

    # Render the updated display
    pygame.display.update()</code>

Das obige ist der detaillierte Inhalt vonWie kann man in PyGame Kugeln dazu bringen, dem Mauszeiger zu folgen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn