Maison  >  Article  >  développement back-end  >  Comment viser des balles en utilisant les coordonnées de la souris dans PyGame ?

Comment viser des balles en utilisant les coordonnées de la souris dans PyGame ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-01 17:30:30381parcourir

How To Aim Bullets Using Mouse Coordinates in PyGame?

Viser une balle dans PyGame à l'aide des coordonnées de la souris

Énoncé du problème

Malgré la création d'une classe de puces, les balles ne parviennent pas à déplacez-vous dans la direction prévue du curseur de la souris. Les tentatives de rotation et de déplacement des balles ont entraîné un comportement erratique.

Solution

1. Rotation et initialisation :

  • pygame.transform.rotate ne modifie pas l'objet d'origine, mais crée une nouvelle surface pivotée. Pour faire pivoter et initialiser correctement la balle, utilisez le code suivant :

    <code class="python">angle = math.degrees(math.atan2(-self.dir[1], self.dir[0]))
    
    self.bullet = pygame.Surface((7, 2)).convert_alpha()
    self.bullet.fill((255, 255, 255))
    self.bullet = pygame.transform.rotate(self.bullet, angle)</code>

2. Direction et vecteur unitaire :

  • Lorsqu'une balle est tirée, la direction doit être déterminée à ce moment-là et ne pas changer continuellement.
  • Calculez le vecteur de direction à partir de le joueur à la position de la souris et normalisez-la pour obtenir un vecteur unitaire :

    <code class="python">mx, my = pygame.mouse.get_pos()
    self.dir = (mx - x, my - y)
    length = math.hypot(*self.dir)
    if length == 0.0:
      self.dir = (0, -1)
    else:
      self.dir = (self.dir[0]/length, self.dir[1]/length)</code>

3. Mise à jour de la position :

  • Mettez à jour la position de la balle en redimensionnant la direction en fonction d'une vitesse et en l'ajoutant à la position actuelle :

    <code class="python">self.pos = (self.pos[0]+self.dir[0]*self.speed, 
              self.pos[1]+self.dir[1]*self.speed)</code>

4. Dessiner la balle :

  • Pour dessiner la balle pivotée dans la bonne position :

    <code class="python">bullet_rect = self.bullet.get_rect(center = self.pos)
    surf.blit(self.bullet, bullet_rect)  </code>

Exemple de code :

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

class Bullet:
    def __init__(self, x, y):
        # Calculate direction and rotation
        ...

        # Create the bullet surface
        ...

    def update(self):
        # Update bullet position
        ...

    def draw(self, surf):
        # Draw the rotated bullet
        ...

bullets = []
pos = (250, 250)
run = True
while run:
    # Game loop
    ...

    for bullet in bullets[:]:
        # Update bullets
        ...

    # Draw the scene
    ...</code>

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!

Déclaration:
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