我正在为平台游戏做教程,但我的Pygame窗口显示一个黑屏。
我不知道怎么解决这个问题。
我尝试再次关闭和打开Visual Studio Code,但没有任何结果。
import pygame
SCREEN_SIZE = (700,500)
DARK_GREY = (50,50,50)
OGURKOWY = (21,179, 58)
pygame.init()
screen = pygame.display.set_mode(SCREEN_SIZE)
pygame.display.set_caption("Platformówka")
player_image = pygame.image.load("ogurek\doggo.png")
player_x = 300
platforms = [
pygame.Rect(100,300,400,50),
pygame.Rect(100,250 ,50,50),
pygame.Rect(450,250,50,50),
pygame.Rect(450,250,100,50)
]
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
if keys[pygame.K_a]:
player_x -= 2
if keys[pygame.K_a]:
player_x += 2
#tło
screen.fill(DARK_GREY)
#platformy
for p in platforms:
pygame.draw.rect(screen, (OGURKOWY), p)
#gracz
screen.blit(player_image, (player_x,100))
#
pygame.display.flip()
pygame.quit()
如何修复这个明显的缩进问题由Ari Cooper Davis评论,并由Rabbid76回答。
我的答案旨在通过设计来避免这样的问题(保持循环短,并将嵌套结构隔离到方法中)。
避免此类缩进打字错误并提高代码可读性的建议:
:
)短for
/if
/函数等。这个方法遵循单一责任原则(SRP),并像注释一样构造代码。此外,它使代码更具表现力,因为方法调用将向读者记录与注释相同的文档。
def handle_exit_events():
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
def handle_key_events():
keys = pygame.key.get_pressed()
if keys[pygame.K_a]:
player_x -= 2
if keys[pygame.K_a]:
player_x += 2
def draw_background():
# tło
screen.fill(DARK_GREY)
def draw_platforms():
# platformy
for p in platforms:
pygame.draw.rect(screen, (OGURKOWY), p)
def draw_player():
# gracz
screen.blit(player_image, (player_x,100))
def update_display():
pygame.display.flip()
请注意每个方法定义之间的2个空行。
现在我们已经声明了这些方法(之前),我们可以使用它们来缩短循环:
# methods declared (from above)
# inits (screen/game-objects/color definitions) omitted to focus on game-loop
running = True
while running:
handle_exit_events()
handle_key_events()
draw_background() # currently static, could move above loop
draw_platforms() # currently static, could move above loop
draw_player() # player move triggered by key-press only
update_display()
pygame.quit()
查看游戏循环中的原始注释(#platformy
,#tv
和#gracz
)是如何转换为方法调用的。因此,您的代码文档本身(使这些注释过时)。
现在我们可以思考和识别循环中的依赖关系。游戏循环用于交互部分,如对事件作出反应或更新屏幕。
所以handle_x_events
方法非常适合循环。但是一些静态的场景,比如背景和平台,在你的游戏中是固定的。它们可以在进入游戏循环之前绘制一次。因为它们不会随着任何事件(如退出或按键)而改变。
# methods declared (from above)
# inits (screen/game-objects/color definitions) omitted to focus on game-loop
draw_background()
draw_platforms()
running = True
while running:
下一步更值得怀疑,这取决于您的设计方法。
draw\u player()
在循环之前需要一次,因为当游戏开始时,玩家将进入世界。然后,播放机使用按键更改其位置(请参见handle\u key\u events()
),这将触发播放机图像重新定位(仅水平,player\u x
)并在屏幕上绘制。
您可以在代码中表达这种依赖关系:
player_y = 100 # initial vertical position (fixed at the moment)
player_x = 300
player_x_speed = 2 # pixels delta per horizontal movement
def move_player_forward():
player_x += player_x_speed
screen.blit(player_image, (player_x, player_y))
def move_player_backward():
player_x -= player_x_speed
screen.blit(player_image, (player_x, player_y))
def handle_key_events():
keys = pygame.key.get_pressed()
if keys[pygame.K_a]:
move_player_backward()
if keys[pygame.K_a]:
move_player_forward()
# remaining code
while running:
handle_exit_events()
handle_key_events()
update_display()
pygame.quit()
查看如何在代码中表达水平移动。player_x
修改被内化为移动方法。
通常,您会使用Player
类和对象,或者至少使用Player坐标,例如定义为tuple,这有一些好处:
player_position = (300, 100) # pixel coordinates of players initial position`
player_x_speed = 2 # pixels delta per horizontal movement
player_jump_height = 10 # pixels to jump vertically, e.g. on a platform
# walk forward
player_position[0] += player_x_speed
# jump forward
player_position = (player_position[0] + player_x_speed, player_position[1] + player_jump_height)
# directly drawn
screen.blit(player_image, player_position)
这是一个缩进的问题。绘制平台的for
-循环(for p in platforms:
)必须*在应用程序循环中,而不是在应用程序循环之后:
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
if keys[pygame.K_a]:
player_x -= 2
if keys[pygame.K_a]:
player_x += 2
#tło
screen.fill(DARK_GREY)
#platformy
# INDENTATION
#-->|
for p in platforms:
pygame.draw.rect(screen, (OGURKOWY), p)
#gracz
screen.blit(player_image, (player_x,100))
#
pygame.display.flip()
这是我的代码,请记住,我在几天前学习了python,所以我的代码可能制作不正确,等等。我正在尝试制作一个窗口,该窗口将显示一些文本(测试版),并将显示两个小矩形,我想成为按钮。
我是python新手,我想用pygame在屏幕上可视化一个算法。这是我的代码: 但这总是显示一个黑色或有点深灰色的屏幕。有人知道我做错了什么吗?我尝试了多个教程,它们都给了我相同的屏幕。 我正在使用MacOS 10.14
有人知道这个黑色矩形是什么吗?这是我的主要任务。py: 这是我的马里奥。py: 最后,我的levels.py: 我使用的是Windows10计算机,python版本为3.8。3和pygame版本1.9。6.
我一直在尝试使用pygame来显示游戏场景,但它似乎已经停止了对我的工作:在pygame关闭之前,它只在我创建的任何屏幕上显示一个灰色框,然后屏幕上应该显示的内容在退出之前短暂闪烁。例如,下面的最小代码显示灰色屏幕5秒钟,然后快速闪烁黑色并退出: 这似乎是屏幕显示的问题,而不是pygame本身的问题,因为我可以使用pg.image制作曲面并将其保存到图像文件中。save(),它们在那里看起来很好。
当我运行我的pyplay程序的游戏窗口显示没有反应,我也写了退出功能,但我不知道为什么它再次广告再次显示没有反应,我的笔记本电脑是Windows 8和32位
我试图让这个游戏工作,但它只是显示一个黑屏。这是一个简单的游戏,你只要避免掉块。我看过相关的问题,但没有一个答案对我有用。它说我必须添加更多细节,所以希望这一行足够了,因为idk在这一行还需要写些什么来为我的文章添加细节。我的代码: