武斗火柴人格斗论坛

首页 » Stick Animation Class » 主题讨论 Topic DIscuss » [讨论] 关于AS的移动缓冲
solo - 2008-3-8 1:08:00
(此篇心得针对是AS初级以上, 中级以下, 初学仅供参考. 本人AS属于基础型, 中下.)

最近在设计武斗的首页, 经过了一番思考确定首页要使用Flash, 并且是整合型的页面. 
即一个flash页面可能是 5000*5000 的大小(或者更大), 然后通过鼠标拖拉达到移动的效果.

拖动不难, 新建一个鼠标侦听, 然后
MouseDown > StartDrag(_root)       
MouseUp, StopDrag()
但这样的效果偏硬, 在网上我们常能看到缓冲效果的源文件, 其实要达到缓冲有很多方法, 那么当你没有参考源文件的时候你要如何制造缓冲效果?



目前我只会用简单的加减来制造缓冲,  如: _root._x=_root._x+i ;      _root._x= _root._x /i
通过简单的加减同样能达到缓冲效果, 而且容易理解.

而这次针对单帧页面的缓冲效果是我之前所没有尝试过却一直想实现的效果.

我的思路如下:"    (注意: 此次讨论重点不是在于AS的缓冲, 而是一种思考的方式, 根据自己的所能达到目的的思路)

1: 首先要理解画面的缓冲有什么参数,  a: 时间  b: x轴与y轴的移动距离  c:通过以上参数获得x轴速度以及y轴速度.
    并且有一点很重要, 那就是缓冲时的初速度, 该速度就是我们拖动场景放开瞬间的速度.

2: 在鼠标Down和Up的时候, 就要获得相应的 初/末 变量(时间和位移), 如物理上的初速度与末速度



3:  鼠标的Down 和UP 只是一个行为动作, 并且是一次性的, 所以通过获得以上的参数, 然后相减, 就可以获得 时间位移



上图lencex .y 代表的是位移的距离, 就是我们拖动场景的有效距离, 除以时间我们就能得到 x轴与y轴的速度 speedx y ,
由于getTimer() 获得的是毫秒数1秒=1000 ,  除以50并不代表要做什么单位, 只是一种可调整的值罢了, 速度或快或慢, 根据需要进行变化.
通过int进行取整, 否则将会有未知的小数点数, 影响计算速率.


4:  通过以上方式我们就获得了缓冲必备的一个初速度 (希望你具备一定的物理知识) , 由于区分x轴和y轴, 所以方向也有了.
    接下来就是进行移动的缓冲了.

由于单帧, 所以必须添加一个 onEnterFrame=function() {  }  进行每帧的移动计算.
达到缓冲无非就是让速度递减, 递减的方式很多, 我也做了不少尝试, 当一个不行就换另一个, 没达到效果就调整参数.

距离移动基本公式: _root._x=_root._x+speed    通过使speed递减 就能达到缓冲效果.
我试用了几个递减公式结果都没达到效果 这里就不列举了:

最后我选择的是这个公式 :  speed=speed*0.9        速度乘以0.9 , 就是以每帧减10%速度进行移动.  最后使speed=0.13648723491 (小于1的数)
同样为了避免过多的未数, 使用了  speed=int(speed*90)/100      这里为什么要乘以90再除以100呢? 其实结果是保留小数点后2位, 因为我不知道保留小数点的公式是什么, 所以我就用这种方式替代, 这就是一种变换的思路, 山不转路转!!



一个场景拖动缓冲就这样搞定了, 然而今天你要学的并不是这个缓冲, 而是这种思考方式:
要达到目的A, 需要具备什么条件或参数BCD, 然后达到效果需要什么方法E, 方法需要由什么来实现F, 寻找之间的冲突和关系,并进行可变参数的调整GHI, 当在操作的过程中遇到新的问题J, 那么静下心来重新理清下思路和全局参数,并逐步完善Y!


这篇文章对很多人而言很难理解, 但当你接触的深了, 再回过头来看的话, 你会有些收获的!


复制以下代码到你场景的第一帧试试!

var mous:Object = new Object();
mous.onMouseDown = function() {
startDrag(_root);
time0 = getTimer();
x0 = _root._x;
y0 = _root._y;
speedx = 0;
speedy = 0;
};
mous.onMouseUp = function() {
stopDrag();
time1 = getTimer();
x1 = _root._x;
y1 = _root._y;
lencex = x1-x0;
lencey = y1-y0;
time = (time1-time0)/50;
speedx = int(lencex/time);
speedy = int(lencey/time);
};
Mouse.addListener(mous);
onEnterFrame = function () {
_root._x = _root._x+_root.speedx;
_root.speedx = int(_root.speedx*90)/100;
_root._y = _root._y+_root.speedy;
_root.speedy = int(_root.speedy*90)/100;
};
stop();



如果你有其他关于缓冲的效果AS, 发上来和大家一起分享分享吧!!
逍遥鱼鱼 - 2008-3-8 8:56:00
:Yoci10: 一点也看不懂滴说。
091531 - 2008-3-19 9:02:00
看来要加把油学习了
自由闪动 - 2008-3-20 11:29:00
不理解老大想要做个什么效果?
小叶子 - 2008-3-23 11:46:00
……没跟得上,炮炮龙,看你的了~
YU_CT - 2008-3-23 14:10:00
:Yoci6: 勉强看懂点点...
明日闪客 - 2008-3-23 16:34:00
基本上可以断定,我是AS白痴
pop2 - 2008-3-26 23:55:00
as我初级到只会编程按纽,连接的,Yoci2:
要想做那一系列的效果不进修as看来是不行了·!:
BMW530i - 2008-3-29 21:11:00
这个好象还能看懂点,不过重要的不是那些AS代码,而是那段红字!:Yoci42:
asd - 2008-3-30 0:44:00
鼠标缓动效果么?

那段红字很迷茫啊,是要做游戏么?
solo - 2008-3-30 1:10:00
不~ 应该理解为处理问题的思考/解决方式~
solo - 2008-3-30 1:11:00


引用:
原帖由 BMW530i 于 2008-3-29 21:11:00 发表
这个好象还能看懂点,不过重要的不是那些AS代码,而是那段红字!:Yoci42: 

恩~ 看到重点了!!
burrow147965 - 2008-4-19 19:28:00
看完想晕的说~~~:Yoci3:
炮炮龙 - 2008-4-24 0:53:00
老大,偶先放一放,动作还没学好呢。:Yoci3:
flashnewcommer - 2008-4-24 3:40:00
:Yoci3: 看的晕啦!
yu285509945 - 2008-4-24 22:15:00
看的晕?说明你已经完全理解了...............
战列巡洋舰 - 2008-5-25 20:42:00
不懂
一亩良田 - 2008-7-5 11:36:00
复制下来...等到以后回过头来看..看看有什么收获:Yoci11: :Yoci11:
daodaopp - 2008-8-6 12:38:00
楼上的说得好啊!先存起来!等差不多了再拿出来看
无道刃 - 2008-8-21 22:54:00
:Yoci9: 好悲哀啊~~对我来说这些字简直是火星问,完完全全看不懂的说
genlu2008 - 2008-12-3 1:10:00
我ye  是AS白痴:Yoci10:
1
查看完整版本: [讨论] 关于AS的移动缓冲