Home > Article > Backend Development > How To Aim Bullets Using Mouse Coordinates in PyGame?
Problem Statement
Despite creating a bullet class, the bullets fail to move in the intended direction of the mouse cursor. Attempts to rotate and move the bullets resulted in erratic behavior.
Solution
1. Rotation and Initialization:
pygame.transform.rotate does not modify the original object, but creates a new rotated surface. To correctly rotate and initialize the bullet, use the following code:
<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 and Unit Vector:
Calculate the direction vector from the player to the mouse position and normalize it to obtain a unit vector:
<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. Position Update:
Update the bullet's position by scaling the direction by a velocity and adding it to the current position:
<code class="python">self.pos = (self.pos[0]+self.dir[0]*self.speed, self.pos[1]+self.dir[1]*self.speed)</code>
4. Drawing the Bullet:
To draw the rotated bullet in the correct position:
<code class="python">bullet_rect = self.bullet.get_rect(center = self.pos) surf.blit(self.bullet, bullet_rect) </code>
Example 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>
The above is the detailed content of How To Aim Bullets Using Mouse Coordinates in PyGame?. For more information, please follow other related articles on the PHP Chinese website!