首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pygame.key.get_pressed() -不工作- pygame.error:未初始化的视频系统

问pygame.key.get_pressed() -不工作- pygame.error:未初始化的视频系统
EN

Stack Overflow用户
提问于 2014-03-01 19:29:47
回答 1查看 2.5K关注 0票数 1

我的程序有两个问题:

  1. 当我关闭我的程序时,它有错误:keys = pygame.key.get_pressed() pygame.error: video system not initialized
  2. 当我按'd‘时,当我按某物(或移动鼠标)时,正方形移动

守则的重要部分是:

代码语言:javascript
复制
import pygame
from pygame.locals import*

pygame.init()

screen = pygame.display.set_mode((1200, 700))
ticket1 = True

# ...

c = 550
d = 100

# ...

color2 = (250, 20, 20)

while ticket1 == True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            ticket1 = False
            pygame.quit()
            pygame.display.quit()

        keys = pygame.key.get_pressed()

        if keys[pygame.K_d]:
            c += 1

    # ...

    screen.fill((255, 250, 245))

    pygame.draw.rect(screen, color2, pygame.Rect(c, d, 50, 75))

    pygame.display.flip()

如果我只在write循环中编写keys = pygame.key.get_pressed(),那么它没有错误,但它看起来更慢。

我还有另一个错误:pygame.error: display Surface quit,但我总是和我所有的游戏程序都有它,它不那么重要,但其他的东西是重要的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-01 21:14:31

1.?

在pygame.quit()之后,你不需要pygame.display.quit(),而需要sys.exit()。pygame.quit()不退出程序,所以程序仍然试图调用screen.fill()和pygame.quit()下面的其他函数

或者你必须把pygame.quit()放在while ticket == True:之外(然后你就不需要sys.exit()了)

你可以用while ticket1:来代替while ticket == True: --它更像丙酮。

代码语言:javascript
复制
while ticket1: # it is more pythonic
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            ticket1 = False

        keys = pygame.key.get_pressed()

        if keys[pygame.K_d]:
            c += 1

    # ...

    screen.fill((255, 250, 245))

    pygame.draw.rect(screen, color2, pygame.Rect(c, d, 50, 75))

    pygame.display.flip()

pygame.quit()

2.?

if keys[pygame.K_d]: c += 1在for event循环中,所以它只在事件发生时调用鼠标移动、按键按下或“解压”时调用。将它移到for event循环之外。

代码语言:javascript
复制
while ticket1: # it is more pythonic
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            ticket1 = False

        keys = pygame.key.get_pressed()

    # outside of `for event` loop  
    if keys[pygame.K_d]:
        c += 1

    # ...

    screen.fill((255, 250, 245))

    pygame.draw.rect(screen, color2, pygame.Rect(c, d, 50, 75))

    pygame.display.flip()

pygame.quit()

有些人在没有get_pressed()的情况下做这件事

代码语言:javascript
复制
# clock = pygame.time.Clock()
move_x = 0

while ticket1 == True:

    # events

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            ticket1 = False

        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                ticket1 = False

            elif event.key == pygame.K_d:
                move_x = 1

        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_d:
                move_x = 0

    # variable modification

    c += move_x

    # ...

    # draws

    screen.fill((255, 250, 245))

    pygame.draw.rect(screen, color2, pygame.Rect(c, d, 50, 75))

    pygame.display.flip()

    # 60 FPS (Frame Per Second) to make CPU cooler

    # clock.tick(60)

pygame.quit()

顺便说一句:使用pygame.time.Clock()在快速和慢的计算机上获得相同的FPS。如果没有FPS程序,刷新屏幕的想法是每秒发送次数,因此CPU是繁忙和热的。

如果您使用FPS,您必须添加到c更大的价值,以获得相同的速度,然后再之前。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22119244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档