繁体   English   中英

pygame按键移动矩形

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM