Pygame 键按住?

use*_*551 1 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()
Run Code Online (Sandbox Code Playgroud)

我知道,当我按右/左键时,图像向左和向右移动 10 个像素。但是我该如何做到这一点,当我按住按键时,它会重复该功能,如果我松开按键,它就会停止。我尝试添加一个 while 循环,所做的只是让这些人无限地向右/向左移动,那么是否有一个 pygame 模块可以添加它?

Pat*_*ann 5

您不需要为此使用另一个模块,但这里需要另一种方法和更多的更正。

首先:每帧执行一次位块传输,而不是每次在某处更改某些内容时执行一次。

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()
Run Code Online (Sandbox Code Playgroud)

然后第二:改变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
Run Code Online (Sandbox Code Playgroud)

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

if move_right == True:
    playerx += 10
Run Code Online (Sandbox Code Playgroud)

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

我没有给你一个现成的代码,这只是它是如何完成的解释。如果您确实不知道如何实施,请随时再次询问。