[英]Pygame pressing key to move a Rect
我试图按住一个键并自动移动方块。 我试图将pygame.key.get.pressed()
更改为pygame.key.get.focused()
,但还是没有。
import pygame
pygame.init()
screen = pygame.display.set_mode((400,300))
pygame.display.set_caption("shield hacking")
JogoAtivo = True
GAME_BEGIN = False
# Speed in pixels per frame
x_speed = 0
y_speed = 0
cordX = 10
cordY = 100
def desenha():
screen.fill((0, 0, 0))
quadrado = pygame.draw.rect(screen, (255, 0, 0), (cordX, cordY ,50, 52))
pygame.display.flip();
while JogoAtivo:
for evento in pygame.event.get():
print(evento)
#verifica se o evento que veio eh para fechar a janela
pressed_keys = pygame.key.get_pressed()
if evento.type == pygame.QUIT:
JogoAtivo = False
pygame.quit();
if pressed_keys[pygame.K_SPACE]:
print('GAME BEGIN')
GAME_BEGIN = True
desenha();
if pressed_keys[pygame.K_LEFT] and GAME_BEGIN:
speedX=-3
cordX+=speedX
desenha()
if pressed_keys[pygame.K_RIGHT] and GAME_BEGIN:
speedX=3
cordX+=speedX
desenha()
更新了代码,但仍然存在相同的问题(包括KEYDOWN事件)。
import pygame
pygame.init()
screen = pygame.display.set_mode((400,300))
pygame.display.set_caption("shield hacking")
JogoAtivo = True
GAME_BEGIN = False
# Speed in pixels per frame
x_speed = 0
y_speed = 0
cordX = 10
cordY = 100
def desenha():
screen.fill((0, 0, 0))
quadrado = pygame.draw.rect(screen, (255, 0, 0), (cordX, cordY ,50, 52))
pygame.display.flip();
while JogoAtivo:
for evento in pygame.event.get():
print(evento)
#verifica se o evento que veio eh para fechar a janela
if evento.type == pygame.QUIT:
JogoAtivo = False
pygame.quit();
if evento.type == pygame.KEYDOWN:
if evento.key == pygame.K_SPACE:
print('GAME BEGIN')
GAME_BEGIN = True
desenha();
if evento.type == pygame.KEYDOWN:
if evento.key == pygame.K_LEFT:
speedX=-3
cordX+=speedX
desenha()
if evento.type == pygame.KEYDOWN:
if evento.key == pygame.K_RIGHT:
speedX=3
cordX+=speedX
desenha()
你不能使用get_pressed()
中for evento
循环,因为当你按住键,然后按键不会产生事件和pygame.event.get()
返回空列表,以便for
什么都不做。
当您开始按下键时,系统会生成单个偶数KEYDOWN
,当您停止按下键时,系统会生成单个偶数KEYUP
但在这两个时刻之间(当您按住键时)系统不会生成KEYDOW
事件。
在for
循环之后for
您必须使用get_pressed()
(和其他代码)。
for evento in pygame.event.get():
print(evento)
if evento.type == pygame.QUIT:
JogoAtivo = False
pygame.quit();
# after for loop
pressed_keys = pygame.key.get_pressed()
if pressed_keys[pygame.K_SPACE]:
print('GAME BEGIN')
GAME_BEGIN = True
desenha();
if pressed_keys[pygame.K_LEFT] and GAME_BEGIN:
speedX=-3
cordX+=speedX
desenha()
if pressed_keys[pygame.K_RIGHT] and GAME_BEGIN:
speedX=3
cordX+=speedX
desenha()
或(或多或少)
for evento in pygame.event.get():
print(evento)
#verifica se o evento que veio eh para fechar a janela
if evento.type == pygame.QUIT:
JogoAtivo = False
pygame.quit();
elif evento.type == pygame.KEYDOWN:
if evento.key == pygame.K_SPACE:
print('GAME BEGIN')
GAME_BEGIN = True
elif evento.key == pygame.K_LEFT:
speedX = -3
elif evento.key == pygame.K_RIGHT:
speedX = 3
elif evento.type == pygame.KEYUP:
if evento.key in (pygame.K_LEFT, pygame.K_RIGHT):
speedX = 0
# after loop
if GAME_BEGIN:
cordX += speedX
desenha()
根据我的理解(如果我错了,请纠正我,我可能不太了解您的要求),但是您似乎想要做的就是按下一个键,按住该键,并使pygame持续进行按住键时的KEYDOWN事件。 在pygame中,此方法不起作用,但是您可以采用其他方法来按住键。 试想一下:如果您开始按住某个键,则会创建KEYDOWN事件。 当您放开该键时,它将生成一个KEYUP事件。 因此, 在您按下按键之后并放开按键之前,必须按住该按键。 以下代码通过示例解释了该概念:
import pygame, sys, time
pygame.init()
screen = pygame.display.set_mode([640, 480])
a_pressed = False
while 1:
time.sleep(.2)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_a:
a_pressed = True
if event.type == pygame.KEYUP:
if event.key == pygame.K_a:
a_pressed = False
if a_pressed == True:
print '"A" is currently being pressed down.'
我还未能够测试代码(使用学校计算机),但是当您按住“ A”键时,应该以每秒大约5次的速度打印以上消息(这是限制fps的一种惰性方法)。 这不仅适用于所有键,而且适用于鼠标拖动。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.