Изображения не отображаются на поверхности в пигме - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь сделать игру с двумя поверхностями.Однако, когда я пытаюсь добавить изображение в игровой слой, оно не появляется.Я попытался использовать pygame.display.flip(), который, насколько я понимаю, должен обновить все на экране.

Если я попытаюсь использовать Game_Layer.update() или Game_Layer.flip(), как показано в коде ниже ... (Я думаю, Game_Layer.flip() не работает, потому что .flip используется для обновления всего экрана ипоэтому не может быть вызван для определенных слоев, но исправьте меня, если я ошибаюсь).

#game play
def Dragon():
    DragonIMG=pygame.image.load("Green Dragon.gif")
    DragonIMG.convert()    
    global Game_Layer
    x=0
    y=0
    Game_Layer.blit(DragonIMG,(x,y))
    Game_Layer.update()
Dragon()

Я получаю следующее сообщение об ошибке:

 RESTART: C:\Users\Alex\OneDrive\A- Levels\1 COMPUTER SCIENCE\Course work\Coding\CSCW Pre Alfa 1.9.5.py 
Traceback (most recent call last):
  File "C:\Users\Alex\OneDrive\A- Levels\1 COMPUTER SCIENCE\Course work\Coding\CSCW Pre Alfa 1.9.5.py", line 133, in <module>
    Dragon()
  File "C:\Users\Alex\OneDrive\A- Levels\1 COMPUTER SCIENCE\Course work\Coding\CSCW Pre Alfa 1.9.5.py", line 131, in Dragon
    Game_Layer.update()
AttributeError: 'pygame.Surface' object has no attribute 'update'
>>> 

Однако, когда я пытаюсь отобразитьизображение на корневом слое, используя код ниже, он работает.

#game play
def Dragon():
    DragonIMG=pygame.image.load("Green Dragon.gif")
    DragonIMG.convert()    
    global Base_Layer
    x=0
    y=0
    Base_Layer.blit(DragonIMG,(x,y))
    pygame.display.flip()
Dragon()

Ниже приведен код, который я использую для настройки слоев:

#libraries
import time, random, pygame, sqlite3, GIFimage2
pygame.init()



#screen setup
#variables 
clock=pygame.time.Clock()               #for use in .tick
black=pygame.color.Color("black")       #set black
white=pygame.color.Color("white")       #set white
#set up the base layer 
Base_Layer=pygame.display.set_mode((1000,600))          #desplay setup
pygame.display.set_caption("Dragon King: Legacy")       #set caption
black=(0,0,0)                                           #colour set
Base_Layer.fill(black)                                  #colour set
Base_Layer.convert()                                    #converts the base layer, may have no effect in current position
icon=pygame.image.load("LOGO.png")                      #find logo
pygame.display.set_icon(icon)                           #set icon to logo
#set up the game layer        
Game_Layer=pygame.Surface((600,600))    #set layer peramaters
Game_Layer.fill(white)                  #set layer to white
Game_Layer.convert()                    #converts the game layer, may have no effect in current position
Base_Layer.blit(Game_Layer, (10, 0))    #blit layer on to screen
pygame.display.flip()                   #get the layer to show

Если кто-нибудь может объяснить мне, почему это не работает, я был бы признателен.Я также был бы признателен, если бы кто-нибудь знал способ отображения моих изображений так, как я сейчас (в пределах определения), без использования глобальных переменных.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Программы Pygame обычно структурированы аналогично следующему примеру.Прежде всего, инициализируйте все и загрузите изображения и другие ресурсы (сделайте это только один раз перед основным циклом), затем, в основном цикле while, обработайте события, обновите игру и уничтожьте все.Наконец, вызовите pygame.display.flip() или pygame.display.update(), чтобы сделать все изменения видимыми, и clock.tick(fps), чтобы ограничить частоту кадров.

import pygame


pygame.init()
screen = pygame.display.set_mode((1000, 600))
# Constants (use uppercase letters to signal that these shouldn't be modified).
BLACK = pygame.color.Color("black")
WHITE = pygame.color.Color("white")

GAME_LAYER = pygame.Surface((600, 600))
GAME_LAYER.fill(WHITE)
# convert() returns a new surface, so you have to assign it to a variable.
DRAGON_IMG = pygame.image.load("Green Dragon.gif").convert()


def main(screen):
    clock = pygame.time.Clock()
    # Variables
    x = 0
    y = 0

    while True:
        # Handle events.
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                return

        # Game logic.
        x += 1

        # Clear the screen and blit everything.
        screen.fill(BLACK)
        screen.blit(GAME_LAYER, (10, 0))
        screen.blit(DRAGON_IMG, (x, y))

        pygame.display.flip()
        clock.tick(60)


if __name__ == '__main__':
    main(screen)
    pygame.quit()

Если вы хотите использовать блики на поверхности фона вместо экрана / дисплея иэто одноцветный, вы можете просто заполнить фоновую поверхность каждого кадра методом fill, затем перетащить дракона и, наконец, фон на экране:

game_layer.fill(WHITE)
game_layer.blit(DRAGON_IMG, (x, y))
screen.blit(game_layer, (10, 0))

Или, если ваша фоновая поверхность является фактическим изображениемВы можете создать копию каждого кадра и затем скопировать в эту копию:

game_layer_copy = GAME_LAYER.copy()
game_layer_copy.blit(DRAGON_IMG, (x, y))
screen.blit(game_layer_copy, (10, 0))
0 голосов
/ 05 октября 2018

Game_Layer - это поверхность, и у поверхностей нет метода обновления.обновление является функцией pygame.display.pygame.display.update похоже на pygame.display.flip, за исключением того, что вы можете указать, какие части экрана следует перевернуть.

Также, пожалуйста, не используйте global, если у вас есть другой выбор.Считается, что лучше обернуть все в класс, передать Game_Layer в качестве аргумента или использовать pygame.display.get_surface()

...