python - 如何通过按住按钮来移动 pygame 中的对象?

标签 python python-2.7 pygame

我尝试使用类似的东西,但它不起作用。

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

这是我目前拥有的代码。我尝试使用不同的方法,因为上述方法对我不起作用。它一次点击一个按钮即可移动它。

import pygame
spaceX = 100
spaceY = 100
pygame.init
black = (0,0,0)
size = (800, 800)
screen = pygame.display.set_mode(size)

def game(spaceX, spaceY):
    spaceship_file = 'spaceship.png'
    spaceship_image = pygame.image.load(spaceship_file)
    spaceship = pygame.transform.scale(spaceship_image, (30, 30))
    screen.fill(black)
    screen.blit(spaceship, (spaceX, spaceY))
    pygame.display.flip()

    while True:
        for event2 in pygame.event.get():
            if event2.type == pygame.KEYDOWN and event2.key == pygame.K_LEFT:
                spaceX2 = spaceX - 5
                game(spaceX2, spaceY)

            elif event2.type == pygame.KEYDOWN and event2.key == pygame.K_RIGHT:
                spaceX2 = spaceX + 5
                game(spaceX2, spaceY)

game(spaceX, spaceY)

编辑:

我现在有这个代码。我的对象仍然仅在我重复点击按钮时移动,而不是在按住按钮时移动。

def game(spaceX, spaceY):

    while True:
        screen.fill(black)
        screen.blit(spaceship, (spaceX, spaceY))
        pygame.display.flip()
        keys = pygame.key.get_pressed()

        for event in pygame.event.get():
            if keys[pygame.K_LEFT]:
                spaceX = spaceX - 5
                game(spaceX, spaceY)

            elif keys[pygame.K_RIGHT]:
                spaceX = spaceX + 5
                game(spaceX, spaceY)

最佳答案

有两种方法可以检查按键输入,无论它们是否在事件队列中,或者检查它们的当前状态。

事件队列

按键在按下或松开时会被放入事件队列中,因此您无法直接判断按键是否被按住。有两种方法可以解决这个问题:

  1. 在进入主循环之前调用pygame.key.set_repeat(True)。这将重复地将 KEYDOWN 事件放入事件队列中,只要它被保留。

  2. 引入速度变量。当用户按下按键时将速度设置为某个速度,当用户抬起按键时将速度设置为 0。

例如:

for event in pygame.event.get():
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_LEFT:
            velocity_x = -5
        elif event.key == pygame.K_RIGHT:
            velocity_x = 5
    elif event.type == pygame.KEYUP:
        if event.key == pygame.K_LEFT:
            velocity_x = 0
        elif event.key == pygame.K_RIGHT:
            velocity_x = 0

position_x += velocity_x

状态检查

您可以通过调用 pygame.key.get_pressed() 来获取按键的当前状态。您必须调用 pygame.event 中的函数之一才能让 pygame 执行一些所需的内部操作,因此如果您不这样做,请使用 pygame.event.pump()不想使用事件队列。如果您不这样做,您的操作系统会认为 pygame 已崩溃,从而导致游戏无响应。不过,您通常需要处理 pygame.QUIT 事件,以便用户可以退出。

pygame.event.pump()
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
    position_x -= 5
elif keys[pygame.K_RIGHT]:
    position_x += 5

关于python - 如何通过按住按钮来移动 pygame 中的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42682309/

相关文章:

python - 将 numpy 数组强制为相同的维度

python - 我如何过滤 itertools chain() 结果?

python - 为什么将 Python 字典转换为元组会返回键元组?

python - pytest导入错误

python - 碰撞检测问题 - PyGame

Python: "except KeyError"比 "if key in dict"快吗?

python - Appengine Python 中的并发请求

python - 任何加速 Python 和 Pygame 的方法?

python - PyGame 模拟坐标错误

android - 如何获取 python-for-android 的安装程序脚本以识别 Windows 系统上已安装的 pbs?