2013-04-10 4 views
-1

Я пытаюсь сделать перемещение изображения, пока нажата клавиша. Он движется, но не плавно, он не будет двигаться, когда кнопка нажата.Выполнение перемещения изображения при нажатии клавиши

import pygame, sys 
from pygame.locals import * 

white=(255,255,255) 
black=(0,0,0) 

pygame.init() 
window=pygame.display.set_mode((640, 360),0,32) 
image=pygame.image.load("white.png") 
image.set_colorkey(white) 

x,y=0,0 
movex,movey=0,0 

while True: 
    window.fill(black) 
    for event in pygame.event.get(): 
     if event.type==QUIT: 
      pygame.quit() 
      sys.exit() 
     if event.type==KEYDOWN: 
      if event.key==K_LEFT: 
       movex+=-1 
      elif event.key==K_RIGHT: 
       movex+=1 
      elif event.key==K_UP: 
       movey+=-1 
      elif event.key==K_DOWN: 
       movey+=1 
    x=movex 
    y=movey 

    window.blit(image,(x,y)) 
    pygame.display.update() 
+0

Исправьте ваши отступы –

+0

Это не имеет ничего общего с этим. – user2250873

+1

Возможно, это не так, но это сделает ваш код намного проще для других людей, чтобы читать и копировать/вставлять –

ответ

-4

Думаю, вам нужно включить функцию повтора. Согласно this (your) example,

pygame.key.set_repeat(50, 50) 

должен делать эту работу.

Объяснение quoted:

Что с set_repeat() и это два аргумента? По умолчанию функция повтора ключа отключена, то есть по умолчанию, когда вы нажимаете , и удерживайте клавишу - ничего. Никакие события не будут сгенерированы.

Два аргумента set_repeat - это задержка и интервал. Когда вы нажимаете и удерживаете клавишу, первое событие генерируется после задержки миллисекунд. И последующие события генерируются после интервала миллисекунд.

Если это все еще запутывает, то этот пример может помочь вам. Рассмотрим Я держу ключ вверх. Это то, что будет генерировать событие .

[1st up event] ... [2nd up event] ... [3rd up event] ... и так далее.

Событие [1-го события] - это то, где клавиша нажата и удерживается. И после задержки миллисекунды генерируется событие [2nd up]. А затем оставшиеся события генерируются каждые интервалы миллисекунды до тех пор, пока не будет освобожден ключ .

+0

Спасибо, но не могли бы вы объяснить, как это работает, если не нормально. – user2250873

+0

Почему этот ответ был остановлен? – Saucier

+2

это решение забивает очередь событий. Решение Dominic - это тот, который вы ищете –

8

Вы ищете событие K_DOWN, поэтому ваше изображение будет отображаться только в том случае, если нажата кнопка (или всякий раз, когда OS говорит об этом).

Лучше Идея заключается в том, чтобы проверить, если некоторые клавиши нажаты вниз каждую итерацию основного цикла, используя pygame.key.get_pressed():

... 
for event in pygame.event.get(): 
    if event.type==QUIT: 
     pygame.quit() 
     sys.exit() 

pressed = pygame.key.get_pressed() 
if pressed[K_LEFT]: 
    movex+=-1 
if pressed[K_RIGHT]: 
    movex+=1 
if pressed[K_UP]: 
    movey+=-1 
if pressed[K_DOWN]: 
    movey+=1 

x=movex 
y=movey 
... 
+1

Я думаю, что ответ Убе был лучше, так как он работал – user2250873

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