为什么这个循环 运行 不正确?
Why doesn't this loop run properly?
while g.running:
for event in pygame.event.get():
if event == pygame.QUIT:
g.running = False
g.run(Player_1)
quit()
当我 运行 这个循环时,它完全跳过了 for 循环,或者只执行一次,而且速度太快,我无法 运行 并且它继续 运行.如何使循环正常工作?
https://github.com/maartenww/100daysOfCode_projectOne << 完整代码。
此外,g.run 基本上只是更新游戏。所以它绘制和/或移动所有精灵,将文本绘制到屏幕上并进行一些计算
class Game:
def __init__(self):
self.running = True
def run(self, player_1):
self.border_col(player_1)
self.load_text(player_1)
self.update_game(player_1)
def update_game(self, player_1):
clock.tick(FPS)
gameDisplay.fill(black)
gameDisplay.blit(self.xcolon, (0, 0))
gameDisplay.blit(self.actual_x, (25, 0))
gameDisplay.blit(self.ycolon, (0, 30))
gameDisplay.blit(self.actual_y, (25, 30))
gameDisplay.blit(self.acolon, (0, 60))
gameDisplay.blit(self.actual_a, (25, 60))
gameDisplay.blit(self.vcolon, (0, 90))
gameDisplay.blit(self.actual_v, (25, 90))
all_sprites.draw(gameDisplay)
Player.move_player(player_1)
Player.update_player(player_1)
pygame.display.update()
我预计该循环会 运行,但您遇到了未报告类型不匹配的情况。
for event in pygame.event.get():
if event == pygame.QUIT:
event
将是一个 pygame.event.Event
对象。您要检查的 QUIT
值可能出现在 event.type
属性中。由于没有事件是整数值 QUIT
,所有事件都将被忽略。您可能想要添加一个 else
子句来诊断哪些事件已收到但未处理。
我查看了你的回购协议,相关代码是这样的,在 player.py
:
def move_player(self):
for event in pygame.event.get():
# Player movement
if (event.type == pygame.KEYDOWN):
if (event.key == pygame.K_d):
self.player_acc = PLAYER_ACC
if (event.key == pygame.K_a):
self.player_acc = -PLAYER_ACC
if (event.type == pygame.KEYUP):
if (event.key == pygame.K_d):
self.player_acc = 0
if (event.key == pygame.K_a):
self.player_acc = 0
想想你的主循环中会发生什么:
while g.running:
for event in pygame.event.get():
if (event.type == pygame.QUIT):
g.running = False
g.run(Player_1)
您从事件队列中获取所有事件,清除它,并检查 QUIT
。
然后你调用 g.run
,它会调用 self.update_game
,它会调用 Player.move_player
,它会再次从事件队列中获取所有事件并清除它。
因此,当 QUIT
事件在事件队列中时 pygame.event.get()
在 Player.move_player
中被调用时,它实际上丢失了,因为您没有在此处理它for
循环。当在 main
中再次调用 pygame.event.get()
时,QUIT
事件不再在队列中(因为调用 event.get
会清除队列)。
基本上,每次主循环迭代只应调用 'event.get' 一次(pygame.display.flip
/pygame.display.update
也是如此)。
也许可以将 main
中的循环更改为如下内容:
while g.running:
for event in pygame.event.get():
g.handle(event, Player_1)
g.run(Player_1)
将此添加到 Game
:
def handle(self, event, player_1):
if event.type == pygame.QUIT:
self.running = False
else:
player_1.handle(event)
这对 Player
:
def handle(self, event):
# Player movement
if (event.type == pygame.KEYDOWN):
if (event.key == pygame.K_d):
self.player_acc = PLAYER_ACC
if (event.key == pygame.K_a):
self.player_acc = -PLAYER_ACC
if (event.type == pygame.KEYUP):
if (event.key == pygame.K_d):
self.player_acc = 0
if (event.key == pygame.K_a):
self.player_acc = 0
并删除 Player.move_player
while g.running:
for event in pygame.event.get():
if event == pygame.QUIT:
g.running = False
g.run(Player_1)
quit()
当我 运行 这个循环时,它完全跳过了 for 循环,或者只执行一次,而且速度太快,我无法 运行 并且它继续 运行.如何使循环正常工作? https://github.com/maartenww/100daysOfCode_projectOne << 完整代码。
此外,g.run 基本上只是更新游戏。所以它绘制和/或移动所有精灵,将文本绘制到屏幕上并进行一些计算
class Game:
def __init__(self):
self.running = True
def run(self, player_1):
self.border_col(player_1)
self.load_text(player_1)
self.update_game(player_1)
def update_game(self, player_1):
clock.tick(FPS)
gameDisplay.fill(black)
gameDisplay.blit(self.xcolon, (0, 0))
gameDisplay.blit(self.actual_x, (25, 0))
gameDisplay.blit(self.ycolon, (0, 30))
gameDisplay.blit(self.actual_y, (25, 30))
gameDisplay.blit(self.acolon, (0, 60))
gameDisplay.blit(self.actual_a, (25, 60))
gameDisplay.blit(self.vcolon, (0, 90))
gameDisplay.blit(self.actual_v, (25, 90))
all_sprites.draw(gameDisplay)
Player.move_player(player_1)
Player.update_player(player_1)
pygame.display.update()
我预计该循环会 运行,但您遇到了未报告类型不匹配的情况。
for event in pygame.event.get():
if event == pygame.QUIT:
event
将是一个 pygame.event.Event
对象。您要检查的 QUIT
值可能出现在 event.type
属性中。由于没有事件是整数值 QUIT
,所有事件都将被忽略。您可能想要添加一个 else
子句来诊断哪些事件已收到但未处理。
我查看了你的回购协议,相关代码是这样的,在 player.py
:
def move_player(self):
for event in pygame.event.get():
# Player movement
if (event.type == pygame.KEYDOWN):
if (event.key == pygame.K_d):
self.player_acc = PLAYER_ACC
if (event.key == pygame.K_a):
self.player_acc = -PLAYER_ACC
if (event.type == pygame.KEYUP):
if (event.key == pygame.K_d):
self.player_acc = 0
if (event.key == pygame.K_a):
self.player_acc = 0
想想你的主循环中会发生什么:
while g.running:
for event in pygame.event.get():
if (event.type == pygame.QUIT):
g.running = False
g.run(Player_1)
您从事件队列中获取所有事件,清除它,并检查 QUIT
。
然后你调用 g.run
,它会调用 self.update_game
,它会调用 Player.move_player
,它会再次从事件队列中获取所有事件并清除它。
因此,当 QUIT
事件在事件队列中时 pygame.event.get()
在 Player.move_player
中被调用时,它实际上丢失了,因为您没有在此处理它for
循环。当在 main
中再次调用 pygame.event.get()
时,QUIT
事件不再在队列中(因为调用 event.get
会清除队列)。
基本上,每次主循环迭代只应调用 'event.get' 一次(pygame.display.flip
/pygame.display.update
也是如此)。
也许可以将 main
中的循环更改为如下内容:
while g.running:
for event in pygame.event.get():
g.handle(event, Player_1)
g.run(Player_1)
将此添加到 Game
:
def handle(self, event, player_1):
if event.type == pygame.QUIT:
self.running = False
else:
player_1.handle(event)
这对 Player
:
def handle(self, event):
# Player movement
if (event.type == pygame.KEYDOWN):
if (event.key == pygame.K_d):
self.player_acc = PLAYER_ACC
if (event.key == pygame.K_a):
self.player_acc = -PLAYER_ACC
if (event.type == pygame.KEYUP):
if (event.key == pygame.K_d):
self.player_acc = 0
if (event.key == pygame.K_a):
self.player_acc = 0
并删除 Player.move_player