动作是个特殊的可以附上实体的函数:玩家,电梯,妖怪,武器等等。你可以把动作附上任何实体:模型,精灵,地形。所有的动作在Wed的动作列表的脚本中创建,就象下面:
来看看函数和动作的区别:
一个动作和一个函数有相似的定义,来看个例子:
action add_numbers
{
b = a + 5;
}
function add_numbers( )
{
b = a + 5;
}
看起来确实很象,但是这有个很大的不同:
-函数在我们想运行时要调用
-动作要附在实体上如果我们想让它运行。
动作只有在你想改变实体的属性时才使用;而我们使用函数不需要处理实体(比如,当你想加入数字,就像我上面的例子)。
准备好了吗?启动Wed并打开work10关卡:
立刻运行关卡:
飞机开始旋转!如果你已经学习了第8课你会知道飞机改变了它的pan角度。
来看看相关的脚本,启动Sed打开script10:
你注意到这些脚本随着我们学习更多而变短了吗?可能最后一个教程只包含一行代码,谁知道呢……
大部分代码可以容易理解因为我们见过几次了。我们集中学习用于飞机的代码。
我们已经创建了叫rotate_plane的动作所以它的名字会出现在Wed的动作列表中。但是这个动作列表是什么并且在哪里看?
在Wed中选择飞机模型在顶视窗,右击并选择属性:
点击“行为”并“选择动作”:
你会看到“选择动作”窗口,它允许我们选择在脚本中创建的动作:
我们只有一个rotate_plane动作在列表中。回到代码:
action rotate_plane
{
while (1)
{
my.pan = my.pan + 1;
wait (1);
}
}
一些动作或函数需要很大的时间段来运行-其中一些可能丛我们启动游戏到结束都运行!如果你想创建一个游戏看起来象扫雷艇,你要保证你任何时候都可以移动鼠标,否则你无法点击正方形,不要说你不会点右上角的"x"来结束游戏。所有的函数和动作到现在为止都很好但不是总在运行。它们执行一会然后停止。飞机总是在旋转,因此我们应该用一些指令来保持一个动作始终运行。
我们需要学习如何使新东西工作:while (1)循环。什么是循环?看下面:
while (some condition is true)
{
// repeat the instructions that are placed inside the curly brackets
}
上面的动作使用while (1),意思是始终循环。OK,动作里面的第一行rotate_plane说明需要循环的实体,但循环里面是什么?只有两行:
my.pan = my.pan + 1;
wait (1);
第一行给飞机的水平角度加1。飞机以水平90度开始然后被设为91,92……因此飞机会在水平面旋转。
但是"wait (1);"是什么?我先问你一下:听过多任务吗?这是同一时间可以运行多个程序的能力。现在你在阅读工程,可能你还在听音乐,可能杀毒软件还在运行……所有这些软件都在同一时间运行因为电脑丛一个任务到另一个任务转换非常块,使你相信所有的程序都在一起运行。
同样的事情发生在while循环中。它们要允许动作和函数运行完了休息下。一个while循环如果一直循环不停止将会吃掉所有的电脑资源,因为它要重复不停的循环,甚至系统无法刷新时间!
那么我们怎样暂停一个循环?最简单的方法是插入"wait (1);"指令,每帧运行到这里会暂停一下。这个小变化允许其他动作和函数运行它们的代码。
来讨论下帧和帧速。你在显示器上看到的不过就是一系列连续的画面。如果你的PC可以每秒显示50副画,它就能运行游戏每秒50帧。那么帧速就是50fps。一个wait (1)指令告诉函数或动作当PC显示50副画中的一幅时停止运行。
重要提示:每个while (1)循环都应该包含一个指令打断它,正常是用"wait (1);"。如果你忘了加"wait"或"sleep"在while循环中,引擎会给出一个错误消息象这样:
读手册的第二部分"C-Script keywords"来学习更多关于"wait"和"sleep"。
来创建一个新鲜的动作,复制粘贴下面的代码到你的script10文件:
action change_roll
{
while (1)
{
my.roll = my.roll + 1;
wait (1);
}
}
结果看起来是这样:
保存脚本,选择Wed,右击顶视窗加入一个新的战斗机(mig)模型:
确保新模型可以简单的看见。选择适当的位置。你不知道怎么做?
摄像机(我们在3D世界中的视窗)可以用C-Script指令控制,但为了简单我现在不写代码直到你学到一些新东西。摄像机在它自己的位置上。当我们允许发生时什么出现了?它选择出现在原点。
x = 0
y = 0
z = 0
来看看下面的图片,是Wed中的摄像机位置:
摄像机看起来往右,因此我想放个新的看的见的物体在关卡中,它的X应该大于0。看下初始的图片,看我如何选择飞机初始的位置:
看下顶视窗,很清楚玩家会看到飞机模型。如果你已经设置了适当的位置在Wed的顶视窗那么你唯一要注意的是可以在后或左视窗中设置的飞机的高度。我鼓励你增加第二个飞机模型象下面:
第二个模型(红色的)有一个比第一个模型大点的X和稍微大点的Z。如果你不能放它到正确的位置,右击并选择它的XYZ值。
点击“世界位置”如果你需要,这是配合“真实”3D世界的。现在点击“物体属性”窗口中的“行为” 标签再点“选择动作”按钮:
你会看到“选择动作”窗口和两个动作再列表中:
(如果动作change_roll没有出现在列表中是你忘了保存修改后的脚本文件。保存它再载入work10)
点change_roll选OK,给你一个大的拥抱:你已经分配了一个新的动作给第二个飞机模型。动作的名字是change_roll:
关闭“物体属性”窗口,保存关卡,组建,运行,你会看到下面的图片:
这就是旋转的效果!你可以移动飞机到左或右如果你不喜欢它的位置。改变X和Y值在Wed的顶视窗中,设置一个不同的Z值在后视窗中。
我鼓励你加入第三个飞机模型和一个新的动作改变它的倾斜角度在循环中。别看下面的解决方案-我会看着你的!