我正在尝试制作乒乓球比赛,首先我要做的是球的运动。 所以它朝着一个方向发展,但转弯有点不稳定。当你向右然后向上然后向右释放时它会向上或向右停止。尝试围成一圈,你会看到。 我怎么能解决这个问题,还有其他任何特别糟糕的事情吗?
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()
答案 0 :(得分:2)
您应该在循环中处理所有事件。现在它依赖于某些事件退出循环底部的事实。每当您获得KEYDOWN
或QUIT
以外的任何其他活动时,您都会停止活动。这种停止导致了这种混乱(特别是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限制为一定数量的帧。由于您要逐帧而不是时间更改位置,这可能会成为一个重要因素。我可能会切换到位置变化的速度和时间,而不是每帧的静态数字。