首页 理论教育制作虚拟场景:FlashCS6中文版实例教程

制作虚拟场景:FlashCS6中文版实例教程

【摘要】:首先制作地面,当飞船飞动的时候,地面可以相对运动,表明飞船正在飞。图10-36 测试激光图10-37 添加地面为了显示飞船向右运动的效果,根据相对论,可以向左移动地面,好像坐车的时候感觉地面向后移动一样。第五行groundspeed=10;建立一个新的变量groundSpeed,它的值等于10。MainGround影片剪辑只有一帧,但是它将一直进入那一帧,这个动作是循环的。第三行检查mainGround是否已经移动到使mainGround内部的第一个ground完全移出舞台。在spaceship的脚本窗口中,为spaceship添加另外一个消息处理函数。

首先制作地面,当飞船飞动的时候,地面可以相对运动,表明飞船正在飞。

978-7-111-40639-6-Chapter10-121.jpg在主时间轴创建一个新层,起名为ground,画一些表示地面的图形。最简单的莫过于一些山峰加上一些低谷,如图10-37所示,一定要保证地面的尺寸和舞台的尺寸一致,而且开始的部分和结束的部分要高度一致,因为要让它循环运动来表示无穷无尽的地面。

978-7-111-40639-6-Chapter10-122.jpg选中刚刚画好的地面,按F8键把它转化为影片剪辑。然后选中舞台上影片剪辑实例,在属性面板的实例名称文本框中输入ground。

978-7-111-40639-6-Chapter10-123.jpg

图10-36 测试激光

978-7-111-40639-6-Chapter10-124.jpg

图10-37 添加地面

为了显示飞船向右运动的效果,根据相对论,可以向左移动地面,好像坐车的时候感觉地面向后移动一样。移动地面的最好方法就是让ground影片剪辑的X坐标逐渐地减小。

为了使移动的效果看起来更加平滑,需要两个这样的地面影片剪辑。但是不简单地把两个地面的影片剪辑放到一起,而是把两个这样的地面影片剪辑放到另外的一个影片剪辑中,起名为mainGround。然后用影片剪辑mainGround来代替两个单独的ground影片剪辑。换句话说,mainGround影片剪辑包含了两个ground影片剪辑,通过移动mainGround来代替移动两个ground影片剪辑。要做的第一件事情就是把ground影片剪辑放到一个新的影片剪辑中。

978-7-111-40639-6-Chapter10-125.jpg选中舞台上的ground实例,按下F8键,创建一个新的影片剪辑,起名为mainGround,同时在属性面板上的实例名称文本框中输入mainGround。

现在的mainGround影片剪辑中只包含一个ground影片剪辑,前面不是说过要用两个ground吗?没错,的确是这样,将在后面用ActionScript来复制一个ground。

现在可以为mainGround添加一些代码了。

978-7-111-40639-6-Chapter10-126.jpg选中舞台上的mainGround实例,打开“动作”面板,添加下面的代码:

978-7-111-40639-6-Chapter10-127.jpg

说明:这段代码放在load ClipEvent中,当mainGround第一次加载的时候运行。

第二行复制了一个ground影片剪辑,给它一个名字ground2,深度为100。

第三行把ground2的X坐标设置成ground的X坐标加上ground的宽度,效果就是正好把ground2放在了ground的右边。

第四行创建一个变量groundStartx,并给它赋初值为mainGround的X坐标。目的就是保存mainGround的初始位置,后面会用到它。

第五行groundspeed=10;建立一个新的变量groundSpeed,它的值等于10。这是地面每帧移动的像素数。

978-7-111-40639-6-Chapter10-128.jpg在上述代码后面,再添加另外一个消息处理函数。

978-7-111-40639-6-Chapter10-129.jpg

说明:这段代码放在enterFrame消息处理函数中,所以每次影片剪辑进入一个新帧的时候,它们都会被调用。MainGround影片剪辑只有一帧,但是它将一直进入那一帧,这个动作是循环的。

第二行:this._x-=groundSpeed;把地面的X坐标减去groundSpeed,前面已经把groundSpeed设置成了10,所以这个语句的效果就是把mainGround向左移动10个像素。

