首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让pygame中的对象通过按住按钮来移动?

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

Stack Overflow用户
提问于 2017-03-09 05:33:26
回答 3查看 954关注 0票数 2

我试着使用这样的东西,但它不起作用。

代码语言:javascript
复制
while running:
keys = pygame.key.get_pressed()  #checking pressed keys
if keys[pygame.K_UP]:
    y1 -= 1
if keys[pygame.K_DOWN]:
    y1 += 1

这是我目前拥有的代码。我尝试使用不同的方法,因为上面的方法对我不起作用。它会一次移动一个按键。

代码语言:javascript
复制
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)

编辑:

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

代码语言:javascript
复制
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)
EN

回答 3

Stack Overflow用户

发布于 2017-03-10 00:44:39

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

事件队列

当按键被按下或重现时,它们被放入事件队列中,因此您不能直接判断按键是否被按住。有两种方法可以解决这个问题:

在进入主循环之前,

  1. 调用pygame.key.set_repeat(True)。这将重复地将KEYDOWN事件放入事件队列中,只要它的held.
  2. Introduce是一个速度变量。当用户按下键时,将速度设置为某个速度,当用户提起键时,将速度设置为0。

例如:

代码语言:javascript
复制
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事件,因此用户可以退出。

代码语言:javascript
复制
pygame.event.pump()
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
    position_x -= 5
elif keys[pygame.K_RIGHT]:
    position_x += 5
票数 3
EN

Stack Overflow用户

发布于 2017-03-09 06:13:32

这个问题的一种解决方案是使用set_repeat函数

代码语言:javascript
复制
pygame.key.set_repeat(True)

这将生成多个KEYDOWN事件。

票数 0
EN

Stack Overflow用户

发布于 2017-03-09 06:51:48

尝试将密钥添加到pygame for循环中。所以它应该看起来像这样...

代码语言:javascript
复制
while running:
for event in pygame.event.get():
    keys = pygame.key.get_pressed()  #checking pressed keys
        if keys[pygame.K_UP]:
        y1 -= 1

        if keys[pygame.K_DOWN]:
        y1 += 1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42682309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档