【问题标题】:Why does this code not work? (Python and PyGame)为什么这段代码不起作用? (Python和Pygame)
【发布时间】:2013-03-22 23:43:39
【问题描述】:
import math, sys, os, pygame, random, time

pygame.init()
screen = pygame.display.set_mode((500,500))
pygame.display.set_caption('Tester.')
pygame.mouse.set_visible(0)


def smileMove():
    smiley = pygame.image.load('smiley.png')
    random.seed()
    xMove = random.randrange(1,501)
    yMove = random.randrange(1,501)

    screen.blit(smiley,(xMove,yMove))


c = 0

while c <5:
    smileMove()
    time.sleep(3)
    c = c + 1

pygame.quit()

我对编程非常陌生,我只是尝试使用 PyGame 进行一些基本的操作。 屏幕保持黑色,没有出现笑脸。我正在尝试让面孔出现在黑色背景上,并每 3 秒更改到另一个随机位置,5 次然后退出。

【问题讨论】:

  • 你真的应该完成一个教程。几乎所有pygame 程序都应该有一个事件循环。并且您永远不应该在处理事件的过程中调用sleep。 (如果你睡 3 秒,你的程序将不会响应任何外部输入,所以你的计算机可能会放置一个死亡沙滩球,或者你的平台的等价物。)
  • 我会在某个时候,但我只是想尝试一些基本的东西。不过感谢您的提示。有什么方法可以让它在不调用睡眠的情况下暂停?
  • 您想设置一个“计时器处理程序”,或者设置一个“空闲处理程序”来检查每次迭代的时间,直到开始后 3 秒。这在 600 个字符的评论中很难解释,但是教程会给你很多例子。真的,“试着把一些基本的东西写下来”的最好方法是完成教程的第一步,而不是随便写代码。
  • 至少调用pump,这样系统才会知道程序运行正常。

标签: python image time pygame blit


【解决方案1】:

您错过了对 pygame.display.flip() 的调用以实际更新窗口内容 - 将其放在您的 time.sleep 调用之前。

在尝试 Python 和 pygame API 的早期阶段,我的建议是在交互式控制台上尝试一些东西。

【讨论】:

  • 为了更清楚地说明这一点,让您知道为什么实际上需要调用 flip(),pygame 使用所谓的双缓冲。这意味着当前屏幕上的图像和您正在渲染的图像是分开的。这允许您仅将完整的图像绘制到屏幕上,从而消除一些您可能会看到的撕裂和伪影(本质上是在完整图像上绘制的不完整图像)。您的所有 screen.blit() 调用都在绘制隐藏的缓冲图像。当您调用翻转时,您正在“翻转”缓冲图像的绘制图像。
【解决方案2】:

首先,它需要在一个while循环中(至少如果你要做更多的话),你也缺少背景。这应该工作:

import math, sys, os, pygame, random, time

pygame.init()
screen = pygame.display.set_mode((500,500))
pygame.display.set_caption('Tester.')
pygame.mouse.set_visible(0)
white = ( 255, 255, 255)

def smileMove():
    screen.fill(white)
    smiley = pygame.image.load('smiley.png')
    random.seed()
    xMove = random.randrange(1,501)
    yMove = random.randrange(1,501)

    screen.blit(smiley,(xMove,yMove))

c = 0
done = False
while done==False:
    for event in pygame.event.get(): # User did something
        if event.type == pygame.QUIT: # If user clicked close
            done=True # Flag that we are done so we exit this loop

    screen.fill(white)
    while c <5:
        smileMove()
        pygame.display.flip()
        c = c + 1
        time.sleep(3)
pygame.quit()

【讨论】:

    猜你喜欢
    • 2017-10-02
    • 2010-09-18
    相关资源
    最近更新 更多