Flash 游戏制作教程 <四>

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 个方向
的各个 dirxdiry 的变化值代入上面的代码中作实验,看看 movie clip 是否停在正确的帧。当初我就是这样调试的。

 

有计算器吗?如果它还能用的话:右方向键被按下时, dirx = 1, diry = 0。找到这一帧。diry * 2 = 0. dirx + 0 + 3 = 1 + 3 = 4 应该跳到第 4 帧,并且第 4 帧舞台上放的应该是 char_right 这个 movie clip

 

按下来的两行将主角的 _x_y 值设为本 mc 变量 xy 的值。

 

最后,我们返回值 "true" ,这个值返回给先前的 keyPressed 变量。

 

下一章我们讲碰撞,将会很精彩 J

 

你可以点这里下载本章的源文件。

 

下一章:碰撞检测 ( Hit the wall )

 




文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: Flash 游戏 制作 教程
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.