关于Python/PyGame中的定时事件,我有一个问题。 我正在制作一个二维侧滚平台,目标是触碰所有敌人, 在所有敌人都被收集起来之后,我要把摄像机的中心放在“出口区”。在
在相机已经在“退出块”上居中后,我想移除它周围的块,并居中 摄像机回到播放器上。这样玩家就可以看到周围的街区 移除并可以到达“出口块”。在
我已经把所有的敌人都集中到“出口区”上, 但在移除周围的方块之前,相机会切换到播放器。 当摄像机对准球员中心后,方块被移除。在
我错过了关键的部分。我试过了游戏。时间。等等() 在周围的障碍物被移除之后。有什么帮助吗?请告诉我密码 我提供的是不够的。在
编辑:我已经将我的主游戏循环分解为:
level.handle_events(pygame.event.get())
level.update()
level.render(screen)
pygame.display.flip()
问题可能是,主循环处理USEREVENT,在更新相机之后,只有在完成绘图之后,这就是为什么不能看到周围块的移除?但我还是不知道该怎么办。。在
相关代码:
玩家初始化:
^{pr2}$玩家的碰撞检测:
^{3}$级别更新:
if self.player.exit_block_reveal == False:
self.camera.update(self.player) # camera follows player
else:
self.camera.update(self.exit_block) # camera centered on "exit block"
级别的事件处理:
if event.type == self.player.EXITBLOCKCLEAR:
if self.player.exit_block_reveal == True:
for block in self.disappearing_block_group:
block.kill()
self.disappearing_block_group.remove(block) # remove the surrounding blocks
if len(self.disappearing_block_group) == 0: # when blocks are removed, center camera back to player
self.player.exit_block_reveal = False
最新编辑:让代码正常工作
我到处玩,让它发挥了我想要的效果。这对我来说很合适。在
更新代码(这些是对原始代码的唯一更改)
有了这个代码,当我收集到最后一个敌人时,相机移动到“退出区”3秒,周围的方块被移除,再过3秒,相机就回到了玩家的中心。在
级别初始化:
self.i = 0
级别的事件处理:
if event.type == self.player.EXITBLOCKCLEAR:
for block in self.disappearing_block_group:
block.kill()
self.disappearing_block_group.remove(block)
if len(self.disappearing_block_group) == 0 and self.i < 1:
self.i += 1
self.player.exit_block_reveal = True
else:
self.player.exit_block_reveal = False
pygame.time.set_timer(self.player.EXITBLOCKCLEAR, 0) # stop calling USEREVENT
问题是,level事件处理程序中的块清除代码设置,然后重置用于在屏幕实际重画之前使相机重新居中的开关。一旦事件处理程序发现
exit_block_reveal
是True
,它就会清除退出块。列表disappearing_exit_group
被清空,函数继续。清除所有块的循环后的下一条指令检查是否还有剩余的块if len(self.disappearing_block_group) == 0:
。我们知道不会有,因为迭代器刚才把他们都杀了。if
块激发,在更新程序知道其更改之前,exit_block_reveal
设置回False。在简而言之:碰撞检测器将
exit_block_reveal
设置为True,但在更新程序查看它之前,事件处理程序将其设置回False。在您的解决方案是通过向块移除函数添加一个循环来实现的,但是我认为您可以不使用该附加属性。考虑对事件处理程序的这一修改,其中,
disappearing_block_group
的检查是在切换exit_block_reveal
之前执行的,而不是在:在这篇文章中,我所做的就是将
exit_block_reveal
开关移到disappearing_block_group
真相检查之上。因为该列表仍有内容,if not self.disappearing_block_group:
直到下一个循环才会运行。此时,列表已经被取消填充(或者初始化,如果您重新分配它,如图所示),并且if
块运行。由于disappearing_block_group
中不再有元素,因此for
块无需执行任何操作,并且运行零次迭代。在注意:您也可以一次性清除整个列表,而不是删除每个元素。你根本不需要这样做!如果你有兴趣的话,这只是你的一个选择。在
希望这有帮助!在
相关问题 更多 >
编程相关推荐