python pygame-以设置计时器事件为中心的摄像头

python pygame-以设置计时器事件为中心的摄像头,python,scroll,pygame,Python,Scroll,Pygame,关于Python/PyGame中的定时事件,我有一个问题。 我正在制作一个2D侧面滚动平台,目标是接触所有敌人, 当所有的敌人都被收集起来后,我希望摄像机中心在“出口区” 相机在“出口块”上居中后,我想移除它周围的块,然后居中 把相机放回播放机上。这样玩家就可以看到周围的方块 被移除,可以到达“出口挡块” 在所有敌人被收集后,我已经将代码集中在“出口区”上, 但是,在移除周围的块之前,相机会切换到播放器。 摄像机对准播放机中心后,块被移除 我错过了这里的关键部分。我试过pygame.time.w

关于Python/PyGame中的定时事件,我有一个问题。 我正在制作一个2D侧面滚动平台,目标是接触所有敌人, 当所有的敌人都被收集起来后,我希望摄像机中心在“出口区”

相机在“出口块”上居中后,我想移除它周围的块,然后居中 把相机放回播放机上。这样玩家就可以看到周围的方块 被移除,可以到达“出口挡块”

在所有敌人被收集后,我已经将代码集中在“出口区”上, 但是,在移除周围的块之前,相机会切换到播放器。 摄像机对准播放机中心后,块被移除

我错过了这里的关键部分。我试过pygame.time.wait() 在移除周围的砌块后。有什么帮助吗?请告诉我密码是否正确 我提供的还不够

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

level.handle_events(pygame.event.get())
level.update()
level.render(screen)
pygame.display.flip()
问题可能是,主循环处理USEREVENT,在更新相机之后,只有在绘制完成之后,才能,这就是为什么无法看到周围块的移除?但我还是不知道该怎么做

相关代码:

玩家初始化:

玩家碰撞检测:

级别更新:

级别的事件处理:

最新编辑:使代码正常工作

我到处玩,我让它像我想的那样工作。现在这对我来说非常有效

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

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

级别的初始化:

级别的事件处理:

如果event.type==self.player.EXITBLOCKCLEAR:
对于self.u block\u组中的块:
block.kill()
自消失\块\组。删除(块)
如果len(自消失块组)=0且自i<1:
self.i+=1
self.player.exit\u block\u reveal=True
其他:
self.player.exit\u block\u leaver=False
pygame.time.set_timer(self.player.EXITBLOCKCLEAR,0)#停止调用USEREVENT

问题在于,级别事件处理程序中的块清除代码设置,然后在屏幕实际重画之前重置用于重新居中相机的开关。一旦事件处理程序看到
exit\u block\u reveal
True
,它就开始清除退出块。列表
正在消失\u退出\u组
被清空,功能继续。清除所有块的循环后的下一条指令检查是否还有剩余的块--
如果len(self.ming\u block\u group)==0:
。我们知道不会有,因为迭代器刚才把它们都杀死了。
if
块触发,在更新程序知道它已更改之前,将
exit\u block\u discover
设置回False

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

您的解决方案通过向块移除函数添加一个循环来工作,但我认为您可以在没有附加属性的情况下完成。考虑一下对事件处理程序的修改,其中在<代码> ExtIXBuffelItPosie被切换之前,执行了<代码>消失的BuxBug组< /代码>,而不是在:

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\u block\u reveal
切换移动到
engineering\u block\u组
真相检查上方。因为该列表仍然有内容,
如果不是self.emerging\u block\u group:
直到下一个周期才会运行。此时,列表已被取消填充(或初始化,如果按图所示重新分配),并且
if
块将运行。由于
正在消失的块组中不再有元素
,因此块的
与此无关,并且运行零次迭代

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


希望这有帮助

我让它工作了。我不确定是否有更简单的方法,但我尽了我所能。
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"
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
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
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 **