友情提示:680元/半年,儿童学编程,就上码丁实验室。
在使用Scratch 进行动画及游戏设计时,常常需要处理角色飞到边缘后消失的情况。但细细研究后会发现,何时让角色消失并不像看起来那样的简单。这里我们集中讨论一下这个问题。
我们制作这样一个实例,让小猫角色在屏幕的中心,之后每1秒会转向随机的方向并产生一个克隆体,克隆体沿此方向不断运行,到边缘后消失。
角色的代码如下:
下面我们用几个算法对消失进行判断和处理。
直接碰撞检查
使用角色与边缘碰撞的检测。克隆体的代码如下:
效果如下:
从图中可以看出,一旦角色有一个点碰到了边缘,就会立即消失,感觉消失得有一些突然,视觉效果并不好。
中心点出界判断
下面使用的算法中,通过判断角色的中心点坐标是否超出了范围来决定消失。我们知道舞台的坐标范围,所以使用(x<-240或x>240, y<-180或y>180)就可以判断角色的中心点是否移出了边界。
程序如下:
效果如下:
可以看出,这次当角色的一半移出时,角色消失了,比上一个方法要好一些,但还是不够好。
那么如何去做呢?
根据坐标的变化
我们观察一下,如果角色超过了边界范围后,坐标会如何变化。
使用下面一个简单代码进行测试。
运行此程序后可以看到,当到达边界后,小猫只露了一个尾巴,就不再继续向右运动了,查看坐标能够看到最终的坐标是x=271,而不是x=300,也不是x=240。
如果小猫是斜向运动到边界的。我们就可以看到,当小猫到达右边界后,它会沿着边界向下移动,即x坐标不变,y坐标不断减小。
实际上大家通过使用Scratch软件能够感觉到,软件中的一个原则就是不让一个角色完全移动到边界外面,这一点与其它很多的软件都是不同的。
根据到达边界后,x,y坐标不再发生变化,我们可以设计出算法3。也就是当x坐标超出边界范围后,一旦发现x坐标不再改变,就可以将此克隆体删除了。
代码如下:
这里定义的oldx和oldy记录了移动前的坐标,dx和dy在角色移动后,对坐标进行判断。如果x超过了-240,240的范围,而x坐标已不再发生变化时,就认为已出了边界,删除克隆体。需要注意,这里使用的四个变量都必须是局部变量(只适用于本克隆体)。
效果如下:
可以看出,这种方法比较好地处理了这个问题,在小猫还剩下最后一点的时候才消失。但仔细考虑,这个方法还有一些限制条件,如果中心点不在角色的内部,或移动的方向发生改变时,也可能出现误判。
看来,这一个在边界处消失的问题,还真的不像看起来那样的简单呢。
基于坐标计算运动时的检测方法
在控制物体移动时,实际上有两种方法:
一种是使用向当前方向移动几步的方式。
另一种是通过程序计算出角色应该到达的位置,再把角色利用移动到积木移到指定位置。
如果是使用后都控制角色的移动,那么检查出界的方式就简单了,只需要检查角色当前的位置和命令移动到的位置是否相同,如果不相同,就说明角色已经超过边缘了。
程序如下:
算法4能够完美地解决算法3中的其它问题。可以说是一个比较好的解决方案。
效果如下:
可以看到:算法的选择不但和检测的算法有关,还和控制角色运行的方式相关。大家可以理解各个算法的思路,在不同的场合,根据实际情况使用。怎么样?下次再遇到类似问题的话,相信你一定能够找到一种合适的方法来处理越过边缘问题的!
结语
1、提出了四种算法,算法1使用碰撞边缘,算法2使用中心点坐标的检查,算法3检查X或y坐标是否已不变,算法4在使用计算坐标控制角色时,检查xy是否与实际位置不一致。
2、Scratch在处理边界处角色时有一定的问题,但也为我们发挥想象力解决问题提供了一个很好的例子。