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

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

为什么这不适用于按住向左或向右箭头?

最佳答案

pygame.key.set_repeat(0, 500)

如果将 delay 参数设置为 0 ,将禁用重复键。 documentation 对此不太清楚:



强调我的。

您可以将 delay 设置为 1 ,它会按预期工作:
pygame.key.set_repeat(1, 10) # use 10 as interval to speed things up.

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

最好使用 pygame.key.get_pressed() 。看看他的最小例子:
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)

关于python - pygame key.set_repeat 不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18995652/

10-15 11:48