模型类
现在我来详细讲讲check_neighbours
函数。这个函数长这个样子:
class Model:
...
def check_neighbours(self, position):
x, y, z = position
# 依次检测上下前后左右的方块是否需要显示
for dx, dy, dz in Settings.faces:
key = (x + dx, y + dy, z + dz)
# 如果方块不存在,那么当然不用显示了
if key not in self.world:
continue
# 这里的情况和 add_block 中一样
# 只有露了面的方块才需要显示
if self.exposed(key):
# 如果没有被显示过,才需要显示
# shown 字典的作用讲到 show_block hide_block 时再细说
if key not in self.shown:
self.show_block(key)
else:
# 这里也是
if key in self.shown:
self.hide_block(key)
这个check_neighbours
函数是用来做什么的呢?别急,让我们来考虑两种情况:
- 第一种,我在一大片平整的、厚度大于2层的方块上放置了一个方块。不用说,我刚刚放下去的方块肯定是要显示的,但是我放的方块下面压着的那个方块到底要不要显示呢?在我放之前,肯定是要的。因为就算它的下面有方块、前后左右都有方块,但是上面是没有的。而在我放了之后,这个被压着的方块的上面就多出来了一个新方块,这时满足6个面都被方块包围,是不用显示的。
- 第二种,这次是一大片平整的、厚度大于3层的方块,我从顶层挖掉了一个方块。这时,被我挖掉的方块的下面的那个方块要显示吗?在我挖方块之前,肯定是不用的。因为它处于第二层中,上下都被包围、前后左右也都有方块。但是在我挖了之后,这个方块的上面就暴露了出来,这时就要显示了。
这种显示与不显示的变动只会存在于添加或删除的方块的相邻方块中,所以在add_block
和remove_block
函数中要调用check_neighbours
检查相邻方块。
这篇文章代码少,解说的内容多,特别是check_neighbours
函数的调用场景,各位可以好好体会一下。顺便,点个赞再走吧~