首頁 >後端開發 >Python教學 >如何在 PyGame 中讓子彈跟隨滑鼠遊標?

如何在 PyGame 中讓子彈跟隨滑鼠遊標?

Barbara Streisand
Barbara Streisand原創
2024-11-03 18:53:29887瀏覽

How to Make Bullets Follow the Mouse Cursor in PyGame?

在 PyGame 中向遊標發射子彈

在 PyGame 中,創建滑鼠遊標方向的射彈可能會帶來挑戰。跟隨。讓我們檢查一下提供的程式碼並解決其缺點。

現有程式碼分析

目前程式碼的目標是:

  • 建立一個 Bullet 類別來表示一個 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