Scratch项目式编程实战:打造超酷大型游戏
上QQ阅读APP看书,第一时间看更新

4 启动按钮

4.1 按钮显示

我们在位图编辑模式下通过绘制来新建所需的按钮角色,按照前面内容中绘制像素图像的方法来绘制出按钮的形状,如下图所示。

我们一般会在按钮内部通过文字来注明按钮的功能,而按钮与文字的相对位置可能需要通过多次调整才可以确定一个最佳的显示效果。由于位图只有一个图层,每一次局部移动后都需要对移动产生的空缺进行填补,所以我们在绘制好按钮后可以先将造型转化为矢量图编辑模式后再进行后续创作。在矢量图编辑模式下按钮和文字会自动分配到不同图层,使用选择工具即可对单一图层直接拖拽进行调整。

在使用文本功能书写文字时会发现,为了保证文字的清晰度,文字大小会远远超出按钮的范围,这时可以使用选择工具来选中按钮所在图层并将其放大,在舞台区观察按钮与文字的匹配效果并进行调整,使其呈现合适比例。

造型绘制完成后对角色进行初始设置,确定按钮在舞台中显示的位置和大小。程序启动时将角色隐藏,通过使用虚像特效在程序启动3秒(s)后逐渐将角色显现出来,注意【隐藏】和【显示】的搭配使用。虚像特效数值范围为0~100,0为完全实体,100为完全透明,随着特效数值的增大,透明程度不断增加,具体设置如右图所示。

造型调整小技巧

1)拖动选框四个顶点进行拉伸,将会在保证选区长宽比不变的情况下对选区进行放大或缩小。

2)拖动选框四个边线的中点进行拉伸,则只会改变该边线的位置并造成变形。

3)拖动选框顶点进行拉伸时按下Shift键,可以同时调整选区的长和宽且会改变长宽比。

4)拖动选框顶点进行拉伸时按下Alt键,则会在保持图形中心位置不变的情况下进行放大或缩小。

4.2 选择结构

作为按钮,其是否被单击将会影响程序的执行效果。通常情况下,不单击按钮则不会发生任何变化,单击按钮则会启动某一个新的功能。而我们之前使用到的顺序结构和循环结构,都无法实现根据当前状态进行选择性执行的效果,所以这里介绍一种新的结构——选择结构。

在控制类别中有【如果<>那么…】和【如果<>那么…否则…】两个可以实现选择结构的代码模块。【如果<>那么…】是在满足指定条件时执行其内部功能,不满足条件时则不执行。【如果<>那么…否则…】是在满足指定条件时执行【那么】中的功能,不满足条件时则执行【否则】中的功能。

我们首先给按钮增加一个触碰效果,当鼠标指针碰到按钮时将按钮实体显示,否则将按钮虚化显示。不过我们如何知道鼠标指针与角色是否接触了呢?

在侦测类别中找到<碰到(鼠标指针)?>,此代码模块能够在执行时识别当前角色与鼠标指针是否接触,通常是作为选择结构的判断条件来使用。根据需要实现的效果,此处使用【如果<>那么…否则…】来设置鼠标指针碰到按钮和没有碰到按钮时各自的虚像特效数值。使用选择结构时要注意选择结构只会执行一次,如果需要多次执行就要搭配循环结构一起使用。

具体设置如右图所示。

4.3 广播功能

按钮需要实现的功能是当我们单击它时,可以结束开场动画阶段并进入下一个阶段。按钮是否被单击其实包含了对两个条件的检测,其一是<碰到(鼠标指针)?>,其二是<按下鼠标?>。我们在实现按钮提示的选择结构中再加入【如果<>那么…】来对鼠标是否按下进行判断。

具体设置如下图所示。

当我们单击按钮后,程序将会从当前阶段进入下一个阶段,这个变化过程涉及了多个角色和背景的参与。我们在日常生活中可以通过校园广播、城市广播等方式向人群发送信息,在软件里也有相似的功能,就是事件类别中的【当接收到()】、【广播()】和【广播()并等待】。

【广播()】用来在满足一定条件下进行信息发送。【当接收到()】在角色接收到指定信息时启动后续代码模块,它可以用于实现多个角色和背景间某些功能的同步启动。【广播()并等待】是在【广播()】功能的基础上增加了等待功能,只有与此消息相关的所有【当接收到()】程序段都运行完毕,才能再继续执行自己后续的代码模块。随着项目中功能的不断增加,可能会使用到多个广播信息,制作程序的时候要注意广播与接收的信息之间的匹配。

我们在按钮被单击时广播“新的游戏”,此时按钮已完成自己的全部功能,可以使用【隐藏】和【停止(这个脚本)】来释放资源,不过要注意使用的先后顺序,如右图所示。

参与开场动画阶段的其余角色在执行【当接收到(新的游戏)】时,也要使用【隐藏】和【停止(该角色的其他脚本)】,用以停止该角色在开场动画阶段的循环结构。如果角色使用了【隐藏】,那么要注意在初始设置时是否需要添加【显示】。

背景与角色不同,其是无法被隐藏的,所以只需在执行【当接收到(新的游戏)】时使用【停止(该角色的其他脚本)】,然后通过亮度特效将背景渐变为黑色,后续可以根据需要更改背景图片并恢复到常规亮度即可。不过要记得在初始设置时将使用到的特效数值归零,也可以直接使用【清除图形特效】将所有特效数值归零。