0

I'm trying to draw a bullet when user press "space", but its not displaying even when I call pygame.draw.rect() after pygame.display.fill().

The bullet would only get displayed when I comment out the pygame.display.fill()

I think the only problem is in main.py, but I couldn't figure out why

main.py

import pygame
from settings import GameSettings
from player_ship import PlayerShip
from bullet import Bullet

class AlienInvasion:
    def __init__(self):
        pygame.init()
        self.settings = GameSettings()
        self.game_screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))
        self.bullets = []

        self.player_ship = PlayerShip(self, self.settings)

        self.active = True


    def run_game(self):
        while self.active:
            self.game_screen.fill(self.settings.bg_color) # calling surface.fill before pygame.draw.rect()

            self.check_game_events() # bullet object gets created in here
            self.player_ship.move_on_command()

            self.update_screen() # pygame.display.flip() in here


    def update_screen(self):
        self.player_ship.blitme()

        pygame.display.flip()


    def check_game_events(self):

        for event in pygame.event.get():

            if event.type == pygame.QUIT:
                self.active = False

            if event.type == pygame.KEYDOWN:
                self.kdown_events(event)

            if event.type == pygame.KEYUP:
                self.kup_event(event)

    def kdown_events(self, event):
        if event.key == pygame.K_LEFT:
            self.player_ship.move_left = True

        if event.key == pygame.K_RIGHT:
            self.player_ship.move_right = True

        if event.key == pygame.K_q:
            self.active = False

        if event.key == pygame.K_SPACE:
            bullet = Bullet(self)
            bullet.draw_bullet()


    def kup_event(self, event):
        if event.key == pygame.K_LEFT:
            self.player_ship.move_left = False

        if event.key == pygame.K_RIGHT:
            self.player_ship.move_right = False


if __name__ == "__main__":
    main_game = AlienInvasion()

    main_game.run_game()

bullet.py

import pygame

class Bullet():
    def __init__(self, main_game):
        self.game_screen = main_game.game_screen
        self.rect = pygame.Rect(10, 10, 20, 20)
        self.color = (48, 141, 70)

        self.rect.x = 200
        self.rect.y = 200


    def draw_bullet(self):
        pygame.draw.rect(self.game_screen, self.color, self.rect)

settings.py

class GameSettings:
    def __init__(self):
        self.screen_size = (800, 600)
        self.screen_width = 800
        self.screen_height = 600
        self.bg_color = (230, 230, 230)
        self.playership_img_fp = "static/images/ship.bmp"

        self.dist_move_on_kpress = 1

player_ship.py

import pygame

class PlayerShip:
    def __init__(self, main_game, settings):
        self.settings = settings

        self.game_screen = main_game.game_screen
        self.game_screen_rect = self.game_screen.get_rect()

        self.image = pygame.image.load(settings.playership_img_fp)
        self.rect = self.image.get_rect()

        self.rect.midbottom = self.game_screen_rect.midbottom

        self.move_left = False
        self.move_right = False

    def blitme(self):
        self.game_screen.blit(self.image, self.rect)

    def move_on_command(self):
        if self.move_right:
            if self.rect.right < self.game_screen_rect.right:
                self.rect.x += self.settings.dist_move_on_kpress

        if self.move_left:
            if self.rect.left > self.game_screen_rect.left:
                self.rect.x -= self.settings.dist_move_on_kpress


vid Proli
  • 27
  • 4

1 Answers1

0

Probably because the drawn rect got covered-up by pygame.display.fill() on the next frame.

Solution is to add created bullets into a list as an attribute, then draw all bullets in the list on every frame

to kdown_events() -> if event.key == pygame.K_SPACE:

self.bullets.append(Bullet(self))

to update_screen()

for bullet in self.bullets:
    bullet.draw_bullet()
vid Proli
  • 27
  • 4