嗨!大家好,我是小蚂蚁。
今天我们继续来看下一个流程:形状停靠。什么是形状停靠呢?就是当一个形状碰撞到任何一个已有的方块或者碰撞到下边界时,它就应该被停放在那里。在处理形状停靠之前,有一点儿东西需要了解,就是已经停靠的方块和正在下落的方块不是一种方块,如图,红色的表示的是已经停靠的方块,绿色的表示下落的方块。
绿色方块的作用是展示当前下落的形状,红色方块的作用是标识出哪些位置已经摆放了方块。
整个停靠的过程是这样的:当形状发生碰撞后,我们在当前形状对应的方块位置上创建一个新的方块,创建完新的方块之后,再将当前的这个形状移除。如果你看了之前的教程,对于数据抽象和表格的遍历有了一定的了解,那么这里就很容易了。当形状发生碰撞后,首先计算出当前形状的的“计算点”在整个数据表格中的行号和列号,然后从“计算点”所在的行列号开始,依次遍历当前状态数据表格中的每一项,如果当前数据为 1 ,就在这个位置处创建一个新的方块,直到当前状态的数据表格遍历完成为止。最后,再将这个形状删除。其中还涉及到行列号和位置的换算,公式在上面,就不再解释了。这个换算将表面上的游戏世界和背后的看不见数据表格连接起来,其实真正的计算和逻辑处理都是以背后的数据表格为基础的,背后的工作完成之后,再将得到的结果展现到游戏的界面上。
接下来,我们就来看一下形状停靠的逻辑实现。由于形状只在下方发生碰撞时才进行停靠,所以,我们只需要处理向下移动的逻辑即可。
方块填充的函数。
创建一个新的“填充方块”用于填充,为了区分两种方块,这里我将填充方块设置为绿色。
再来看一下“填充方块”的积木逻辑。
逻辑很简单,根据行号和列号设置自己在游戏世界中的位置,然后再在整个数据表格中自己对应的位置处设置为 1,表示当前的这个位置已经有方块填充了。
最后,我们来预览一下。
一个形状停靠之后,在它的各个方块的位置上创建了新的绿色填充方块,填充完成后,原有的白色形状被删除了,这个就是“形状停靠”的过程了。
你是否疑惑为什么这里要用两种方块呢?在形状的停靠过程中使用同一个方块不行吗?为什么要把原来的删除掉,再去创建新的方块呢?
之所以这么做是要把不同方块的职责划分清楚。构成形状的方块不需要任何的逻辑,它只是用于拼凑出当前的形状。而填充的方块需要处理后续的很多事情,例如消除处理,下落处理等。所以,我们使用两种方块,一种方块没有逻辑,只用于表现,一种方块包含逻辑,用于后续的各种处理。这样每种方块只需要专心的处理自己的职责即可,无需了解其它的事情。