按键和移动
在这一章中我们将用四个方向键控制英雄的移动。在移动过程中,他会面朝移动的方向,并且会显示走动的动画。一旦他停止移动,动画也会停止。试试这个:
因为没有碰撞检测,所以英雄可以走出舞台外面,不过不要担心这个,我们以后会解决这个问题。
首先,让我们完善英雄角色。建立3个新的mc。我们需要一个mc表示角色向左走(或者向右,我选择了左),一个表示向上走,最后一个朝下走。在这些mc中,做角色走动的动画。
这些mc里不需要写代码。
现在,编辑char影片夹子(mc),在时间线上创建5个关键帧:
在关键帧1放置char_up影片夹子,关键帧2放置char_left影片夹子,关键帧4放char_right,关键帧5放char_down。许多时候向左移动和向右移动只是简单的水平翻转关系,所以你可以用一个mc表示这两个方向的动画。现在确认一下,这几帧动画mc的实例名称都是char,检查每一帧。他们都叫char?是的,不用担心。如果你不理解为什么是这样的排列方式,我们将会在代码的部分讲解这个问题。
ok,该写点代码了。
代码
首先,移动需要有个速度,所以先给英雄添加一个速度属性: char={xtile:2, ytile:1, speed:4};
速度表示英雄每一步移动的象素值,更大的值意味着更快的移动,很小的值将会使英雄像个蜗牛。在这里使用整数是个好习惯,否则你会得到怪异的结果,实际上10象素和10.056873象素之间也看不出什么区别。
你还记得吧,我们创建了_root.char这个对象来保存英雄的信息(如果忘记了,请回头看看)?并且我们把char影片夹子放在tiles影片夹子里面了。为了让我们的英雄醒来并开始移动,我们需要添加两个函数来检查按键和控制mc。拖一个空的影片夹子empty到舞台上。你可以把它放到可视区域外,他只是用来放些代码,所以在哪里都无所谓。在这个mc上面写这些代码(选中mc,然后打开代码面板): onClipEvent (enterFrame) { _root.detectKeys(); }
你可以看到我们在每一帧调用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 和 keyPressed。设置ob变量指向_root.char (记住,那是我们保存英雄所有信息的对象),设置变量keyPressed为false。keyPressed变量用来表示是否有四个方向键之一被按下去。
下面有4个相似的 if 判断,每个 if 都检测相应的键是不是被按下了。如果键被按下,他们就这样调用另外的一个函数moveCha: keyPressed=_root.moveChar(ob,1,0);
这一行调用moveChar函数的时候带了3个参数。第一个参数就是ob变量,就是我们的英雄对象。后两个的取值我们总是让他们为-1,1或者0。这些数字决定对象移动的方向,第二个参数表示水平移动的方向(-1:左;1:右),第三个参数代表垂直移动的方向(-1:上;1:下)。最后我们把moveChar的返回值交给变量keyPressed。 你在后面就可以看到moveChar函数总是返回true, 所以任何方向键被按下后,变量keyPressed值都是true。
现在来看看第二个函数moveChar: 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函数接收了3个参数,变量ob表示要移动的对象,dirx、diry分别表示x、y方向的移动。这是一个很通用的函数,我们可以用它移动游戏中所有东西。例如我们要让子弹飞行,我们就可以调用moveChar函数,同样,我们也可以用这个函数移动敌人。
接下来的两行我们给对象的x和y加上相应的值。同样,如果使用不同的对象(子弹、敌人),这些对象可以有不同的speed属性。所以,当我们检测到右箭头键时,我们调用moveChar函数时的参数是1,0 ,此时dirx=1,diry=0。所以x值会在原来的基础上增加(speed),而y则保持不变。如果我们调用moveChar函数的参数是0,-1(意味着上箭头键),那么y值就会在原来的基础上减小(speed),而x保持不变。
注意,如果我们还有其他的动作,比如碰撞或者跳跃,我们应该将这些动作单独计算。这样比简单的mc.hitTest方法要好不少。
这一句: ob.clip.gotoAndStop(dirx+diry*2+3);
他使得角色mc跳到正确的帧上,让角色面对正确的方向。你可以算出所有的dirx/diry组合(这里只有4种情况),如果你的角色mc时间线是和我们以前所说的设置一样的话,这里就不会出问题。你可以拿计算器算算看:)
没有计算器?那我们还是看看吧:假设按了方向键右,那么 dirx=1,diry=0, 结果 dirx+diry*2=4。那么角色mc会跳到第4帧,那里正好是我们角色朝右走的动画。
接下来的两行,设置角色mc的_x/_y属性的值等于x/y的值。最后,我们返回一个true值,这样keyPressed就得到了正确的值。下一章我们将会介绍碰撞检测,很有趣的哦:)
下载源文件
出处:蓝色理想
责任编辑:qhwa
上一页 英雄/主角 下一页 碰撞检测
◎进入论坛Flash专栏版块参加讨论
|