Pygame не переносит изображения на холст

Я сделал значок для графического интерфейса в небольшом проекте, над которым я работаю, и pygame его не отображает. Что я делаю неправильно?

import pygame
black = (0,0,0)
toolscanvas = pygame.Surface((700,120))

pygame.init()
gameDisplay = pygame.display.set_mode((0,0),pygame.FULLSCREEN)
gameDisplay.fill(black)
gameDisplay.convert()
clock = pygame.time.Clock()


class GuiHouse:
    def __init__(self):
        self.x = 0
        self.y = 20
        self.canvas = pygame.Surface((300,300))
        self.canvas.set_alpha(128)
        self.iconed = pygame.image.load("house_icon.png").convert_alpha()
        self.iconed = pygame.transform.scale(self.iconed, (60, 60))
    def display(self):
        global toolscanvas
        toolscanvas.fill((0,0,0))
        self.canvas.blit(self.iconed, (0, 0))
        toolscanvas.blit(self.canvas, (self.x, self.y))
        gameDisplay.blit(toolscanvas,(0,0))


guihouse = GuiHouse()
while True:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                pygame.quit()
                quit()
    guihouse.display()
    pygame.display.update()
    clock.tick(120)

Настоящий код намного длиннее, дайте мне знать, если он не работает. Вот как должен выглядеть значок  house_icon


person Anonymous    schedule 09.10.2018    source источник


Ответы (1)


Есть две небольшие ошибки

  1. Вы забыли нарисовать toolscanvas на основном дисплее pygame (gameDisplay.blit(toolscanvas, (0, 0)))
  2. Изображение читается с альфа-каналом и имеет только черные пиксели. Итак, вы рисуете черную картинку на черном фоне. В качестве примера решения я добавил заливку холста изображения белым цветом, так что теперь изображение видно, но не красиво. Но надеюсь, вы найдете решение получше :)

Пример решения:

black = (0, 0, 0)
white = (255, 255, 255)
toolscanvas = pygame.Surface((700, 120))

pygame.init()
gameDisplay = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
gameDisplay.fill(black)
gameDisplay.convert()
clock = pygame.time.Clock()


class GuiHouse:
    def __init__(self):
        self.x = 0
        self.y = 20
        self.canvas = pygame.Surface((300, 300))
        self.canvas.set_alpha(128)
        self.canvas.fill(white)
        self.iconed = pygame.image.load("house_icon.png").convert_alpha()
        self.iconed = pygame.transform.scale(self.iconed, (60, 60))

    def display(self):
        global toolscanvas
        toolscanvas.fill((0, 0, 0))
        self.canvas.blit(self.iconed, (0, 0))
        toolscanvas.blit(self.canvas, (self.x, self.y))
        gameDisplay.blit(toolscanvas, (0, 0))

guihouse = GuiHouse()
while True:
    guihouse.display()
    pygame.display.update()
    clock.tick(120)
person Paweł Drapiewski    schedule 09.10.2018
comment
нет, я проверил код, и он действительно отображается на экране, я просто забыл включить его здесь. Спасибо за предложение. - person Anonymous; 10.10.2018
comment
@Anonymous self.canvas черный, и значок дома тоже черный, так что вы просто получите черную прозрачную поверхность, если перенесете дом на холст. В этом решении холст залит белым, чтобы решить эту проблему. Если это не то, что вы хотите, вы должны добавить дополнительную информацию к своему вопросу. Кстати, я не уверен, зачем вам нужны toolscanvas и self.canvas, а не просто перетаскивать self.iconed поверхность на gameDisplay. - person skrx; 10.10.2018
comment
Я собирался перенести изображение на другой холст, чтобы я мог вывести его из меню, меню было другим холстом, всякий раз, когда оно достигало предельных координат, но это все еще не реализовано. - person Anonymous; 10.10.2018
comment
Я изменил значок на белый цвет, и, похоже, он сработал, спасибо за предложение - person Anonymous; 10.10.2018