按住键时如何进行精灵移动

Posted

技术标签:

【中文标题】按住键时如何进行精灵移动【英文标题】:How can I make a sprite move when key is held down 【发布时间】:2021-11-30 00:30:59 【问题描述】:

目前,每次按下一个键,精灵只会移动 1 个像素。按住左键或右键时,如何使水管工精灵不断移动?

while running:
    setup_background()
    spriteimg = plumberright

    screen.blit(spriteimg,(x1, y1))

    for event in pygame.event.get():
         if event.type == pygame.QUIT:
             running = False
         elif event.type == pygame.KEYDOWN:
             if event.key == pygame.K_UP:
                 x1 = x1 + 0
                 y1 = y1 - 1
             elif event.key == pygame.K_DOWN:
                 x1 = x1 + 0
                 y1 = y1 + 1
             elif event.key == pygame.K_LEFT:
                 x1 = x1 -1
                 y1 = y1 + 0
             elif event.key == pygame.K_RIGHT:
                 x1 = x1 + 1
                 y1 = y1 + 0

    pygame.display.flip()
    clock.tick(120)

【问题讨论】:

【参考方案1】:

您可以使用pygame.key.get_pressed 来执行此操作。

示例:

while running:
    keys = pygame.key.get_pressed()  #checking pressed keys
    if keys[pygame.K_UP]:
        y1 -= 1
    if keys[pygame.K_DOWN]:
        y1 += 1

【讨论】:

【参考方案2】:

键盘事件(参见pygame.event 模块)仅在按键状态更改时发生一次。每次按下某个键时,KEYDOWN 事件就会发生一次。每次释放键时,KEYUP 发生一次。将键盘事件用于单个操作或逐步移动。

如果要实现连续运动,则必须使用pygame.key.get_pressed()pygame.key.get_pressed() 返回一个包含每个键状态的列表。如果按住某个键,则该键的状态为True,否则为False。使用pygame.key.get_pressed() 评估按钮的当前状态并获得连续移动:

while running:

    for event in pygame.event.get():
         if event.type == pygame.QUIT:
             running = False

    keys = pygame.key.get_pressed()

    x1 += keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]
    y1 += keys[pygame.K_DOWN] - keys[pygame.K_UP]

    x1 = x1 % window.get_width()
    y1 = y1 % window.get_height()

    setup_background()
    spriteimg = plumberright
    screen.blit(spriteimg, (x1, y1))

    pygame.display.flip()
    clock.tick(120)

另见Key and Keyboard event

最小示例: repl.it/@Rabbid76/PyGame-ContinuousMovement

import pygame

pygame.init()
window = pygame.display.set_mode((300, 300))
clock = pygame.time.Clock()

rect = pygame.Rect(0, 0, 20, 20)
rect.center = window.get_rect().center
vel = 5

run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        if event.type == pygame.KEYDOWN:
            print(pygame.key.name(event.key))

    keys = pygame.key.get_pressed()
    
    rect.x += (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * vel
    rect.y += (keys[pygame.K_DOWN] - keys[pygame.K_UP]) * vel
        
    rect.centerx = rect.centerx % window.get_width()
    rect.centery = rect.centery % window.get_height()

    window.fill(0)
    pygame.draw.rect(window, (255, 0, 0), rect)
    pygame.display.flip()

pygame.quit()
exit()

【讨论】:

【参考方案3】:

使用这个伙伴,它会很好用,把它放在你的for循环中。

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_a:
                playerX_change = -0.1
            if event.key == pygame.K_d:
                playerX_change = 0.1
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_a or event.key == pygame.K_d:
                playerX_change = 0

    playerX += playerX_change
    player(playerX, playerY)
    pygame.display.update()

【讨论】:

【参考方案4】:

更简单的方法可以是: KEYDOWN 事件设置一个移动标志。 KEYUP 事件清除标志。 移动过程只需检查每一帧的标志。如果设置则移动,如果未设置则不移动。

【讨论】:

这比使用pygame.key.get_pressed要复杂得多,需要更多的代码 欢迎来到 SO!请尽您所能回答所提出的问题。例如,通过为代码示例提供一些上下文。有关更多提示,请参阅***.com/help/how-to-answer【参考方案5】:

您可以使用 KEYUP 和 KEYDOWN 事件。 您可以在按键按下时连续执行任务,当按键向上时停止该任务

for event in pygame.event.get():
    if event.type == pygame.KEYUP:
        if event.key==K_DOWN:
            print("down key is not pressed")
    elif event.type == pygame.KEYDOWN:
        if event.key==K_DOWN:
            print('down key is not pressed now')
    
    pygame.event.clear() #optional only if your code requires 
    #this will clear all event and the for loop will executed only once

【讨论】:

以上是关于按住键时如何进行精灵移动的主要内容,如果未能解决你的问题,请参考以下文章

玩家精灵在按住移动键时移动而无需输入

在 Monogame 中按下键时,我需要帮助上下移动精灵

按键精灵 怎么让鼠标移动到固定位置

当按下不同的键时如何更改精灵表中的帧。 XNA

Pygame:如何在不按任何键的情况下使精灵面对相同的方向

按键精灵控制鼠标是怎么样调的?固定的几个位置?