python pygame相机,以一个定时装置为中心

2024-09-27 00:13:17 发布

您现在位置:Python中文网/ 问答频道 /正文

关于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

Tags: 代码selfifexit玩家group级别中心
1条回答
网友
1楼 · 发布于 2024-09-27 00:13:17

问题是,level事件处理程序中的块清除代码设置,然后重置用于在屏幕实际重画之前使相机重新居中的开关。一旦事件处理程序发现exit_block_revealTrue,它就会清除退出块。列表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之前执行的,而不是在:

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块运行。由于disappearing_block_group中不再有元素,因此for块无需执行任何操作,并且运行零次迭代。在

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

希望这有帮助!在

相关问题 更多 >

    热门问题