V
V
Viktor2021-04-05 18:55:33
Python
Viktor, 2021-04-05 18:55:33

Black screen and no pygame start button visible. How to fix it?

Hello. I'm trying to write my first game using pygame and I ran into this problem. Black screen on startup, as shown in the picture. When you click on the highlighted place, the game starts, because. there is a button.
606b2da6deeb7921817735.jpeg
Here are the code snippets
Button Code

import pygame.font


class Button:

    def __init__(self, ai_settings, screen, msg):
        """Инициализирует атрибуты кнопки"""

        self.screen = screen
        self.screen_rect = screen.get_rect()

        # назначение размеров и свойств кнопки
        self.width, self.height = 200, 50
        self.button_color = (0, 255, 0)
        self.text_color = (255, 255, 255)
        self.font = pygame.font.SysFont("Verdana", 48)

        # построение объекта rect кнопки и выравнивание по центру экрана
        self.rect = pygame.Rect(0, 0, self.width, self.height)
        self.rect.center = self.screen_rect.center

        # сообщение кнопки создаётся только один раз
        self.prep_msg(msg)

    def prep_msg(self, msg):
        """
        Преобразует msg в прямоугольник и выравнивает текст по центру
        """

        self.msg_image = self.font.render(msg, True, self.text_color, self.button_color)
        self.msg_image_rect = self.msg_image.get_rect()
        self.msg_image_rect.center = self.rect.center

    def draw_button(self):
        """Отображение пустой кнопки и вывод сообщения"""
        self.screen.fill(self.button_color, self.rect)
        self.screen.blit(self.msg_image, self.msg_image_rect)


Game functions associated with the button
def check_events(ai_settings, screen, stats, play_button, ship, aliens, bullets):
    """
    Обрабатывает нажатия клавиш и события мыши
    """

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            check_keydown_events(event, ai_settings, screen, ship, bullets)
        elif event.type == pygame.KEYUP:
            check_keyup_events(event, ship)
        elif event.type == pygame.MOUSEBUTTONDOWN:
            mouse_x, mouse_y = pygame.mouse.get_pos()
            check_play_button(ai_settings, screen, stats, play_button, ship,
                              aliens, bullets, mouse_x, mouse_y)


def check_play_button(ai_settings, screen, stats, play_button, ship, aliens,
                      bullets, mouse_x, mouse_y):
    """Запускает новую игру при нажатии кнопки Play"""
    
    if play_button.rect.collidepoint(mouse_x, mouse_y):
        # сброс игровой статистики
        stats.reset_stats()

        stats.game_active = True

        # очистка списков пришельцев и пуль
        aliens.empty()
        bullets.empty()

        # создание нового флота и размещение корабля в центре
        create_fleet(ai_settings, screen, ship, aliens)
        ship.center_ship()


def update_screen(ai_settings, screen, stats, ship, aliens, bullets, play_button):
    """
    Обновляет изображение на экране и
    отображает новый экран
    """

    # При каждом проходе цикла перерисовывается экран
    screen.fill(ai_settings.bg_color)

    # Все пули выводятся позади изображений корабля пришельцев
    for bullet in bullets.sprites():
        bullet.draw_bullet()
    ship.blitme()
    aliens.draw(screen)

    # Кнопка Play отображается в том случае, если игра неактивна
    if not stats.game_active:
        play_button.draw_button()

    # Отображение последнего прорисованного экрана
    pygame.display.flip()


The code responsible for starting the game in an inactive state
# Игра запускается в неактивном состоянии
       self.game_active = False

I can post the full code if needed.
So here's the question. Why does the game start with a black screen and how to fix it? Thanks in advance

PS Here is the whole code https://github.com/Gorlinskyi/alien_invasion

Answer the question

In order to leave comments, you need to log in

1 answer(s)
V
Viktor, 2021-04-09
@Dovahki_in

Solution found. You just need to slightly change the while

while True:
        gf.check_events(ai_settings, screen, stats, play_button,
                        ship, aliens, bullets)

        if stats.game_active:
            ship.update()
            gf.update_bullets(ai_settings, screen, ship, aliens, bullets)
            gf.update_aliens(ai_settings, stats, screen, ship, aliens, bullets)
            gf.update_screen(ai_settings, screen, stats, ship, aliens, bullets, play_button)
        # ниже вносимые изменения
        else:
            gf.update_screen(ai_settings, screen, stats, ship, aliens, bullets, play_button)

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question