Bagaimana untuk Membuat Peluru Mengikuti Kursor Tetikus dalam PyGame?

Barbara Streisand
Lepaskan: 2024-11-03 18:53:29
asal
786 orang telah melayarinya

How to Make Bullets Follow the Mouse Cursor in PyGame?

Menembakkan Peluru ke arah Kursor dalam PyGame

Dalam PyGame, mencipta projektil mengikut arah kursor tetikus boleh menimbulkan cabaran. Mari kita periksa kod yang disediakan dan atasi kekurangannya.

Analisis Kod Sedia Ada

Kod semasa bertujuan untuk:

  • Membuat kelas Bullet untuk mewakili projektil.
  • Mulakan kelas Permainan untuk mengendalikan penjanaan dan pergerakan peluru.

Walau bagaimanapun, pelaksanaannya mempunyai beberapa kelemahan:

  • Ia menggunakan pygame .transform.rotate secara tidak betul, yang mengembalikan permukaan berputar baharu dan bukannya mengubah objek asal.
  • Ia cuba mengira arah pergerakan dan sudut putaran secara dinamik, yang membawa kepada gelagat peluru yang tidak dapat diramalkan.

Pendekatan Dibetulkan

Untuk menyelesaikan isu ini, kami menggunakan pendekatan yang berbeza:

  1. Mulakan Parameter Peluru pada Penciptaan:

    • Apabila mencipta peluru baharu, kira kedudukan permulaan dan vektor arahnya ke arah kursor tetikus.
    • Normalkan vektor arah untuk mencipta vektor unit.
  2. Pra-Putar Peluru:

    • Putar permukaan peluru untuk menjajarkan dengan vektor arah yang dikira.
  3. Kemas kini Kedudukan Berterusan:

    • Kemas kini kedudukan peluru dengan menambah vektor arah berskala secara berperingkat pada kedudukan semasanya.

Contoh Pelaksanaan

<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>
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Membuat Peluru Mengikuti Kursor Tetikus dalam PyGame?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!