Flash 特效制作常用的源代码放送(2)
*鼠标消隐
鼠标消隐之后,右健弹出菜单,鼠标就又出现了,并且一直保留着~完整的解决方法是:在 左健抬起,右健第二次抬起,回车键抬起的时候再次消隐鼠标。完整的方法比较复杂,下面是一个简单的解决方法,可以解决绝大多数的问题:
onEnterFrame=function(){
if(Key.isDown(1)|| Key.isDown(Key.ENTER)){
Mouse.hide();
}
}*我常用的一个加速度移动的代码
以下是引用片段:
//以下代码放到主场景第一帧
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);
}