Flash 游戏制作教程 <四>
作者:jack 日期:2006-04-16
Tile Based Games 4.1
by TONYPY 翻译: jackgun_at_126.com
移动与控制 ( Keys to Move )
在本章,我们将使用 4 个方向键来控制我们拉主角移动。它的脸会向着移动的方向、移动的时候显示走路的动画、静止的时候显示站立的姿势。这里试试看:
它还没有碰撞检测,所以主角可以到处走,甚至跑到舞台外面去,但别担心,关于这个问题我们将在下一章解决。
首先设计主角的特性。在主角 char 的 movie clip 里创建 3 个 movie clip 。你将需要一个主角向左移动时动作的 movie clip (或者向右,我选择向左), 一个向上移动动作的 movie clip ,和一个向下的。 并在这三个 movie clip 里制作相应的动画。

这些 movie clips 都不需要加代码。
现在,编辑你的 "char" movie clip ,在里面创建 5 个关键帧:

在第一个关键帧放置 "char_up" movie clip,在第 2 个关键帧放置 "char_left" 的movie clip ,第4 帧放"char_right" ,第 5 帧放 "char_down" movie clip。 你可以在这几个关键帧里做些一个主角移动的动画。现在把每一帧里的 movie clip 都命名为 “char” (实例名),检查一下,一共是 1, 2, 4 和 5 帧。也许你会奇怪了,实例名都是 "char" 啊?先别懊恼,我们会在讲解代码的时候再来弄懂它。

Ok,下面是 action script 时间。
代码 ( Coding )
我们的主角移动的时候需要速度,所以要加上 speed 属性到主角对象里面:
char={xtile:2, ytile:1, speed:4};
Speed 是一个数字值,表示我们的主角每次在屏幕上要移动多少个像素,这个数字的高低与主角在屏幕上移动的速度成正比。这个数字的实际值需要你多加实验和调整,找出你习惯的速度,看看 10 个象素和 10,056873 能否看出区别什么的。
你还记得 (如果你忘了,回到前面的章节复习一下吧), 我们已经创建了对象 _root.char 及它的属性,并且我们也反 "char" movie clip 放到 "tiles" movie clip 里去了。在唤醒我们的主角,并让它动起来之前, 我们需要两个function 和一个 movie clip “controller” 用于检查键盘按下的情况。
从组件库里把组件 "empty" movie clip 拖到舞台上来。 回为这个 movie clip 是空的,我们只调用它里面的 function 用于控制,它并没有可见的东西,你可以把它放到舞台有效区域之外。 我们在这个 MC 上加上如下代码:
onClipEvent (enterFrame) {
_root.detectKeys();
}
上面代码的意思是,我们在所有的帧都会调用一次 function detectKeys 。
先来看一下:
function detectKeys() {
var ob = _root.char;
var keyPressed = false;
if (Key.isDown(Key.RIGHT)) {
keyPressed=_root.moveChar(ob, 1, 0);
} else if (Key.isDown(Key.LEFT)) {
keyPressed=_root.moveChar(ob, -1, 0);
} else if (Key.isDown(Key.UP)) {
keyPressed=_root.moveChar(ob, 0, -1);
} else if (Key.isDown(Key.DOWN)) {
keyPressed=_root.moveChar(ob, 0, 1);
}
if (!keyPressed) {
ob.clip.char.gotoAndStop(1);
} else {
ob.clip.char.play();
}
}
首先我们声明两个变量,我们设变量 ob 的值为 _root.cahr (记得上一章我们提过关于主角的其它内容放到后面再说的吗?) 和逻辑变量 keyPressed 的值为 false 。变量 keyPressed 我们用于保存键盘上方向键是否被按下的逻辑值。
接下来我们用 4 个类似的条件判断来检测 4 个方向键是否被按下。如果这几个方向被按下则用下面语句调用另外一个 function moveChar:
keyPressed=_root.moveChar(ob, 1, 0);
这个调用 function moveChar 的语句使用了 3 个参数。第一个码数是变量 ob , ob 指向我们的主角 char 对象。后面两个参数的值只能被设为 –1, 1 或 0。这两个参数向 function moveChar 传递主角移动的时候是否改变它横向 x 坐标 (第二个参数) 或改变垂直坐标 y (第二个参数)。 最后,我们设置 function moveChar 的返回值返回给变量 keyPressed。 你马上会发现这个 moveChar function 总是返回 "true" 值,所以当任意一个方向键被按下旰, keyPressed 就会得到返回值 true 。
最后的一段条件代码,如果变量 keyPressed 是 false,说明没有方向被按下,这时 char 中的主角行走的动画被使用 gotoAndStop(1) 来停止。如果变量 keyPressed 仍然为 true,我们则继续 play 主角行走的动画。
现在看第二个 function:
function moveChar(ob, dirx, diry) {
ob.x += dirx*ob.speed;
ob.y += diry*ob.speed;
ob.clip.gotoAndStop(dirx+diry*2+3);
ob.clip._x = ob.x;
ob.clip._y = ob.y;
return (true);
}
看,moveChar function 要接收 3 个参数,变量 ob 是将要被移动的对象的 movie clip , dirx 和 diry 是 x 和 y 方向的移动量。 这是一个非常普通的 function, 我们可以用它来移动游戏里的每样东西。无论是子弹飞行还是敌人的运动,我们都可以用 moveChar function 来移动它们。
接下来的两行利用 ob.speed计算并添加 ob 对象的 x 和 y 值。 用样,如果我们还有其它的对象(子弹,敌人),它们都会有自己的 speed。所以,当我们按下右方向键调用 moveChar function 并传递参数 1, 0 时, function 内 dirx=1 和 diry =0。现在 x 将被加上一个 speed 而 y 则没有变化。如果我们用参数 0,-1 来调用 moveChar function (向上方向键被按下),则 y 被减掉一个 speed 而 x 值不变。
注意,到我们有更多的细节动作动画的时候,如:碰撞或重力什么的。我们就可以更精确的计算 x 和 y 的值。这样所控制的 movie clips 会更加真实,比使用简单的 mc.hitTest 方法好多了。
这一行
ob.clip.gotoAndStop(dirx+diry*2+3);
把相应的性质传给 movie clip。就是说,让 movie clip 停到相应的前进方向的帧。你可以将 4 个方向
的各个 dirx和diry 的变化值代入上面的代码中作实验,看看 movie clip 是否停在正确的帧。当初我就是这样调试的。
有计算器吗?如果它还能用的话:右方向键被按下时, dirx = 1, diry = 0。找到这一帧。diry * 2 = 0. dirx + 0 + 3 = 1 + 3 = 4。 应该跳到第 4 帧,并且第 4 帧舞台上放的应该是 char_right 这个 movie clip 。
按下来的两行将主角的 _x或_y 值设为本 mc 变量 x或y 的值。
最后,我们返回值 "true" ,这个值返回给先前的 keyPressed 变量。
下一章我们讲碰撞,将会很精彩 J
你可以点这里下载本章的源文件。
下一章:碰撞检测 ( Hit the wall )。
上一篇
下一篇

文章来自:
Tags: