我想创建一个程序,我通过键盘移动一个矩形,但它不会像它不理解事件命令一样移动。我找不到什么错误。我认为问题是命令序列,但作为初学者,我无法找到它。谁能帮我?谢谢!
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()
答案 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)
但是还有另一个问题。更改x
或movex
对任何内容都没有影响,因为一旦输入主循环,它们就不会在任何地方使用。如果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)
使用上面的更改运行代码,框现在移动。