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

模型类

现在我们来编写用于删除方块的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函数了。如果有什么不懂的欢迎评论。最后,点个赞再走吧~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值