在pygame中转弯是不稳定的

时间:2015-09-24 16:24:03

标签: python pygame

我正在尝试制作乒乓球比赛,首先我要做的是球的运动。 所以它朝着一个方向发展,但转弯有点不稳定。当你向右然后向上然后向右释放时它会向上或向右停止。尝试围成一圈,你会看到。 我怎么能解决这个问题,还有其他任何特别糟糕的事情吗?

import pygame
import sys
from pygame.locals import *

white = (255, 255, 255)
black = (0, 0, 0)
block_size = (32, 185)
pong_size = 20, 20
pong_pos_x = 390
pong_pos_y = 280

pygame.init()

clock = pygame.time.Clock()
pygame.display.set_caption("aa")        
display = pygame.display.set_mode((800, 600))


while True:

    for event in pygame.event.get():
            if event.type == QUIT:
                    pygame.quit()
                    sys.exit()

    display.fill(black)
    rekt = pygame.draw.rect(display, white, ((pong_pos_x, pong_pos_y), pong_size))
    pygame.display.update()
    h_move = 'none'
    if event.type == pygame.KEYDOWN:
            if event.key == K_RIGHT:
                    h_move = 'right'
            elif event.key == K_LEFT:
                    h_move= 'left'
            elif event.key == K_UP:
                    h_move = 'up'
            elif event.key == K_DOWN:
                    h_move = 'down'

    if h_move == 'right':
            pong_pos_x += 2
    elif h_move == 'left':
            pong_pos_x -= 2
    elif h_move == 'up':
            pong_pos_y -= 2
    elif h_move == 'down':
            pong_pos_y += 2


pygame.display.update()

1 个答案:

答案 0 :(得分:2)

您应该在循环中处理所有事件。现在它依赖于某些事件退出循环底部的事实。每当您获得KEYDOWNQUIT以外的任何其他活动时,您都会停止活动。这种停止导致了这种混乱(特别是KEYUP事件)。

如果您考虑事件序列......您在K_UP处于向下位置,那么您将转向"。如果您在按K_UP之前释放K_LEFT,它可能会好的(暂时)。但是,如果您在发布K_LEFT之前按K_UP,则会获得KEWDOWN K_LEFT,然后KEYUP K_UP,您的动作就会停止。

也许尝试这样的事情:

...
h_move = None

while True:
    # Event Loop
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key in (K_RIGHT, K_LEFT, K_UP, K_DOWN):
                h_move = event.key
        if event.type == pygame.KEYUP:
            if h_move == event.key:
                h_move = None

    # Update State
    if h_move == K_RIGHT:
        pong_pos_x += 2
    elif h_move == K_LEFT:
        pong_pos_x -= 2
    elif h_move == K_UP:
        pong_pos_y -= 2
    elif h_move == K_DOWN:
        pong_pos_y += 2

    # Draw
    display.fill(black)
    rekt = pygame.draw.rect(display, white, ((pong_pos_x, pong_pos_y), pong_size))
    pygame.display.update()

您应该做的另一件事是将fps限制为一定数量的帧。由于您要逐帧而不是时间更改位置,这可能会成为一个重要因素。我可能会切换到位置变化的速度和时间,而不是每帧的静态数字。