【问题标题】:my pygame bullet sprites only fire once each time through loop. would like to fire multiple times我的 pygame 子弹精灵每次通过循环只触发一次。想多次开火
【发布时间】:2020-06-13 19:04:09
【问题描述】:

我对编码很陌生,我正试图让一艘船发射多发子弹,但每次我按空格键时,子弹都会重新触发,并且不会到达屏幕的末尾.似乎每次只调用我的 Bullet 类的一个实例,但我不知道如何修复它。这是我到目前为止的代码:

import sys

import pygame

from pygame.sprite import Sprite 

class Sideship():

    def __init__(self):

        pygame.init()

        self.screen = pygame.display.set_mode((1200,800))
        self.screen_rect = self.screen.get_rect()
        pygame.display.set_caption("Side Ship")
        self.bg_color = (50, 50, 255)

        self.bullets = pygame.sprite.Group()

        self.jet = Jet()

    def run_game(self):


        self.jet.rect.x = -20
        self.jet.rect.y = 290

        self.bullet = Bullet()

        while True:

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

                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_DOWN:

                        self.jet.moving_down = True

                    if event.key == pygame.K_UP:

                        self.jet.moving_up = True


                    if event.key == pygame.K_SPACE:

                        self.new_bullet = Bullet()

                        self.bullets.add(self.new_bullet)
                        self.new_bullet.rect.x = self.jet.rect.x+200
                        self.new_bullet.rect.y = self.jet.rect.y+30

                if event.type == pygame.KEYUP:
                    if event.key == pygame.K_DOWN:

                        self.jet.moving_down = False

                    if event.key == pygame.K_UP:

                        self.jet.moving_up = False

                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_q:
                        sys.exit() 

            self.jet.update()

            self.bullets.update()

            self.screen.fill(self.bg_color)

            self.bullets.update()

            for bullet in self.bullets.sprites():
                pygame.draw.rect(self.screen, self.new_bullet.bullet_color, self.new_bullet.rect)

            self.screen.blit(self.jet.image, self.jet.rect)

            pygame.display.flip()

class Jet():

    def __init__(self):

        self.image = pygame.image.load('jet.bmp')
        self.rect = self.image.get_rect()

        self.moving_down = False
        self.moving_up = False

        self.rect.y = float(self.rect.y)
        self.rect.x = float(self.rect.x)

    def update(self):
        if self.moving_down and self.rect.bottom < 801:    
            self.rect.y += 1.9 
        if self.moving_up and self.rect.top > -14:
            self.rect.y -= 1.4

class Bullet(Sprite):

    def __init__(self,):
         super().__init__()
         self.bullet_width = 30
         self.bullet_height = 5
         self.bullet_color = (250,250,250)
         self.rect = pygame.Rect(0,0, self.bullet_width, self.bullet_height)

    def update(self):
        self.rect.x += 4

side_ship = Sideship()
side_ship.run_game()

【问题讨论】:

    标签: pygame sprite


    【解决方案1】:

    问题在于绘制子弹的循环。当您遍历项目符号时,当前元素由bullet 引用。因此,您必须绘制bullet,而不是self.new_bullet

    pygame.draw.rect(self.screen, self.new_bullet.bullet_color, self.new_bullet.rect)

    for bullet in self.bullets.sprites():
       pygame.draw.rect(self.screen, bullet.bullet_color, bullet.rect)
    

    【讨论】:

    • 哇!!这完全有效,非常感谢你。我觉得我懂了。这基本上就像制作此列表中单个元素的实例,而我没有引用列表中的那个元素?我一直认为它应该是“self.new_bullet”,因为这是我为调用类 Bullet 的实例而分配的变量,但在循环中的这一点上并非如此,因为我正在尝试访问此列表的元素。对吗?
    • @SarabSingh 是的,这是正确的。 self.new_bullet 是构造的最后一个元素。 bullet 是循环的控制变量,包含元素in 子弹列表(一个接一个,循环的每次运行中都有一个)。请阅读What should I do when someone answers my question? 并考虑到accept the answer,您认为对您最有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2012-08-16
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    相关资源
    最近更新 更多