微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pygame 中的移动子弹

如何解决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),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)

解决方法

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

向类 rocket 的方法 draw_bullet 添加参数 BULLET。确保只有在子弹尚未发射时才能发射子弹 (self.move[1] == 0)。计算火箭的中心并设置子弹的位置(rocket.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)

    # [...]

如果您想发射多发子弹,请参阅问题的答案:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。