发射时子弹不会显示...属性似乎显示子弹正在移动但不会显示

Bullets wont show when fired... Attributes seems to show bullet is moving but wont show

下面是代码...首先定义项目符号class,在_fire_bullet、_update_screen和_check_KEYDOWN中调用class。当按下空格键时,事件处理程序应该接受事件键,调用 _fire_bullet 函数,在该函数中创建项目符号对象并将其添加到精灵列表中。然后开火并在屏幕上移动。到目前为止,它会朝着错误的方向移动,但当我真正看到子弹时,我会很容易地纠正这个问题。

#make a pygame window with a blue background
import pygame
import sys
from pygame.sprite import Sprite

class Bullet(Sprite):
    """ A class to manage bullets fired from the ship """
    def __init__(self, game):
        """ create a bullet object at the ships current position """
        super().__init__()
        self.screen = game.screen
        self.bullet_speed = 1.0
        self.bullet_width = 300
        self.bullet_height = 150
        self.bullet_color = (0, 200, 200)

        #create a bullet at rect (0,0) and the set the correct position
        self.rect = pygame.Rect(0, 0, self.bullet_width, self.bullet_height)
        self.rect.midright = game.rect.midright

        #store the bullets position as a decimal value
        self.y = float(self.rect.y)
        self.x = float(self.rect.x)

    def update(self):
        """ move the bullet up the screen """
        #update the decimal position of the bullet.
        self.y -= self.bullet_speed
        self.rect.x = self.x
        #uipdate the rect position
        self.rect.y = self.y

    def draw_bullet(self):
        """ draw the bullet to the screen """
        pygame.draw.rect(self.screen, self.bullet_color, self.rect)





class Game:
    """ a class the creates a window with a blue screen """
    def __init__(self):
        pygame.init()


        #--------------------------------------------------------------------------------------------
        #screen size, color, caption
        self.screen = pygame.display.set_mode((1200,800))   #create attribute to hold display settings
        self.bg_color = (250,250,250)                           #create attribute to hold RGB color (blue)
        pygame.display.set_caption("Blue Screen")
        #--------------------------------------------------------------------------------------------


        #--------------------------------------------------------------------------------------------
        #tank drawing
        self.screen_rect = self.screen.get_rect()               #get the screen rect dim
        self.image = pygame.image.load('images/tank.bmp')       #load the image from directory
        self.rect = self.image.get_rect()                       #get the image rect dim
        self.rect.center = self.screen_rect.center              #store the screens center x/y coord 
        #tank movement
        self.tank_moving_left = False
        self.tank_moving_right = False
        self.tank_moving_up = False
        self.tank_moving_down = False
        self.tank_speed = 1                                                     #tank pixels
        self.direction_right = self.image                                       #holds right image
        self.direction_left = pygame.transform.flip(self.image, True, False)    #holds left image
        #--------------------------------------------------------------------------------------------

        self.bullets = pygame.sprite.Group()

    def move(self):
        """ move tnak tank_speed based on direction of movement (key pressed)
            also detect collision """ 
        if self.tank_moving_right and self.rect.right < self.screen_rect.right:
            self.rect.x += self.tank_speed
        if self.tank_moving_left and self.rect.left > self.screen_rect.left:
            self.rect.x -= self.tank_speed
        if self.tank_moving_down and self.rect.bottom < self.screen_rect.bottom:
            self.rect.y += self.tank_speed
        if self.tank_moving_up and self.rect.top > self.screen_rect.top:
            self.rect.y -= self.tank_speed

    def blitme(self):
        """ draw the image of the tank """
        self.screen.blit(self.image, self.rect)


    def _update_screen(self):
        """ update screen """
        self.screen.fill(self.bg_color)
        self.blitme()
        pygame.display.flip()

        for bullet in self.bullets.sprites():
            bullet.draw_bullet()
            print(bullet.rect.midright)

    def _check_KEYDOWN(self, event):
        """ when key is press either quit, or move direction of arrow pressed and flip image """
        if event.key == pygame.K_q:
            sys.exit()
        elif event.key == pygame.K_RIGHT:
            self.tank_moving_right = True
            self.image = self.direction_right
        elif event.key == pygame.K_LEFT:
            self.tank_moving_left = True
            self.image = self.direction_left
        elif event.key == pygame.K_UP:
            self.tank_moving_up = True
        elif event.key == pygame.K_DOWN:
            self.tank_moving_down = True
        elif event.key == pygame.K_SPACE:
            self._fire_bullet() 
            print(1)

    def _check_KEYUP(self, event):
        """ when key is let go stop moving """
        if event.key == pygame.K_RIGHT:
            self.tank_moving_right = False
        elif event.key == pygame.K_LEFT:
            self.tank_moving_left = False
        elif event.key == pygame.K_UP:
            self.tank_moving_up = False
        elif event.key == pygame.K_DOWN:
            self.tank_moving_down = False

    def _fire_bullet(self):
        """ create a bullet and add it to the bullets group """
        new_bullet = Bullet(self)
        self.bullets.add(new_bullet)

    def run_game(self):
        """ loops the game/ updates screen/ checks for key clicks"""
        while True:

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()
                elif event.type == pygame.KEYDOWN:
                    self._check_KEYDOWN(event)
                elif event.type == pygame.KEYUP:
                    self._check_KEYUP(event)

            self.move()
            self.bullets.update()
            self._update_screen()






if __name__ == '__main__':
    a = Game()
    a.run_game()

您的 _update_screen() 函数正在更新显示后绘制子弹。当您用背景色填充屏幕时,下次调用 _update_screen() 时项目符号将被覆盖。

如果您按如下方式重新排序屏幕更新功能,您应该能够看到项目符号:

def _update_screen(self):
    """ update screen """
    self.screen.fill(self.bg_color)
    self.blitme()

    for bullet in self.bullets.sprites():
        bullet.draw_bullet()
        print(bullet.rect.midright)
    pygame.display.flip()

此外,您可以通过更改初始化函数为子弹创建图像:

…
#create a bullet at rect (0,0) and the set the correct position
self.image = pygame.Surface((self.bullet_width, self.bullet_height))
self.image.fill(self.bullet_color)
self.rect = self.image.get_rect()

那你就不需要draw_bullet()功能了,你可以把_update_screen()中的个别子弹的绘制换成self.bullets.draw(self.screen)