【问题标题】:Making a turn is choppy in pygame在pygame中转弯是不稳定的
【发布时间】:2015-09-24 16:24:03
【问题描述】:

我正在尝试做一个乒乓球比赛,首先我想做一个动作……球。 所以它朝着一个方向前进,但转弯有点波涛汹涌。当你向右走然后举起然后向右释放时,它会停止向上或向右。试着绕一个圈,你会看到。 我该如何解决这个问题,还有其他关于这段代码特别糟糕的事情吗?

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()

【问题讨论】:

标签: python pygame


【解决方案1】:

您应该在循环中处理所有事件。现在它依赖于一些事件退出循环底部的事实。任何时候你得到除KEYDOWNQUIT 之外的任何事件,你都在停止你的运动。这种停止导致了这种抖动(尤其是KEYUP 事件)。

如果您考虑事件顺序……您将在K_UP 处于向下位置时向上,然后您“转身”。如果您在按下K_LEFT 之前释放K_UP,它可能会好起来(一段时间)。但是如果你在释放K_UP之前按下K_LEFT你会得到KEWDOWNK_LEFT然后KEYUPK_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 限制在一定数量的帧内。由于您是按帧而不是按时间更改位置,因此这可能成为一个重要因素。我可能会切换到位置变化的速度和时间,而不是每帧的静态数字。

【讨论】:

    猜你喜欢
    • 2020-07-07
    • 2020-11-09
    • 1970-01-01
    • 2014-03-31
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多