在 pygame 中图像未显示在表面上
Images not showing on surface in pygame
我正在尝试制作具有两个表面的游戏。但是,当我尝试将图像添加到游戏层时,它并没有显示出来。我试过使用 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 COMPUTER SCIENCE\Course work\Coding\CSCW Pre Alfa 1.9.5.py
Traceback (most recent call last):
File "C:\Users\Alex\OneDrive\A- Levels COMPUTER SCIENCE\Course work\Coding\CSCW Pre Alfa 1.9.5.py", line 133, in <module>
Dragon()
File "C:\Users\Alex\OneDrive\A- Levels 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
如果有人能向我解释为什么这不起作用,我将不胜感激。如果有人知道在不使用全局变量的情况下以我目前的方式(在定义内)显示我的图像,我将不胜感激。
Game_Layer是surface,surfaces没有update方法。更新是 pygame.display 的函数。 pygame.display.update
类似于 pygame.display.flip
,只是您可以指定应翻转屏幕的哪些部分。
此外,如果您有任何其他选择,请不要使用 global
。最好将所有内容都包装到 class 中,将 Game_Layer
作为参数传递,或使用 pygame.display.get_surface()
Pygame 程序的结构通常类似于以下示例。首先,初始化所有内容并加载图像和其他资源(仅在主循环之前执行一次),然后在主 while
循环中处理事件、更新游戏和 blit 所有内容。最后,调用 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()
如果你想 blit 到背景表面而不是 screen/display 并且它是单色的,你可以只用 fill
方法在每一帧填充背景表面,然后 blit 龙最后将背景 blit 到屏幕上:
game_layer.fill(WHITE)
game_layer.blit(DRAGON_IMG, (x, y))
screen.blit(game_layer, (10, 0))
或者,如果您的背景表面是实际图像,您可以每帧创建一个副本,然后 blit 复制到该副本上:
game_layer_copy = GAME_LAYER.copy()
game_layer_copy.blit(DRAGON_IMG, (x, y))
screen.blit(game_layer_copy, (10, 0))
我正在尝试制作具有两个表面的游戏。但是,当我尝试将图像添加到游戏层时,它并没有显示出来。我试过使用 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 COMPUTER SCIENCE\Course work\Coding\CSCW Pre Alfa 1.9.5.py
Traceback (most recent call last):
File "C:\Users\Alex\OneDrive\A- Levels COMPUTER SCIENCE\Course work\Coding\CSCW Pre Alfa 1.9.5.py", line 133, in <module>
Dragon()
File "C:\Users\Alex\OneDrive\A- Levels 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
如果有人能向我解释为什么这不起作用,我将不胜感激。如果有人知道在不使用全局变量的情况下以我目前的方式(在定义内)显示我的图像,我将不胜感激。
Game_Layer是surface,surfaces没有update方法。更新是 pygame.display 的函数。 pygame.display.update
类似于 pygame.display.flip
,只是您可以指定应翻转屏幕的哪些部分。
此外,如果您有任何其他选择,请不要使用 global
。最好将所有内容都包装到 class 中,将 Game_Layer
作为参数传递,或使用 pygame.display.get_surface()
Pygame 程序的结构通常类似于以下示例。首先,初始化所有内容并加载图像和其他资源(仅在主循环之前执行一次),然后在主 while
循环中处理事件、更新游戏和 blit 所有内容。最后,调用 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()
如果你想 blit 到背景表面而不是 screen/display 并且它是单色的,你可以只用 fill
方法在每一帧填充背景表面,然后 blit 龙最后将背景 blit 到屏幕上:
game_layer.fill(WHITE)
game_layer.blit(DRAGON_IMG, (x, y))
screen.blit(game_layer, (10, 0))
或者,如果您的背景表面是实际图像,您可以每帧创建一个副本,然后 blit 复制到该副本上:
game_layer_copy = GAME_LAYER.copy()
game_layer_copy.blit(DRAGON_IMG, (x, y))
screen.blit(game_layer_copy, (10, 0))