2014-10-23 3 views
0

Я хочу создать программу, в которой я перемещаю прямоугольник с помощью клавиатуры, но он не перемещается, как будто он не понимает команды события. Я не могу найти, что случилось. Я думаю, что проблема заключается в последовательности команд, но, как новичок, я не могу ее найти. Может кто-нибудь мне помочь? Благодаря!python 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() 

ответ

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) 

Запуск кода с указанными выше изменениями, коробка в настоящее время движется.

+0

Я сделал это, но он снова не двигался – pacos

+0

Это вообще не движется, или он двигается один раз после этого, а не больше? Он будет двигаться только после каждого нажатия клавиши. – Narpar1217

+0

он вообще не движется – pacos

Смежные вопросы