|
etectKeys这个函数。现在写这个函数: 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就得到了正确的值。下一章我们将会介绍碰撞检测,很有趣的哦:)
下载源文件
碰撞检测
像上面这个,英雄可以穿墙而过,那就没什么意思了。我们要想办法让英雄感受到障碍物的存在。
在第一章中,我们给每个方块都设置了一个“walkable”属性,当某个位置方块的walkable属性是false的时候,英雄就无法穿过它。当值为true的时候,英雄就可以从上面走过(这个东西叫做“逻辑”:)。
为了让这个逻辑起作用,我们将会这样做: 当方向键被按下以后,我们首先检查下一个方块是不是可通行的。 如果是,我们就移动英雄。如果不是,那么就忽略掉按键事件。
这是完美的墙的碰撞:
英雄贴着墙站着,而且下一步他就会进到墙里面。我们不会让它发生的。

但是这个世界总是不够完美,要是英雄只和墙接触一部分呢?

这就要求我们检测英雄的全部四个角是否和墙接触了。只要任意一个角和墙接触(上图中是左下角),移动就是不合理的。
或者,英雄没有贴着墙站,但是下一步就要跑到墙里去了,虽然只是一部分:

我们不得不让他这样贴着墙站着:

“这么难?!”,你也许会喊,“不太可能办到吧?”不用担心,实际上很简单的~
检查四个角
我们不希望英雄的任何一部分能进到墙里面去,只要四个角没有进去就行了,这是假设英雄的大体形状是个长方形(他们确实是的)。
为了实现这个功能,让我们写个函数:getMyCorners function getMyCorners (x, y, ob) { ob.downY = Math.floor((y+ob.height-1)/game.tileH); ob.upY = Mat 上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >> |