Maison > Article > développement back-end > Comment viser des balles en utilisant les coordonnées de la souris dans PyGame ?
É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 :
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!