我正在尝试编写一个Pong游戏,我可以使用向上和向下箭头移动球拍。我创建了一个Paddle对象,每次按下向上键时都会更新给定的数量(在下面的代码中作为参数“num”传递)。我想要做的是让用户按住向上按钮,这将导致拨片沿向上方向连续移动。我试着在while循环中编写这个事件处理,但是我陷入了无限循环。以下是代码:
for event in PE.get():
if event.type == PG.KEYDOWN:
keystate = PG.key.get_pressed()
if event.key == PG.K_ESCAPE:
done = True
while keystate[PL.K_UP]:
rightPaddle.update(-20)
if event.type == PG.QUIT:
done = True
以下是Paddle对象的代码:
class Paddle(object):
def __init__(self, x, y):
self.topleftx = x
self.toplefty = y
self.width = 15
self.height = 100
def draw(self, surface):
rect = PR.Rect(self.topleftx, self.toplefty, \
self.width, self.height)
surface.fill(WHITE, rect)
def update(self, num):
self.toplefty += num
我检查了关于这个主题的其他stackoverflow问题,这是我如何找到PG.key.getPressed()方法,但其他答案建议使用“精灵”,我不知道如何使用。有人可以提供一些关于如何执行此任务的建议吗?
答案 0 :(得分:1)
在此代码中:
while keystate[PL.K_UP]:
rightPaddle.update(-20)
......没有什么可以改变keystate
。所以,如果keystate[PL.K_UP]
是真的一次,那将永远是真的。因此无限循环。
你可以每次通过循环从pygame中获取当前的关键信息,这至少会使它不是无限的 - 但它仍然意味着你的整个程序会阻塞,直到用户释放密钥。
如果不知道你是打算编写一个帧率驱动的游戏还是一个事件循环驱动的游戏,我无法确切地告诉你如何修复它。
但无论哪种方式,关键点在于,只要按住键,你就不想一遍又一遍地移动,你想以一定的速度移动,处理其间的其他事件,只要关键是按下来的。无论哪种方式,您都将使用KEYDOWN和KEYUP事件来设置某种标志,告诉您移动球拍。然后,每帧一次,或使用计时器事件,或以其他方式,您将使用当前标志值来移动球拍。
答案 1 :(得分:1)
while循环的问题在于它正在评估一个keydown事件。该事件将始终是它开始的任何事件,并且它不可能在事件处理代码中进行更改。你想要捕获的是它后面的PG.KEYUP事件。所以你会有一些(逻辑上)像
if event.type == PG.KEYDOWN and keystate[PL.K_UP]:
key_up_pressed = True
elif event.type == PG.KEYUP and keystate[PL.K_UP]:
key_up_pressed = False
显然,你可以更好地考虑因素,但key_up_pressed
状态将在你的主循环中经常评估一次(帧,毫秒,无论如何),并移动桨。