|
以下是引用片段: //以下代码放到主场景第一帧 stop(); _global.a = 5; //移动加速度,越大越慢 _global.click_x = 0; //用来记录点击鼠标的位置 _global.click_y = 0; _root.onMouseDown = function() { _global.click_x = _root._xmouse; _global.click_y = _root._ymouse; //me是受控mc的instance name me.onEnterFrame = function() { if (Math.abs(_global.click_x-me._x)<2 && Math.abs(_global.click_y-me._y)<2) { //如果已经基本移到了鼠标点过的位置就取消这个事件句柄的响应程序 delete (this.onEnterFrame); return; } else { //控制移动 me._x += (_global.click_x-me._x)/_global.a; me._y += (_global.click_y-me._y)/_global.a; } }; }; //////以下部分可选 //a_v是个可以输入的文本框,用来输入加速度,即可以自定义速度,方便调试 a_v.onChanged = function() { if (a_v.text == "" || Number(a_v.text)>1000 || Number(a_v.text)<0) { //default value a_v.text = 5; } else { _global.a = Number(a_v.text) ? Number(a_v.text) : 5; //trace(_global.a); } };
随机输出1到100而不从复的语句:
seq = new Array(100); pArray = new Array(100); function makeRandom() { for (i=1; i<=100; i++) { seq[i] = "A"; } } function mRandom() { while (true) { n = int(random(100))+1; if (seq[n] == "A") { seq[n] = "0"; break; } } return (n); } function rArray() { for (i=1; i<=100; i++) { pArray[i] = mRandom(); trace(pArray[i]); } } stop();
偷梁换柱
我们可以用这样一个技巧,在某些函数外部加一些东西而不需要了解函数的代码~~
比如,假如当前有很多mc 覆盖了onEnterFrame函数,我们可以这样了解那些在_root下的mc 的onEnterFrame函
数是以什么顺序执行的:
代码:
for(var i in _root){ if(_root[i].onEnterFrame != null){//如果这个Object实现了onEnterFrame接口的话 _root[i].oldFunc = _root[i].onEnterFrame;//首先保存原来的onEnterFrame的句柄 _root[i].onEnterFrame = function(){//然后开始替换了~~加上一层壳~~ trace(this+ ": onEnterFrame Called."); this.oldFunc();//我们用保留的句柄调用原来的函数 trace(this+ ": onEnterFrame Returned."); } } }
如果要取消这些附加的操作:
代码:
for(var i in _root){ if(_root[i].oldFunc!= null){//如果发现改过得痕迹 _root[i].onEnterFrame = _root[i].oldFunc; delete(oldFunc); } }
呵呵这些操作的关键在于 Flash里面的引用机制:
所有函数名都是引用,而函数本身是浮在数据的海洋里面的。如果没有任何变量引用他,他就会被回收。如果有,
他就不会被回收。所以有着样一个有趣的事情:delete函数不会删掉任何东西,除了要求删掉的那个名字:(和java
机制相似,而和C不同)
a= function(){trace("Function a called");} b=a; delete(a);//除了a这个名字被删掉以外,没有任何事情发生 b();
函数通过this得到其调用者的实例。
MovieClipPlus.as
定义了一些简单的MC操作
//画点:由于Flash没有画点,那我们就画短线
MovieClip.prototype.point = OxMovieClipPoint; function OxMovieClipPoint(x, y) { this.moveTo(x, y); this.lineTo(x+1, y); }
//画矩形,左上角x1,y1 右下角x2,y2, 颜色rgb, 不透明度alpha
MovieClip.prototype.rect = OxMovieClipRect; function OxMovieClipRect(x1, y1, x2, y2, rgb, alpha) { this.beginFill(rgb, alpha); this.moveTo(x1, y1); this.lineTo(x1, y2); this.lineTo(x2, y2); this.lineTo(x2, y1); this.lineTo(x1, y1); this.endFill(); } //画圆:这么bt的冬冬当然不是我写的,作者素Jody Keating //圆心x,y ,半径r MovieClip.prototype.circle = OxMovieClipCircle; function OxMovieClipCircle(x, y, r) { var a = r*0.414213562; var b = r*0.707106781; this.moveTo(x+r, y); this.curveTo(x+r, y-a, x+b, y-b); this.curveTo(x+a, y-r, x, y-r); this.curveTo(x-a, y-r, x-b, y-b); this.curveTo(x-r, y-a, x-r, y); this.curveTo(x-r, y+a, x-b, y+b); this.curveTo(x-a, y+r, x, y+r); this.curveTo(x+a, y+r, x+b, y+b); this.curveTo(x+r, y+a, x+r, y); }
两点间的直线移动
var s = 15; _root.onMouseDown = function() { var oldM_x = _root._xmouse; var oldM_y = _root._ymouse; ax = aa._x; ay = aa._y; dis = Math.sqrt((oldM_x-ax)*(oldM_x-ax)+(oldM_y-ay)*(oldM_y-ay)); xa = (oldM_x-ax)/dis; ya = (oldM_y-ay)/dis; amove(); }; function amove() { onEnterFrame = function () { aa._x += s*xa; aa._y += s*ya; if (Math.sqrt((aa._x-ax)*(aa._x-ax)+(aa._y-ay)*(aa._y-ay))>dis) { delete onEnterFrame; } }; }
计算两个对象之间/两点之间的距离(注册点)
function getDistanceOf(target1, target2, x2, y2) { if (arguments.length == 4) { dx = x2-target1; dy = y2-target2; } else if (arguments.length == 2) { dx = target2._x-target1._x; dy = target2._y-target1._y; } return Math.sqrt(dx*dx+dy*dy); }
//Arguments 对象是一个数组,其中包含作为参数传递给任何函数的值。每次在动作脚本中调用函数时,都会为该函
数自动创建 Arguments 对象。同时还会创建一个局部变量 arguments,使您可引用 arguments 对象。
[1] [2] 下一页
|