一、引言
在上一篇文章《Scratch高级编程之克隆技术再研究》中,我把Scratch的克隆技术划分为非共享数据克隆体与共享数据克隆体两大类型,本文将给出非共享数据克隆体的一种应用举例——克隆子弹与弹壳。当然,这个例子属于克隆技术的一种比较基础性的应用情形。
二、快照欣赏
因为本处不方便提供视频片断,仅提供游戏过程中枪发射子弹某一时刻的静态截图如下:
三、角色功能设计
(一)小游戏中几个关键角色的关系
(二)枪角色功能模块
(三)子弹角色功能设计
(四)弹壳角色功能设计
(五)血条角色功能设计
四、变量定义
(一)隐藏型全局变量
- gv弹药量:与血条绘制对应,最大值是36。
- gv射击方向:在射击过程中,枪方向在随时抖动,这个变量一直跟随枪的当前方向,并根据需要当方向超过一定限度作微调。这与实际枪战中射击情形是一致的。
- gv正在重装子弹:这是一个控制共享访问协调并发访问的互斥类型信号变量。
(二)隐藏型局部变量
- lv弹壳X方向加速度:定义弹壳X方向加速度
- lv弹壳Y方向加速度:定义弹壳Y方向加速度
在以前的文章中我们强调,尽管是加速度,但是在Scratch循环中这个加速度正好对应于“速度变化量“含义,这个单位时间正好对应循环一次所用时间。这是与物理上加速度定义相符合的。
五、角色编程
(一)枪角色编程
在前面设计枪角色(两个造型)时,注意枪的中心点,因为后面子弹与弹壳的位置都以它为标准,见下面设计时截图:
枪中心点位于准星与弹夹上部交叉点
**1.鼠标拖动枪的代码
**
上述代码非常简单,这里仅作简化设计,鼠标拖动枪只能修改位置,不能旋转。
2.射击方向跟踪与调整
与前面说明的一致,全局变量”gv射击方向“作用是时刻跟踪枪的射击方向,因为射击中的抖动效果,所以,要及时作微调。
3.按r键重装弹药代码
在这段代码(实际上是一个线程)中,有如下几点需要注意:
(1)这是一个一直跟踪判断按r键的无限循环
(2)互斥信号变量”gv正在重装子弹“的作用希望大家好好体会一下,因为在重装子弹中有些事情是不允许发生的(例如本游戏中的发射子弹)。这个变量在枪角色的另外一个线程(实际是本角色的主线程)中也使用到,这种类型变量的引入作用正在于控制避免矛盾的情形发生。下面代码再详细介绍。
(3)在重装过程中,为了体现延时效果(这样才看得清楚),使用了一个运行100次的小循环,有兴趣的朋友可以修改这个循环次数观察效果。
(4)重装结束(小循环结束),播放消息重装结束(此消息用于判断是否可发射子弹、绘制血条等地方使用)。
(5)然后,修改变量值指示总药量已满(36),并设置互斥信号变量”gv正在重装子弹“以说明重装结束,最后切换造型。
4.按空格键发射子弹代码
上面代码完成了两大任务:一个变量初始化(从全局来看,此几行代码相当于整个小游戏需要变量的初始化准备);按空格键发射子弹。
细分析循环语句内部,当有弹药且重新安装已经完成时,发射子弹:克隆子弹与弹壳;修改总弹药量、广播消息用于绘制血条、微调方向等。
(二)子弹角色编程
结合本文开始提到的,大家注意这里克隆体的用法,其实是很简单的。注意它使用了哪些数据,这些数据来自于哪里,是自身的还是全局其他地方定义的。有关代码逻辑实现,相信不用解释了,比较易于理解。
(三)弹壳角色编程
结合上面的模块功能介绍,相信朋友们也不难理解这里的逻辑。这个克隆体,虽然看起来比子弹克隆体代码复杂,但是,它使用的数据全部是它自身的!因此,这个克隆体实现更为简单,只是由于它涉及到物理学中部分知识而显得略微复杂一点。
大家把握如下几点,便不难理解上面代码了:
(1)为了模拟子弹发射后子弹壳崩出的效果,有两个方向的加速度(X方向与Y方向)。但是,在Scratch内部,每次循环相应于过了一个单位时间,所以这个加速度正好对应于两个方向的速度的变化量。这一点希望一定理解;否则,再开发稍微复杂的物理游戏就更麻烦了。(题外一句:希望青少年朋友认真钻研物理,从小打好基本功!)。
(2)随着循环的不断执行,不断地修改两个方向的速度(经验值在此很重要,有兴趣的朋友可以作相似数据修改,观察效果)。
(3)克隆体在不需要时尽量删除,从而提高系统的整体运行性能。
(四)血条角色编程
炮弹剩余量表示我们统一用流行的游戏中的”血条“这个名称来称呼。血条的绘制并不太难理解。
绘制前首先需要初始准备。
因为当血条角色接收到消息”发射“与”重装完毕“时都会使用相同逻辑绘制血条,所以我们定义了一个自定义积木”绘制剩余血量“。
(1)代码一
上面的绘制逻辑是通过修改X坐标值来实现的。注意:游戏中最大子弹量为36,随着不断发射子弹,这个数在不断减少。
(2)重新装满子弹时绘制代码
装满子弹的逻辑较上面绘制剩余血量更简单,要绘制整个完整血条,在此不再解释。
六、小结
本文中,我们通过一个形象有趣的小游戏来介绍了克隆编程在Scratch编程中的一种典型应用。当然,这个例子中的克隆应用算是相当基础性的,属于我们前面归纳的”非共享数据克隆体“中的比较简单的一种类型——尽管使用了两个克隆体。在以后的例子中,我还会介绍更复杂的克隆体编程的应用情形,欢迎朋友们关注并共同探讨。
直接就废了