代码笔记——AS3圆

来源:互联网 发布:骨朵网络影视详情页 编辑:程序博客网 时间:2024/05/16 15:02

参考

http://hi.baidu.com/iamzhangxinxu/blog/item/d4b9f57f1e1b74320dd7da35.html  as3之利用向量实现小球的圆形排列

http://as3.aa-a.net/?p=741  AS3频谱波形的排列

V:\!OMP\2009\080908_【freeplus8】\参考\zszen式连连算法lp

愚蠢但幸運的 as3 http://blog.csdn.net/inshua/article/details/2958534

 getDefinitionByName 是类全名。

反编译问题

用硕思破解后,图片显示不出来。搜索MovieClipLoader找到加载图片的地方。pictureLoader.as加载小图 和 detailViewer.as加载大图。看pictureLoader.as。

依次搜索,找出加载调用次序:
加载完成后,调用 loadControl.as 的 onLoadPicture
->  loadControl.as调用自身的loadNext
-> ringModule.as 的 startLoadPicture
->startLoad 的 的startLoad
->startLoad调用自身的load
只是最后一个image。
在加载的地方,加trace,发现的load()只执行了一次,加载2张图:small/w28.jpg和small/f28.jpg。
觉得这个问题比较生,决定绕过去。在代码还原上,硕思没ASV好,用ASV试试看。

ASV生成文件,CS3打开,提示JSFL参数错误,没用对Flash版本,用CS5试试,打开了。
但是我想用CS3编译。所以先用CS5转CS4,成功,用CS4打开,卡死了。

 v0.0.2——用Imperator破解
用Imperator FLA生成的FLA+ASV的AS,得到的效果:图片有,位置不对。
把AS复制到另一个文件夹,图片,首先要排除图片容器。位于sprite 37 (pictureLoader_people)。
试着在第75行,加了一句trace,trace(loadMov);,就可以读出图片了。
 v0.1.0——合成

读代码

线索1,加载图片

 ->1 图片MC (pictureLoader_people) 第一帧         _parent._parent._parent.joinCueList();
 ->2  ringModule.as:joinCueList       loadControl(_parent._parent.loadCtrl).addToCue(this);
 ->3  loadControl.as:addToCue 
注2:joinCueList没做什么,就是传递调用下一个。
注3:addToCue  是把MC添加到MC数组,在添加到一定量时,开始加载图片。

线索2,加载下一张图片

->1 loadControl.as:onLoadPicture
->2  loadControl.as:loadNext
->3 ringModule.as:startLoadPicture
->4 startLoad:startLoad
->5 startLoad:load

注2:越过onLoadPicture,直接调用loadNext?不行,因为除了加载图片,还有声音,缓冲,计数,这些放在load之外。这些无关紧要。
注2:loadNext中,除了startLoadPicture之外,还有一个Boolean值,计数,
看来作者是C++,有pointer关键字:cueList[pointer],
注3:注意,没有把cueList的计数和总计数放在一起,似乎很谨慎。

线索3,创建MC,排列圆

->1 allRing.as:init
->2 ring.as:startBuild
-->2.1  ring.as:setSelector
--->2.2   分类
---->2.2.1    ringDisc:initRingDisc                             
------>2.2.1.1  ringDisc: makeRandomIndexList
------>2.2.1.2  ringDisc:setTextGradient
--->2.3  ringDisc.as:initRingDisc 初始圆盘
----->2.3.1  初始
----->2.3.2 混乱数组
----->2.3.3  for循环

----->2.3.3.1  初始对象

----->2.3.3.2 创建MC
----->2.3.3.3  记录MC的位置
----->2.3.4  setTextGradient

处理分类数据

注1:传递2个参数,1:数据,2:类别。
注2:

1)整理数据:把传递进来的参数搜罗到自己门下。得到数据总长n。指定this代理。

2)调用setSelector
注2.1:setSelector,设置所选。

细节:用onEnterFrame,执行一遍,立即删除。原因:可能是时间轴和代码的前后顺序有偏差。才这么做。
onEnterFrame中,做了2件事,1是数据层提取数据,2是渲染数据。

1:解析数据

数据层:根据类别,分开数据,保留自己的数据,变量selectorData,

 ->1 entry.xml:people/selector/category数组,3类
        entry.xml:work/selector/category数组,5类
 ->2 根时间轴第2帧: _global.selector_people
                                       _global.selector_works
->3 ring:setSelector   自己的数据,selectorData

2:显示数据

渲染层:将显示各自MC。

遍历5(0-4),判断title节点是否为undefined。像people分支到了3,title节点就是undefined,跳出遍历。
分类功能是细节,之前没注意。

注2.2:根据分类做3件事,

1:指定另一个(自己是people,另一个就是work....),

2:显示对应标题(people还是work),

3:指定旋转方向,2个相反,一正一负。

 

2.3 初始化圆盘(ringDisc.as:initRingDisc)

2.3.1 初始

目的:父的类型,半径,方向,总长,先据为己有。

2.3.2 乱序数组

makeRandomIndexList意思就是makeRandomArray,这样算的:

