pygame key.set_repeat 不起作用 [英] pygame key.set_repeat not working

查看:141
本文介绍了pygame key.set_repeat 不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是 pygame 的新手,我正在尝试制作 pong 以学习它.我正在尝试进行平滑控制,以便按住箭​​头会起作用,但它现在不起作用.

I am new to pygame and I am trying to make pong in order to learn it. I am trying to make smooth controls so that holding down an arrow will work, but it is not working right now.

import sys, pygame
pygame.init()
size = (500, 350)
screen = pygame.display.set_mode(size)
x = 1
xwid = 75
yhei = 5
pygame.key.set_repeat(0, 500)
while True:
    vector = 0
    for event in pygame.event.get():
        if event.type == pygame.QUIT: sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                vector = 4
            elif event.key == pygame.K_LEFT:
                vector = -4
    pygame.draw.rect(screen,(255,255,255),(x,size[1] - yhei,xwid,yhei),0)
    pygame.display.update()
    screen.fill((0,0,0))
    x += vector
    if x <= 0:
        x = 0
    elif x >= size[0] - xwid:
        x = size[0] - xwid

为什么按住向左或向右箭头不起作用?

why does this not work for holding down the left or right arrows?

推荐答案

pygame.key.set_repeat(0, 500)

如果您将 delay 参数设置为 0,将禁用重复键.文档对此不太清楚:

If you set the delay parameter to 0, key repeat will be disabled. The documentation isn't quite clear about that:

pygame.key.set_repeat()
控制重复按键的方式
set_repeat() ->无
set_repeat(delay, interval) ->无

当启用键盘重复时,按住的键会产生多个 pygame.KEYDOWN 事件.延迟是数量将发送第一个重复的 pygame.KEYDOWN 之前的毫秒数.之后,每个间隔都会发送另一个 pygame.KEYDOWN毫秒.如果没有传递参数,则禁用重复键.

When the keyboard repeat is enabled, keys that are held down will generate multiple pygame.KEYDOWN events. The delay is the number of milliseconds before the first repeated pygame.KEYDOWN will be sent. After that another pygame.KEYDOWN will be sent every interval milliseconds. If no arguments are passed the key repeat is disabled.

当 pygame 被初始化时,重复键被禁用.

When pygame is initialized the key repeat is disabled.

强调我的.

您可以将 delay 设置为 1,它会按预期工作:

You could set the delay to 1, and it would work as expected:

pygame.key.set_repeat(1, 10) # use 10 as interval to speed things up.

<小时>

但请注意,您不应使用 set_repeatpygame.KEYDOWN 事件来实现移动.如果这样做,您将无法观察到真正的单键击打,因为如果玩家按下一个键,就会创建一大堆 pygame.KEYDOWN 事件.


But note that you should not use set_repeat and the pygame.KEYDOWN event to implement movement. If you do, you won't be able to observe real single key strokes, since if the player presses a key, a whole bunch of pygame.KEYDOWN events would be created.

最好使用 pygame.key.get_pressed().看看他的最小例子:

Better use pygame.key.get_pressed(). Have a look at his minimal example:

import pygame
pygame.init()
screen = pygame.display.set_mode((680, 460))
clock = pygame.time.Clock()

# use a rect since it will greatly 
# simplify movement and drawing
paddle = pygame.Rect((0, 0, 20, 80))

while True:

    if pygame.event.get(pygame.QUIT): break
    pygame.event.pump()

    # move up/down by checking for pressed keys
    # and moving the paddle rect in-place
    keys = pygame.key.get_pressed()
    if keys[pygame.K_UP]: paddle.move_ip(0, -7)
    if keys[pygame.K_DOWN]: paddle.move_ip(0, 7)

    # ensure the paddle rect does not go out of screen
    paddle.clamp_ip(screen.get_rect())

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

    clock.tick(60)

这篇关于pygame key.set_repeat 不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