首页  >  文章  >  后端开发  >  如何在 PyGame 中让子弹跟随鼠标光标?

如何在 PyGame 中让子弹跟随鼠标光标?

Barbara Streisand
Barbara Streisand原创
2024-11-03 18:53:29843浏览

How to Make Bullets Follow the Mouse Cursor in PyGame?

在 PyGame 中向光标发射子弹

在 PyGame 中,创建跟随鼠标光标方向的射弹可能会带来挑战。让我们检查一下提供的代码并解决其缺点。

现有代码分析

当前代码的目标是:

  • 创建一个 Bullet 类来表示射弹。
  • 初始化一个 Game 类来处理子弹的生成和移动。

但是,实现有一些缺陷:

  • 它使用 pygame .transform.rotate 错误,返回一个新的旋转表面,而不是变换原始对象。
  • 它试图动态计算移动方向和旋转角度,这会导致不可预测的子弹行为。

正确的方法

为了解决这些问题,我们采用不同的方法:

  1. 在创建时初始化项目符号参数:

    • 创建新子弹时,计算其起始位置和朝向鼠标光标的方向向量。
    • 标准化方向向量以创建单位向量。
  2. 预旋转子弹:

    • 旋转子弹表面以与计算的方向向量对齐。
  3. 连续位置更新:

    • 通过将缩放的方向向量增量添加到其当前位置来更新子弹的位置。

示例实现

<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>

以上是如何在 PyGame 中让子弹跟随鼠标光标?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn