Python从零模仿我的世界(七)

本文介绍了游戏开发中的方块管理函数,包括remove_block用于删除方块,show_block和hide_block用于显示和隐藏方块。hide_block和show_block使用_enqueue和_dequeue确保操作在合适的时间执行,提升游戏流畅性。同时,文章提到了enqueue和dequeue的简单实现,它们是基于deque的数据结构来实现异步操作的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模型类

现在我们来编写用于删除方块的remove_block函数:

    def remove_block(self, position, immediate=True):
        # 删除在 world 字典中的值(也就是删除了这个方块)
        del self.world[position]
        self.sectors[sectorize(position)].remove(position)
        if immediate:
            # 如果这个方块正在显示,那么隐藏它
            if position in self.shown:
                self.hide_block(position)
            self.check_neighbours(position)

remove_block中的很多思维方式和add_block是一样的,这里就不详细讲了。

显示/隐藏方块

可能有人要说了:哎你show_blockhide_block函数还没讲呢!我这就要讲了啊。
先来看show_blockhide_block函数的代码:

class Model:
    ...
    def show_block(self, position, immediate=True):
        # 还记得吗?这个 name 属性就是在执行 Block.__call__ 中写进去的,是方块的英文命名
        block = self.world[position].name
        # 标记此方块为正在显示
        self.shown[position] = block
        if immediate:
            # show_block 的底层实现
            self._show_block(position, block)
        else:
            self._enqueue(self._show_block, position, block)

    def hide_block(self, position, immediate=True):
        # 删除正在显示的记录
        self.shown.pop(position)
        if immediate:
            # hide_block 的底层实现
            self._hide_block(position)
        else:
            self._enqueue(self._hide_block, position)

这个_enqueue是配合_dequeue使用的,能够把软实时的操作暂时添加到一个队列中,等到空闲时再真正执行这些操作,这是为了让游戏运行得更流畅。这两个函数的实现如下:

class Model:
    ...
    def _enqueue(self, func, *args):
        # 把操作和参数添加进队列
        self.queue.append((func, args))

    def _dequeue(self):
        # 从队列底端弹出操作和参数
        func, args = self.queue.popleft()
        # 注意,到这里就直接执行了
        func(*args)

很简单,对吧?只是对deque的一个封装而已。

这篇文章就讲这么多,下一篇文章就会讲到_show_block_hide_block函数了。如果有什么不懂的欢迎评论。最后,点个赞再走吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值