当前位置: 首页 > 知识库问答 >
问题:

Pygame显示黑色窗口

施旭东
2023-03-14

我正在为平台游戏做教程,但我的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()

共有2个答案

凌宏大
2023-03-14

如何修复这个明显的缩进问题由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) 
裴意
2023-03-14

这是一个缩进的问题。绘制平台的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在这一行还需要写些什么来为我的文章添加细节。我的代码: