Функция Blit не работает для отображения изображения

В настоящее время я слежу за видео по pygame и создаю игру типа космических захватчиков, которую я изменю для своей собственной реализации игры. Однако я добрался до раздела, где вы должны использовать функцию blit, чтобы отобразить изображение для фона игры, и у меня это не работает. После выполнения программы окно запускается, но без изображения, отображаемого в качестве фона. Я считаю, что правильно загрузил изображение и вошел в функцию, которая также будет использовать функцию blit для отображения фонового изображения. Пожалуйста, дайте мне знать, если я что-то упустил из виду, любая помощь будет принята с благодарностью.

import pygame
import os
import time
import random


#Setting window frame
WIDTH, HEIGHT = 1000, 600
WINDOW = pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption("Space Battle")

#Image Loading

RED_SPACESHIP = pygame.image.load(os.path.join("assets", "pixel_ship_red_small.png"))
GREEN_SPACESHIP = pygame.image.load(os.path.join("assets", "pixel_ship_green_small.png"))
BLUE_SPACESHIP = pygame.image.load(os.path.join("assets", "pixel_ship_blue_small.png"))

#Ship for player
YELLOW_SPACESHIP = pygame.image.load(os.path.join("assets", "pixel_ship_yellow.png"))

#Laser loading
YELLOW_LASER = pygame.image.load(os.path.join("assets", "pixel_laser_yellow.png"))
RED_LASER = pygame.image.load(os.path.join("assets", "pixel_laser_red.png"))
GREEN_LASER = pygame.image.load(os.path.join("assets", "pixel_laser_green.png"))
BLUE_LASER = pygame.image.load(os.path.join("assets", "pixel_laser_blue.png"))

Вот код для загрузки фонового изображения

#Loading Backgrnd Img

BG = pygame.image.load(os.path.abspath("assets/background-black.png"))
formatedBG = pygame.transform.scale(BG, (WIDTH,HEIGHT))

Вот код основной функции и обработки фонового отображения.

def window_Redraw():
    WINDOW.blit(formatedBG, (0,0))
    pygame.display.update() 


def main():
    run = True
    FPS = 60
    clock = pygame.time.Clock()
    
    while run:
        clock.tick(FPS)
        window_Redraw()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False

main()

Вот скриншот окна после выполнения: введите здесь описание изображения


person cody neal    schedule 17.07.2020    source источник
comment
не могли бы вы предоставить нам полный код, чтобы понять, что происходит. как инициализируется WINDOW? Что вы имеете в виду, говоря, что это не работает для меня? Возникает ли исключение? Или вы не видите результата?   -  person qouify    schedule 17.07.2020
comment
@qouify Я добавил начало программы, чтобы показать инициализацию WINDOW. Исключение не возникает. После выполнения окно отображается без какого-либо набора изображений, просто пустое окно по умолчанию.   -  person cody neal    schedule 17.07.2020


Ответы (2)


Ваш пример намного сложнее, чем должен быть. RED_SPACESHIP, BLUE_SPACESHIP... и т. д. в данном случае не имеют значения, и вы должны удалить их.

У вас отображается только черный фон - больше ничего, так и должно отображаться. Для того, чтобы проверить, все ли работает, начнем с этого примера:

import pygame

# initialize the pygame module
pygame.init()

WIDTH, HEIGHT = 1000, 600
WINDOW = pygame.display.set_mode((WIDTH, HEIGHT))

formatedBG = pygame.Surface((WIDTH, HEIGHT))
formatedBG.fill(pygame.color.Color(255, 0, 0, 0))

# BG = pygame.image.load(os.path.abspath("assets/background-black.png"))
# formatedBG = pygame.transform.scale(BG, (WIDTH, HEIGHT))


run = True
while run:
    WINDOW.blit(formatedBG, (0, 0))
    pygame.display.update()

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

А затем раскомментируйте фон, чтобы проверить, изменился ли фон на черный цвет.

person Benjamin    schedule 18.07.2020
comment
Привет, Бенджамин, redspaceship,... и т. д. были загружены для использования в более позднем этапе сценария, однако на этом я остановился, потому что застрял. Кто-то ранее спрашивал, как было инициализировано окно, поэтому я предоставил начало кода, поэтому эти константы показаны. Во-вторых, я думаю, что название изображения, которое я загружаю в качестве фона, может ввести вас в заблуждение, так как на самом деле это не сплошной черный фон. Я пошел дальше и протестировал ваш код (только из-за вашей тяжелой работы и усилий), и все еще не повезло, начав думать, что это более серьезная проблема. - person cody neal; 18.07.2020
comment
Что означает "не повезло"? Правильно ли отображается красный цвет? Я полагаю, что эти «красные космические корабли и т. д.» могут быть полезны, но в этом примере они не нужны, поэтому их можно удалить, чтобы предоставить минимальный пример. - person Benjamin; 18.07.2020
comment
«Не повезло» означает, что после запуска вашего кода он не дал мне никаких отличных результатов, чем раньше. Во время выполнения окно вообще не заполнялось цветом. Раскомментирование фона также не отображало изображение. - person cody neal; 18.07.2020
comment
Фон окна белый или прозрачный? Кроме того, я только что понял, что в начале нет метода pygame.init(). Не могли бы вы попробовать сейчас? - person Benjamin; 18.07.2020
comment
Я пошел дальше и прикрепил скриншот окна к исходному сообщению, чтобы прояснить, что происходит во время выполнения. - person cody neal; 18.07.2020
comment
Привет, Бенджамин. Я наконец-то понял проблему после проведения дополнительных исследований и просмотра сообщений о переполнении стека. По какой-то причине версия моего pygame создавала эти проблемы. После обновления pygame до 2.0.0.dev4 с помощью «pip install==2.0.0.dev4» у меня все заработало нормально. Фон заполнился цветом, и я также смог правильно загрузить исходное фоновое изображение. Спасибо за вашу помощь в этом! - person cody neal; 18.07.2020

Моя предыдущая версия pygame, которая была 1.9.4, вызывала у меня первоначальные проблемы с отображением фонового изображения с помощью blit и проблему с тем, что окно не могло отображать какой-либо цвет с помощью функции заливки. Я решил эти проблемы, выполнив команду «pip install==2.0.0.dev4» для обновления pygame. Кажется, теперь все работает правильно.

person cody neal    schedule 18.07.2020