把从0到n的整数依次赋值给数组的随机地址。
比如,先指定0,从n个整数中随机取一个,如3,arr[3]没指定,arr[3]=0;
再指定1,随机,假定取到7,而arr[7]没指定,则arr[7]=1;
再指定2,随机,假定取到3,但是arr[3]指定了,就继续随机,第2次取到5,则arr[5]=2;
....

以此类推,最后指定n,arr[n]=16;

改成静态方法:

class wj3.utils.uArray {public function uArray() {}static function makeRandomIndexList(n:Number):Array {var out:Array = new Array(n);for (var i:Number = 0; i < n; i++) {while (true) {var j = Math.floor(Math.random() * n);if (out[j] == undefined) {out[j] = i;break;}}}  return out;}}
调用:
import wj3.utils.uArray;class Main extends MovieClip{public function Main() {var indexList:Array = uArray.makeRandomIndexList(28);trace(indexList);}}

这个算法好理解,可改成C++。

 

2.3.3  for循环

初始对象

1)声明对象MCdata,用来初始。
2)得到随机数,用到刚才的随机数组。目的是每次打开Flash,圆上图片的排列位置都不一样。
3)MCdata.focusID,是索引ID。
4)MCdata.dataObj,自己对应的数据。对于works下的if (_local2 != 0)很费解,因为2个内容一摸一样。
5)MCdata.dataType,父类型

6)MCdata.r,自己在圆上的位置。

创建MC,排列圆

7)MC=attachMovie,MCdata用作最后一个参数——初始对象。
8)MC.set._x=radius,好高妙。负负得正。这样就不用sin和cos的圆形排列。优点和缺点。
9)记住,自身旋转和图片旋转正好相反。

记录MC的位置

10)后续工作:1和2:将旋转位置存在  r_list数组 和 defR_list数组。
                             3和4:将角度步长存在 d_list数组 和 d_list0数组。 0表示原始数组,不做变化。
                             5:把MC存在MC数组。

这段代码改成:

import wj3.utils.uArray;class ringDisc extends MovieClip{public function ringDisc() {}public function initRingDisc ():Void {var n = Data.n;var indexList:Array = uArray.makeRandomIndexList(n);var radius = Data.radius;var r_list:Array=[];var defR_list:Array=[]; var d_list:Array=[]; var d_list0:Array=[]; var dataObj = { };var dataType = "";var mcList = [];for (var i:Number = 0; i < n; i++) {var obj = {};var j = indexList[i];obj.focusID = i;switch (dataType) {case "people" : break;case "works" : break;}obj.dataObj = dataObj[j];obj.dataType = dataType;obj.r = (360 / n) * i;this.attachMovie("ringModule", "mod" + i, i, obj);trace(this["mod" + i]);this["mod" + i].MCset._x = radius;this["mod" + i]._rotation = -obj.r;r_list[i] = obj.r;defR_list[i] = obj.r;d_list[i] = 360 / n;d_list0[i] = d_list[i];mcList[obj.dataObj.id] = this["mod" + i];}}}


注42:ringDisc:setTextGradient,Gradient有2种翻译,1:渐变,2:角度,目的是让type.gotoAndStop某一帧。
打开Flash原文件,舞台是2个文本框,共32帧。1-9帧:文本框做了动画,但实际没变化,10-32帧:空白。发布,圆在旋转时,文本框没变化。
推断:反编译不全,打开原始swf,播放,发现,圆在旋转时,文本框没变化。效果一样。
推断,这是废代码,无实际用途,作者没删除。
90%的可能是设置文本渐变,但效果不大好,所以直接改时间轴,没改代码。
10%的可能是旋转,因为未见给文本框加旋转动画,效果不好。
for循环,可写成:

var n=28;var focusNum=0;for(var i=0;i<n;i++)  {    var f = ((focusNum - i) + (n * 10)) % n;        trace(f);    f = Math.min(f, n - f);    trace(f + 1);}
第1次输出f:0,27,26,25...1             

第2次输出f+1:1,2,3,......13,14,15,14,13,.....4,3,2                    

f:0.1,2,3,4,5,6,7,8,9,10,11,12,13,14,13,12,11,10,9,8,7,6,5,4,3,2,1

第1次:0,27到0的降序排列。
第2次:0->14->0,注意14=28/2>

功能是输入值focusNum,从focusNum开始,一半升序,一半降序。

用途很费解,先放一边。


线索4,按钮事件触发旋转

调用顺序:
 ->1   (pictureLoader_people) : 按钮 on (press)   触发事件
 ->2   ringModule.as:doAction 将ID传给函数
 ->3   ring.as:startFocus 旋转
 ---->3.1    ringDisc.as:setFocus 旋转各个之间
------->3.1.1   ringModule.as:doAction
------->3.1.2   setTextGradient
------->3.1.3    ...
------->3.1.3.1    shiftLoop

---->3.2  setRotation 旋转函数

1. 触发事件

注1 :爆出事件click。调用父MC.doAction()。注意,如果改成事件做,必须加上ID值,而且接收只能有一个。

2.将ID传给函数

