Pygame键按住了吗?

时间:2014-04-28 03:10:46

标签: pygame

下面是代码:

import pygame, sys
from pygame.locals import *

RED   = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE  = (0, 0, 255)
WHITE = (255, 255, 255)
GRASSCOLOR = GREEN
BGCOLOR = WHITE

WINDOWWIDTH = 500
WINDOWHEIGHT = 300

def main():
    pygame.init()

    global DISPLAYSURF

    DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
    pygame.display.set_caption('Platformer')

    player = pygame.image.load('megaman_running_sprites_by_cobalt_blue_knight-d2y1i8s.png')

    playerx = 140
    playery = 10

    DISPLAYSURF.fill(BGCOLOR)
    DISPLAYSURF.blit(player, (10, 140))
    while True: # Event handling loop
        ground()
        mousex, mousey = pygame.mouse.get_pos()

        for event in pygame.event.get():
            if event.type == QUIT:
                terminate()
            elif event.type == KEYDOWN:
                if event.key == K_RIGHT:
                    DISPLAYSURF.fill(BGCOLOR)
                    playery += 10
                    DISPLAYSURF.blit(player, (playery, playerx))

                elif event.key == K_LEFT:
                    DISPLAYSURF.fill(BGCOLOR)
                    playery -= 10
                    DISPLAYSURF.blit(player, (playery, playerx))

                elif event.key == K_SPACE:
                    DISPLAYSURF.fill(BGCOLOR)
                    playerx -= 15
                    DISPLAYSURF.blit(player, (playery, playerx))
                    DISPLAYSURF.fill(BGCOLOR)
                    playerx -= 15
                    DISPLAYSURF.blit(player, (playery, playerx))
                    DISPLAYSURF.fill(BGCOLOR)
                    playerx -= 10
                    DISPLAYSURF.blit(player, (playery, playerx))
                    DISPLAYSURF.fill(BGCOLOR)
                    playerx -= 5
                    DISPLAYSURF.blit(player, (playery, playerx))

            elif event.type == KEYUP:

                if event.key == K_SPACE:
                    pygame.time.wait(100)
                    DISPLAYSURF.fill(BGCOLOR)
                    playerx += 45
                    DISPLAYSURF.blit(player, (playery, playerx))

                elif event.key == K_RIGHT:
                    DISPLAYSURF.fill(BGCOLOR)
                    DISPLAYSURF.blit(player, (playery, playerx))

        pygame.display.update()

def terminate(): # Terminates the program
    pygame.quit()
    sys.exit()

def ground():
    pygame.draw.rect(DISPLAYSURF, GRASSCOLOR, (0, 250, WINDOWWIDTH, 100))

if __name__ == '__main__':
    main()

我是这样的,当我按右/左键时,图像左右10像素。但是当我按住键时,我会如何做到这一点,它重复了这个功能,如果我让键走了,它就会停止。我尝试添加一个while循环,所有这一切都是让这些人无限地向左/右移动,那么有一个pygame模块来添加它吗?

3 个答案:

答案 0 :(得分:3)

你不需要另外一个模块,但这里需要另一种方法和更多的修正。

首先:每帧进行一次blitting运行,而不是每当你在某处改变某些东西时运行一次。

while True: # Event handling loop
    ground()
    mousex, mousey = pygame.mouse.get_pos()

    for event in pygame.event.get():
        if event.type == QUIT:
               terminate()
        elif event.type == KEYDOWN:
            if event.key == K_RIGHT:
                playery += 10
             elif event.key == K_LEFT:
                playery -= 10
             elif event.key == K_SPACE:
                #WTH are you doing here anyway???

        elif event.type == KEYUP:

            if event.key == K_SPACE:
                pygame.time.wait(100) #What is this doing here?

    DISPLAYSURF.fill(BGCOLOR)
    DISPLAYSURF.blit(player, (playerx, playery))
    pygame.display.update()

然后第二个:更改x和y值,这是错误的方式。 x是水平的,y是垂直的。它总是和这样的地方,如果你在这里重新发明轮子,人们就不能再读你的代码了。

现在针对您要求的问题:

您需要定义一个变量,例如“move_left”和“move_right”。

在循环事件检查中,您可以按照以下方式处理它们:

if event.type == KEYDOWN:
    if event.key == K_RIGHT:
        move_right = True

if event.type == KEYUP:
    if event.key == K_RIGHT:
        move_right = False

然后检查循环中的某个位置,move_left或move_right变量是否为true:

if move_right == True:
    playerx += 10

当我们按下键时,我们触发KEYDOWN事件,该事件将变量设置为true。如果变量为真,程序将改变玩家的位置(注意:每帧10个像素可能太多),而此变量为真,并且在我们触发KEYUP事件之前它一直保持为真。换句话说:当按下键时,变量为真且玩家移动。当我们释放键时,变量变为false并且玩家停止移动。

我没有给你一个现成的代码,这只是解释它是如何完成的。如果你真的无法弄清楚如何实施,请随时再问。

答案 1 :(得分:1)

可能会有所帮助

key_input = pygame.key.get_pressed()

if key_input[pygame.K_LEFT]:
    playery += 1
if key_input[pygame.K_RIGHT]:
    playerx -= 1

答案 2 :(得分:0)

您可以使用pygame.key.set_repeat()函数来允许多个事件。