模型类
现在我们来编写用于删除方块的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_block
和hide_block
函数还没讲呢!我这就要讲了啊。
先来看show_block
和hide_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
函数了。如果有什么不懂的欢迎评论。最后,点个赞再走吧~