python pygame无法识别键盘事件

时间:2014-10-23 21:10:41

标签: python events pygame

我想创建一个程序,我通过键盘移动一个矩形,但它不会像它不理解事件命令一样移动。我找不到什么错误。我认为问题是命令序列,但作为初学者,我无法找到它。谁能帮我?谢谢!

import pygame
import sys
from pygame.locals import *

fps = 30
fpsclock = pygame.time.Clock()
w = 640
h = 420
blue = (0, 0, 255)
white = (255, 255, 255)
x = w / 3
y = 350
boxa = 20
movex = 0


def drawwindow():
    global screen
    pygame.init()
    screen = pygame.display.set_mode((w, h))
    screen.fill(blue)


def drawbox(box):
    if box.right > (w - boxa):
        box.right = (w - boxa)
    if box.left < 0:
        box.left = 0
    pygame.draw.rect(screen, white, box)


def main():
    global x
    global movex
    drawwindow()
    box1 = pygame.Rect(x, y, boxa, boxa)
    drawbox(box1)

    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN:
                if event.key == K_RIGHT:
                    movex = +4
                if event.key == K_LEFT:
                    movex = -4
            if event.type == KEYUP:
                if event.key == K_RIGHT:
                    movex = 0
                if event.key == K_LEFT:
                    movex = 0
        x += movex
        pygame.display.update()
        fpsclock.tick(fps)

if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:2)

正确接受键盘事件。这可以通过在print块之一中放置if event.key == ...语句来验证。

其中一个问题是,在最初绘制框之后,您永远不会重新绘制框。游戏循环的每次迭代都应该重新绘制背景(理想情况下只有更改的区域,但是以后的区域)以及新位置的框。像这样:

while True:
    # [event handling code omitted for brevity]

    x += movex
    drawwindow()
    drawbox(box1)
    pygame.display.update()
    fpsclock.tick(fps)

但是还有另一个问题。更改xmovex对任何内容都没有影响,因为一旦输入主循环,它们就不会在任何地方使用。如果x += movex属性已更改,则框将移动,而不是x,如下面的代码所示:

while True:
    # [event handling code omitted for brevity]

    box1.x += movex # this line changed
    drawwindow()    # this line added
    drawbox(box1)   # this line added
    pygame.display.update()
    fpsclock.tick(fps)

使用上面的更改运行代码,框现在移动。