Comment faire en sorte que les puces suivent le curseur de la souris dans PyGame ?

Barbara Streisand
Libérer: 2024-11-03 18:53:29
original
787 Les gens l'ont consulté

How to Make Bullets Follow the Mouse Cursor in PyGame?

Tire des balles vers le curseur dans PyGame

Dans PyGame, créer des projectiles qui suivent la direction du curseur de la souris peut poser un défi. Examinons le code fourni et comblons ses lacunes.

Analyse du code existant

Le code actuel vise à :

  • Créer une classe Bullet pour représenter les projectiles.
  • Initialisez une classe Game pour gérer la génération et le mouvement des balles.

Cependant, l'implémentation présente quelques défauts :

  • Il utilise pygame .transform.rotate de manière incorrecte, ce qui renvoie une nouvelle surface pivotée au lieu de transformer l'objet d'origine.
  • Il tente de calculer dynamiquement la direction du mouvement et l'angle de rotation, ce qui conduit à un comportement imprévisible de la balle.

Approche corrigée

Pour résoudre ces problèmes, nous adoptons une approche différente :

  1. Initialiser les paramètres de puce à la création :

    • Lors de la création d'une nouvelle puce, calculez sa position de départ et son vecteur de direction vers le curseur de la souris.
    • Normalisez le vecteur de direction pour créer un vecteur unitaire.
  2. Pré-rotation de la balle :

    • Faites pivoter la surface de la balle pour l'aligner avec le vecteur de direction calculé.
  3. Mise à jour continue de la position :

    • Mettez à jour la position de la balle en ajoutant progressivement le vecteur de direction mis à l'échelle à sa position actuelle.

Exemple de mise en œuvre

<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>
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!