gpt4 book ai didi

python pygame - 以set_timer事件为中心的相机

转载 作者:行者123 更新时间:2023-11-28 19:23:11 25 4
gpt4 key购买 nike

我对 Python/PyGame 中的定时事件有疑问。我正在制作一个 2D 横向卷轴平台游戏,目标是接触所有敌人,在收集完所有敌人后,我希望相机中心位于“导出区”。

在相机以“Exit Block”为中心后,我想移除它周围的 block ,然后居中相机回到播放器上。这样玩家就可以看到周围的方 block 被移除并且可以到达“退出 block ”。

在收集完所有敌人后,我得到了以“导出 block ”为中心的代码,但是在移除周围的方 block 之前摄像机切换到播放器。镜头对准播放器后,方 block 将被移除。

我在这里遗漏了关键部分。我试过 pygame.time.wait()周围的方 block 被移除后。有什么帮助吗?请告诉我代码是否我提供的还不够。

编辑:我将我的主要游戏循环分解为:

level.handle_events(pygame.event.get())
level.update()
level.render(screen)
pygame.display.flip()

问题可能是,主循环处理 USEREVENT,之后相机更新,并且只有之后绘制完成,这就是为什么看不到周围 block 的移除?但我仍然不知道如何进行..

相关代码:

玩家初始化:

self.EXITBLOCKCLEAR = pygame.USEREVENT + 1

玩家的碰撞检测:

for e in enemies_group:
if pygame.sprite.collide_rect(self, e)
if len(enemies_group) == 0:
self.exit_block_reveal = True
pygame.time.set_timer(self.EXITBLOCKCLEAR, 3000)

关卡更新:

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"

Level 的事件处理:

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

最新编辑:让代码工作

我试了一下,我让它按我想要的方式工作。这现在非常适合我。

更新的代码(这些是对原始代码的唯一更改)

使用此代码,当我收集到最后一个敌人时,相机移动到“退出方 block ”3 秒,周围的方 block 被移除,再过 3 秒后相机回到玩家中心。

关卡初始化:

self.i = 0

Level 的事件处理:

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

最佳答案

问题是关卡事件处理程序中的 block 清除代码设置,然后重置用于在屏幕实际重绘之前使相机重新居中的开关。一旦事件处理程序看到 exit_block_revealTrue,它开始清除退出 block 。列表 disappearing_exit_group 被清空,函数继续。清除所有 block 的循环后的下一条指令检查是否还有剩余 block -- if len(self.disappearing_block_group) == 0:。我们知道不会有,因为迭代器刚才把它们都杀了。 if block 触发,在更新程序知道它更改之前将 exit_block_reveal 设置回 False。

简而言之:碰撞检测器将 exit_block_reveal 设置为 True,但事件处理程序在更新程序查看它之前将其设置回 False。

您的解决方案通过向 block 移除函数添加一个循环来工作,但我认为您可以在没有该附加属性的情况下实现。考虑一下您的事件处理程序的这种修改,其中对 disappearing_block_group 的检查是在 exit_block_reveal 切换之前执行的,而不是之后:

if event.type == self.player.EXITBLOCKCLEAR:
if self.player.exit_block_reveal:
if not self.disappearing_block_group: # disappearing_block_group still has contents at this point, so player.exit_block_reveal won't toggle!
self.player.exit_block_reveal = False

for block in self.disappearing_block_group:
block.kill()
self.disappearing_block_group = list() # ** SEE NOTE **

在此,我所做的只是将 exit_block_reveal 开关移至 disappearing_block_group 真值检查上方。因为该列表仍然有内容,if not self.disappearing_block_group: 直到下一个周期才会运行。此时,列表已被删除(或初始化,如果您重新分配它,如图所示),并且 if block 运行。由于 disappearing_block_group 中不再有元素,因此 for block 无事可做,并运行零迭代。

注意:您也可以一次性清除整个列表,而不是删除每个元素。你根本不需要这样做!如果您完全感兴趣,这只是您的一种选择。

希望这对您有所帮助!

关于python pygame - 以set_timer事件为中心的相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19927330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com