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()
答案 0 :(得分:3)
我调查了您的存储库,在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
事件在事件队列中时,它实际上丢失了,因为您不在此{{ 1}}循环。然后在for
中再次调用pygame.event.get()
时,main
事件不再在队列中(因为调用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
答案 1 :(得分:1)
我希望循环能够运行,但是您遇到了一种类型不匹配的情况,没有得到报告。
for event in pygame.event.get():
if event == pygame.QUIT:
event
将是pygame.event.Event
对象。您要检查的QUIT
值是可能出现在event.type
属性中的值。由于没有事件是整数值QUIT
,因此所有事件都将被忽略。您可能想添加一个else
子句以诊断接收到但未处理的事件。