首页 > 解决方案 > 在 Pygame 中移动子弹

问题描述

我正在用 pygame 制作一个简单的游戏,你应该在其中躲避或射击穿过屏幕下降的目标。到目前为止,我已经创建了飞船并设法设置了子弹和飞船的运动,至于它们的键绑定。然而,子弹的x坐标似乎根本没有改变,即使我在子弹类的init方法中定义了子弹x坐标等于船x坐标,因此,子弹总是会离开船的位置。相反,子弹总是离开屏幕的中间。我找不到问题。任何帮助将不胜感激

import pygame, sys
pygame.init()

clock = pygame.time.Clock()

screen_width = 600
screen_height = 800

screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("Space Race Game")

class ROCKET:
    def __init__(self):
        self.rocketImg = pygame.image.load("spaceship.png")
        self.rocket_x = screen_width/2 - 32
        self.rocket_y = screen_height/2 + 100

    def draw_rocket(self):
        screen.blit(self.rocketImg, (self.rocket_x, self.rocket_y))

    def move_rocket(self):
        key = pygame.key.get_pressed()

        if key[pygame.K_LEFT] and self.rocket_x + 15 > 0:
            self.rocket_x -= 5

        if key[pygame.K_RIGHT] and self.rocket_x < screen_width - 40:
            self.rocket_x += 5

class BULLET(ROCKET):
    def __init__(self):
        super().__init__()
        self.bullet_width = 10
        self.bullet_height = 20
        self.bullet_x = self.rocket_x + 25
        self.bullet_y = self.rocket_y
        self.move = [0, 0]
        self.bullet_speed = 5
        self.bullet_rect = pygame.Rect(self.bullet_x, self.bullet_y, self.bullet_width, self.bullet_height)

    def draw_bullet(self):
        key = pygame.key.get_pressed()

        if key[pygame.K_SPACE]:
            self.bullet_x = self.rocket_x
            self.move[1] = -1

        self.bullet_y += self.move[1] * self.bullet_speed
        self.bullet_rect.topleft = (self.bullet_x, self.bullet_y)

        if self.bullet_y < self.rocket_y - 10:
            pygame.draw.rect(screen, (0, 0, 0), self.bullet_rect)

        if self.bullet_y < - 20:
            self.bullet_y = self.rocket_y
            self.move[1] = 0

rocket = ROCKET()
bullet = BULLET()

while True:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    screen.fill((255, 255, 255))
    rocket.draw_rocket()
    rocket.move_rocket()
    bullet.draw_bullet()


    pygame.display.flip()
    clock.tick(60)

标签: pythonpygame

解决方案


您必须通过火箭的当前 x 坐标设置子弹的 x 坐标。

为类rocket的方法添加一个参数。确保只有在子弹尚未发射时才能发射子弹 ( )。计算火箭的中心并设置子弹的位置 ( ):draw_bulletBULLETself.move[1] == 0rocket.rocket_x + self.rocketImg.get_width() // 2

class BULLET(ROCKET):
    # [...]

    def draw_bullet(self, rocket):
        key = pygame.key.get_pressed()

        if key[pygame.K_SPACE] and self.move[1] == 0:
            rocket_center_x = rocket.rocket_x + self.rocketImg.get_width() // 2 
            self.bullet_x = rocket_center_x - self.bullet_width // 2
            self.move[1] = -1

        # [...]

将实例ROCKET传递给方法draw_bullet

while True:
    # [...]

    bullet.draw_bullet(rocket)

    # [...]

如果您想发射多发子弹,请查看以下问题的答案:


推荐阅读