使用向量来移动
希望你在阅读本节之前,已经阅读了之前的基本章节。此刻,你应该已经知道什么是点,什么是向量,和如何计算向量的各种属性。并且你一直在等待能够亲自动手在一些真实的游戏中使用向量。让我们开始研究下如何使用向量来移动物体。
在这个例子中,红色的点就是我们的对象。通过方向键,你可以改变运动向量的x,y分量。
首先,我们定义一个对象:
myOb={};
myOb.p0={x:100, y:150};
myOb.vx=3;
myOb.vy=1;
对象的起点是x=100,y=150,移动向量的值是vx=3,vy=1。对象的新位置是向量的终点p1,它是在函数updateVector中进行计算的。如果你已经不记得如何查找p1的值,可以在Flash向量-基础知识章节中查找。
在MovieClip正确的放置了以后,我们会把终点p1作为在drawAll 函数中再一次计算位置时的起点。
每次按下方向键,x,y的分量就会增或者减。函数getKeys和releaseKeys处理这一逻辑。主函数runMe在每一帧都会执行,并且它会调用updateVector和drawAll函数来计算新位置并对mc进行定位。并且在这个例子中,你会发现,当对象移出舞台的时候,会重新出现到舞台的另外一边。
记住在进行计算的过程中,永远不要使用MovieClip的_x,_y属性,它应该是在计算过程完成以后,最后一步讲MovieClip放置到正确的位置。
帧还是时间
我们看下函数updateVector是如何找到结束点p1的新坐标的:
var thisTime=getTimer();
var time=(thisTime-v.lastTime)/100;
v.p1={};
v.p1.x=v.p0.x+v.vx*time;
v.p1.y=v.p0.y+v.vy*time;
v.lastTime=thisTime;
Flash是基于帧的程序,它会尽量以帧频的速度来执行所有的动画和脚本。在enterframe里面来处理所有的计算是很常见的,但这事实上并不是很好的方式。假设你写的代码是每一帧让对象的x坐标增加1。如果你将帧频设置为20,那么代码在每一帧里面会执行20次,从而使得对象每一帧移动20的像素。
你大概就是这样想的吧。但事实上,没有flash可以准确的按照帧频来执行。帧频只是flash想达到的最大值,但是通常都做不到。在浏览器中运行的flash比较吃力,因为浏览器本身占用一些cpu,有些计算机本身就比较慢,人们也可能有其他的程序在运行,所有的这些原因都会导致帧频下降20-25%。
“真的是这样吗?”,你可能在怀疑。它还在运行啊,坐标也会计算,MovieClip的位置也会改变的啊。是的,但是你已经失去了对你的游戏的控制了。你无法确保在一段时间之后,MovieClip位置在哪里,它的运动速度如何。如果你的flash是设计成用来测试人们的反应速度的,如果帧频下降50%,那么低帧频的人玩就比正常帧频下玩的人有巨大的优势。这是flash游戏的一种常见作弊方法,你可以很容易的降低帧频,并取得游戏胜利。
解决的办法是不要将计算基于帧数,而是实际的时间。在基于帧的游戏里面,声明速度vx=3意味着MovieClip每次能够执行的时候都会移动3个像素。在基于时间的游戏里面声明速度vx=3意味着MovieClip每秒钟移动3个像素。在基于时间的游戏里面,帧速的下降不会导致不可预知的结果,你仍然可以准确的知道MovieClip在哪里,不论是1秒钟之后,10秒钟之后或者1个小时之后。较慢的帧速在基于时间的影片里面会影响移动的平滑,对象在舞台上被绘制的次数,在每秒钟内会减少,从而导致“跳帧”,但是每一次绘制的时候,它将绘制到准确的位置。
我们使用getTimer函数来计算时间:
var thisTime=getTimer(); var time=(thisTime-v.lastTime)/100;
getTimer函数返回影片从开始到现在的毫秒数。在运动计算的时候,我们需要知道距离上一次计算的时间,所以我们用当前的时间减去上一次的时间。并且因为时间是用毫秒来计算的,我们需要将它除以100来得到秒。当然,你也可以使用 像素/毫秒 作为速度向量的单位,但是注意得出的值将非常的小。
终点的新坐标要根据逝去的时间来计算:
v.p1.x=v.p0.x+v.vx*time;
让我们来试一下到底对不对。加入我们的MovieClip在x=150,y=10的位置,速度为vx=1,如果帧速设置为20,时间间隔的变化,不管是5毫秒还是50毫秒。例如,假设是5毫秒,意味着每次移动的距离为v.p1.x=v.p0.x+0.05,1秒钟内移动20次,移动距离20*0.05=1 像素。也恰恰符合速度v1。再看看假设时间间隔50的情况,MovieClip每秒钟会在舞台上绘制2次,最后的位置是2*0.5=1像素。
你可以下载fla源文件。
加速度
就像速度向量能随着时间改变物体的位置一样,加速度向量可以随着时间改变物体的速度。
我们先将物体的加速度设置为0:
myOb.ax=0; myOb.ay=0;
之后,当方向键被按下的时候,我们就改变加速度向量的x,y分量。在update函数里,我们会把加速度向量,添加到速度向量。使用加速度的时候要小心,如果你不限制速度的话,它会不断的增加下去。
v.vx=v.vx+v.ax; v.vy=v.vy+v.ay;
同样要注意,要想完全停止物体的移动,我们不仅要将速度向量设置为0,还应该将加速度设置为0,否则物体是不会停下来的。
你可以下载fla源文件。

Post a Comment