首页 > 解决方案 > 我的 pygame 子弹精灵每次通过循环只触发一次。想多次开火

问题描述

我对编码很陌生,我正试图让一艘船发射多发子弹,但每次我按下空格键时,子弹都会重新触发,并且不会到达屏幕的末尾。似乎每次只调用我的 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()

标签: pygamesprite

解决方案


问题出在循环中,它绘制了子弹。当您遍历项目符号时,当前元素由 引用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)

推荐阅读