第三行检查mainGround是否已经移动到使mainGround内部的第一个ground完全移出舞台。如果已移出舞台,第四行把mainGround的X坐标设置成它刚刚开始的坐标。

再来看看涉及到的一些变量。

this._x是mainGround的当前X坐标。

ground._width是ground MovieClip的宽度。

groundStartx是先前设置的变量。

当第一个ground完全移出舞台的时候,它的X坐标等于它的开始的X坐标减去它的宽度。在这个时候,第二个ground刚刚开始在舞台上出现。(www.chuimin.cn)

当把mainGround重新移到它开始的位置的时候,必须同时减去groundSpeed,因为mainGround仍然需要向左移动groundSpeed规定的距离。

现在读者可以测试一下这个滚动的地面了,在Flash开发环境中,可能看起来有一点奇怪,因为在测试模式Flash开发环境允许读者看到stage外部的区域,如果在浏览器里测试的话,就一切正常了。

在大多数这种飞船游戏中,地面不是一直都在滚动的。一般情况是这样,飞船开始的时候在屏幕的最左边,当它移动到离屏幕左边大约屏幕宽度的三分之一的时候,飞船停止移动,这个时候地面开始反方向移动。

现在就开始做这个改进。大多数的代码在spaceship的消息处理函数中。Spaceship的位置将决定什么时候开始滚动,什么时候停止滚动。

978-7-111-40639-6-Chapter10-130.jpg选中spaceship,右键单击打开“动作”面板,在onClipEvent(load)函数中,在laserCounter=1;这行后面,添加下面的代码:

978-7-111-40639-6-Chapter10-131.jpg

第一行建立一个新变量scrollx。这个变量将是spaceship刚刚停止向右运动时候的X坐标,当然也是ground开始滚动的X坐标。刚开始的时候把它设置成ground宽度的三分之一。

第二行建立一个新的变量scrollStart。这个变量在ground应该滚动的时候设置成true,在ground静止的时候设置成false。

978-7-111-40639-6-Chapter10-132.jpg为了实现spaceship已经移动到了scrollx位置,spaceship停止移动,地面开始反方向滚动,需要修改处理向右方向键的代码。当前的处理代码应该是这样的:

978-7-111-40639-6-Chapter10-133.jpg

用下面的这段代码代替它:

978-7-111-40639-6-Chapter10-134.jpg

978-7-111-40639-6-Chapter10-135.jpg

引入一个if语句,如果this._x(spaceship的当前X坐标)小于scrollx的话,spaceship的X坐标一直增大,一直右移,直到条件不成立的时候,把scrollStart设置成true,不再改变spaceship的X坐标。

地面不会一直滚动,在某些条件下,它是不应该滚动的。

978-7-111-40639-6-Chapter10-136.jpg在spaceship的脚本窗口中,为spaceship添加另外一个消息处理函数。

978-7-111-40639-6-Chapter10-137.jpg

这段代码引入了一个新的影片剪辑事件keyUp。当用户释放键盘上的一个键的时候,这个事件发生。需要的效果是,当用户按下向右的方向键的时候,ground是滚动的;当读者释放向右的方向键的时候,ground停止滚动。通过KeyUp事件,就可以检测是否是释放了向右的方向键。

方法Key.getCode()得到最后释放的按键的键码,所以如果最后按下的键是向右的方向键,就把scrollStart设置成false。

接下来要做的就是添加一些代码,当scrollStart是false的时候,地面停止滚动。

978-7-111-40639-6-Chapter10-138.jpg选中mainGround实例,打开它的脚本窗口,当前的onClipEvent(enterFrame)如下:

978-7-111-40639-6-Chapter10-139.jpg

修改它们,修改后的代码如下:

978-7-111-40639-6-Chapter10-140.jpg

978-7-111-40639-6-Chapter10-141.jpg

所做的就是添加了一个if语句,当scrollStart是true的时候移动mainGround。最后,把当前影片的帧频设置成24fps。

现在测试一下影片,读者会发现,当spaceship移动到屏幕三分之一的时候,spaceship停止运动,而地面反而滚动起来,效果就像飞船一直在飞一样。