>  기사  >  백엔드 개발  >  PyGame에서 총알이 마우스 커서를 따라가도록 만드는 방법은 무엇입니까?

PyGame에서 총알이 마우스 커서를 따라가도록 만드는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-03 18:53:29844검색

How to Make Bullets Follow the Mouse Cursor in PyGame?

PyGame에서 커서를 향해 총알 발사

PyGame에서 마우스 커서의 방향을 따르는 발사체를 만드는 것은 어려울 수 있습니다. 제공된 코드를 검토하고 단점을 해결해 보겠습니다.

기존 코드 분석

현재 코드의 목표는 다음과 같습니다.

  • Bullet 클래스 만들기 발사체를 나타냅니다.
  • 총알 생성을 처리하기 위해 Game 클래스를 초기화하고 movement.

그러나 구현에는 몇 가지 결함이 있습니다.

  • 원래 객체를 변환하는 대신 새로운 회전된 표면을 반환하는 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으로 문의하세요.