注2:将自身ID,即focusID,传给圆的父。

3.旋转

注3:startFocus中,focus0和focus仅在ring类使用。2个变量,原封不动,传给整个圆。
注4:setFocus中,
1)做了大小限制,超出还原,负值取正。这说明有超出的时候。
2)模式,click线索没有第3个参数,用默认模式。shirink_back,回缩。
3)viewMode,默认。pow,默认,12。注意,这里的pow,不是平方的意思。

4)给新旧MC做跳帧动画。加判断,如果新旧ID不相等,新ID代表的MC聚焦,旧ID代表的MC不再聚焦。

在加文本框,变量框写_parent._parent._name,观察其值。


注41:控制图片方块,跳帧动画。
注42:没用的函数。

2. 得到目标角度 toR_list

注4 ...:3个for循环,得到目标角度。

目的:算旋转角度,得到目标角度数组。
1)for循环,
目的:计算角度步长:
条件:d_list数组,d_list0 数组,
如果是当前值,以及当前值的下一个值。步长=原始步长+6。效果就是角度放大。
如果是正常,步长=原始步长-12/46。效果是角度略微缩小。
2)for循环,
目的:算出角度数组。
操作:toR_list。
将toR_list[0]=0;再做for循环,排除掉0。 d_list得到是单个MC的角度步长,toR_list得到MC在上个MC的叠加角度。
3)
目的:算出旋转角度。
defR_list是默认全局角度,也就是上次的全局角度。用这次的全局角度减去上次的全局角度,得到要旋转度数。
4)做for循环,
目的:算出目标角度数组。
遍历toR_list,在每个值上加旋转度数。

2:
toR_list:-5.53846153846154,6.85714285714286,25.7142857142857,44.5714285714286,56.967032967033,69.3626373626374,81.7582417582418,94.1538461538462,106.549450549451,118.945054945055,131.340659340659,143.736263736264,156.131868131868,168.527472527473,180.923076923077,193.318681318681,205.714285714286,218.10989010989,230.505494505495,242.901098901099,255.296703296703,267.692307692308,280.087912087912,292.483516483517,304.879120879121,317.274725274725,329.67032967033,342.065934065934

toR_list:-5.53846153846154,6.85714285714286,25.7142857142857,44.5714285714286,56.967032967033,69.3626373626374,81.7582417582418,94.1538461538462,106.549450549451,118.945054945055,131.340659340659,143.736263736264,156.131868131868,168.527472527473,180.923076923077,193.318681318681,205.714285714286,218.10989010989,230.505494505495,242.901098901099,255.296703296703,267.692307692308,280.087912087912,292.483516483517,304.879120879121,317.274725274725,329.67032967033,342.065934065934

缓动动画

注5:2个for循环:
1)for循环,执行旋转目的:旋转MC。
细节:将圆中的每个MC旋转,而不是旋转整个圆。
r_list 最先在创建MC时赋值,前面算角度,没动过,保留原始旋转位置。
r_list[i] = ((r_list[i] * a) + toR_list[i]) / (a + 1);
可以看作
b=(b*a+tar)/(a+1);
缓动公式,具体是用哪个公式,不清楚。
其中,a是常量2,大意是:先将旋转放大2倍,再加上旋转度数,并除以3。

让MC的旋转等于负值,这一点和初始时相同。this["mod" +i]._rotation = -obj.r;
2)旋转结束,for循环。
目的:旋转结束。gosa ,日语 ごさ ,误差,常量0.1。
细节:判断结束时,不是判断每个MC是否到达目标值,只以目标MC为准。一旦目标MC到达目标值。就让每个MC位置都等于目标值。
将当前的旋转值和的目标旋转值比较,如果接近目标旋转值,就delete EnterFrame。
这段代码可以简单成:

var mc:MovieClip= _root.createEmptyMovieClip("1",1);mc.beginFill(0xff0000,100);mc.moveTo(0,0);mc.lineTo(0,100);mc.lineTo(100,100);mc.lineTo(100,00);mc.lineTo(0,0);mc.endFill();var a=2;var b=0;mc._x=b;var tar=200;onEnterFrame=function(){b = ((b * a) + tar) / (a + 1);mc._x=b;if(Math.abs(b-tar)<0.1){mc._x=tar;delete onEnterFrame;}}


3.2  setRotation 旋转函数


//var cc:Color = new Color(bg);
//cc.setRGB(data.button.heightLightColor);


网站:http://www.rouge-automatique.cn.com/guerlain/file/lvmhminisite/rouge_automatique/zh/#/le_geste/

诊所消毒用蒸馏水机/纯露机/上海产/送活性炭和锅架及各种礼品

http://item.taobao.com/item.htm?id=9296096127

乐溪家用净水器 净水机自来水过滤器 直饮
http://item.taobao.com/item.htm?id=10263226905&ali_refid=a3_420434_1006:1103428255:6:%D5%F4%C1%F3%CB%AE%BB%FA:0b804a307e5fea2b13da63b346db2408&ali_trackid=1_0b804a307e5fea2b13da63b346db2408

原创粉丝点击