自编常用AS30速查实例.docx
- 文档编号:30035562
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:131
- 大小:182.09KB
自编常用AS30速查实例.docx
《自编常用AS30速查实例.docx》由会员分享,可在线阅读,更多相关《自编常用AS30速查实例.docx(131页珍藏版)》请在冰豆网上搜索。
自编常用AS30速查实例
stage侦听事件与mc侦听事件:
(1)stage.addEventListener(MouseEvent.CLICK,f);
functionf(e:
MouseEvent):
void
{
mc.x+=5;
}
核心功能:
单击舞台上任意位置小球能移动
(2)this.addEventListener(MouseEvent.CLICK,f);
functionf(e:
MouseEvent):
void
{
mc.x+=5;
}
核心功能:
单击舞台上任意位置小球不再移动,只有单击小球它才会移动.有趣的是,此时click舞台上的其他影片剪辑对象(其他类型对象则不会)mc也会移动。
这说明this并不是指stage,而是指stage上与mc同类型的一切对象。
若将mc.x换成e.target.x(注意e是function里面的那个参数),则单击哪个对象哪个对象移动。
即:
this.addEventListener(MouseEvent.CLICK,f);
functionf(e:
MouseEvent):
void
{
e.target.x+=5;
}
注意:
为了给target赋予一个变量,通常e.target.x+=5是分两步写的的:
varmc1=e.target
mc1.x+=5
圆的数学算法:
stage.addEventListener(Event.ENTER_FRAME,f);
functionf(e)
{
varmc:
Mc=newMc();
addChild(mc);
vart:
Number=360*Math.random();
mc.x=stage.stageWidth/2+100*Math.cos(t);
mc.y=stage.stageHeight/2+100*Math.sin(t);
}
核心功能:
(1)以舞台中心为圆心绘制一个半径为100的圆;
(2)圆的参数方程为
mc.x=a+r*Math.cos(t);
mc.y=b+r*Math.sin(t);
若两式中的r不相等,则绘制出来的就是一个椭圆。
月光宝盒:
importflash.events.MouseEvent;
importflash.display.MovieClip;
varn0:
Number=0;
vara0:
Number=0;
varb0:
Number=0;
gai.x=stage.stageWidth/2;
gai.y=stage.stageHeight/2;
gai.addEventListener(MouseEvent.MOUSE_DOWN,down);
gai.addEventListener(MouseEvent.MOUSE_UP,up);
functiondown(e:
MouseEvent):
void
{
gai.startDrag(true);
varxx:
uint=Math.floor(Math.random()*4+1);
switch(xx)
{
case1:
n0=10;
a0=1;
b0=6;
break;
case2:
n0=20;
a0=7;
b0=14;
break;
case3:
n0=50;
a0=15;
b0=18;
break;
case4:
n0=10;
a0=19;
b0=20;
break;
}
fztz(n0,a0,b0);
}
functionup(e:
MouseEvent):
void
{
gai.stopDrag();
gai.x=stage.stageWidth/2;
gai.y=stage.stageHeight/2;
}
functionfztz(n:
Number,a:
Number,b:
Number)
{
if(numChildren<=100)
{
for(vari:
uint=1;i<=n;i++)
{
vart:
Number=Math.random()*2*Math.PI;
varmc:
Bao=newBao();
addChild(mc);
mc.gotoAndStop(Math.floor(Math.random()*(b-a+1)+a));
mc.x=stage.stageWidth/2+60*Math.random()*Math.cos(t);
mc.y=stage.stageHeight/2+100*Math.random()*Math.sin(t);
}
}
}
小圆在大圆上运动:
importflash.display.Sprite;
varr:
Number=mc1.width/2;
varR:
Number=mc2.width/2;
vard:
Number=r+R;
vart:
Number=0;
varcircle:
Sprite=newSprite();
stage.addEventListener(Event.ENTER_FRAME,f);
functionf(e)
{
circle.graphics.clear();
mc1.x=mc2.x+d*Math.cos(t);
mc1.y=mc2.y+d*Math.sin(t);
varxx=t*R/r*180/Math.PI;
mc1.rotation=xx;
t+=5*Math.PI/180;
circle.graphics.lineStyle(2,0xff0000);
circle.graphics.moveTo(mc2.x+R+2*r,mc2.y);
circle.graphics.lineTo(mc1.x+r*Math.cos(xx*Math.PI/180),mc1.y+r*Math.sin(xx*Math.PI/180));
addChild(circle);
}
模拟小球弹性碰撞:
package{
importflash.display.Sprite;
publicclassBall2extendsSprite{
publicvarradius:
Number;
privatevarcolor:
uint;
publicvarvx:
Number=0;
publicvarvy:
Number=0;
//////////绘制类:
绘制一个黄色小球。
默认半径为40
publicfunctionBall2(radius:
Number=40,color:
uint=0xffff00){
this.radius=radius;
this.color=color;
init();
}
publicfunctioninit(){
graphics.beginFill(color);
graphics.drawCircle(0,0,radius);
graphics.endFill();
}
}
}
文档类:
package{
importflash.display.Sprite;
importflash.events.Event;
importflash.display.StageScaleMode;
importflash.display.StageAlign;
//////反弹实例
publicclassBouncing2extendsSprite{
privatevarvx:
Number;
privatevarvy:
Number;
////弹力能量损失
privatevarbounce:
Number=-0.7;
privatevarg:
Number=0.5;
privatevarball:
Ball2;
publicfunctionBouncing2(){
init();
}
privatefunctioninit(){
stage.scaleMode=StageScaleMode.NO_SCALE;
stage.align=StageAlign.TOP_LEFT;
ball=newBall2();
ball.x=stage.stageWidth/2;
ball.y=stage.stageHeight/2;
vx=Math.random()*50-5;
vy=Math.random()*50-5;
addChild(ball);
addEventListener(Event.ENTER_FRAME,onEnterFrameFunc);
}
privatefunctiononEnterFrameFunc(event:
Event):
void{
ball.x+=vx;
ball.y+=vy;
///表现重力
vy+=g;
varleft:
Number=0;
varright:
Number=stage.stageWidth;
vartop:
Number=0;
varbottom:
Number=stage.stageHeight;
if(ball.x+ball.radius>right){
ball.x=right-ball.radius;
vx*=bounce;
}elseif(ball.x-ball.radius ball.x=left+ball.radius; vx*=bounce; } if(ball.y+ball.radius>bottom){ ball.y=bottom-ball.radius; vy*=bounce; }elseif(ball.y-ball.radius ball.y=top+ball.radius; vy*=bounce; } } } } 小球缓动、碰撞效果包: 缓动与弹性都是将对象从某一点移动到目标点。 使用缓动运动,如同让影片滑动到目标并停止。 使用弹性运动,会产生向前或向后的反弹,最终停止在目标点位。 两种方法具有一些共同点: 需要一个目标点; 确定到目标点的距离; 成比例地将影片移动到目标点--距离越远,移动速度越快。 缓动运动与弹性运动的不同之处在于移动的比例。 缓动运动时,速度与距离成正比,离目标越远,物体运动速度越快。 当物体与目标点非常非常接近时,就几乎不动了。 弹性运动时,加速度与距离成正比。 如果物体与目标离得很远,再用上加速度,会使移动速度非常快。 当物体接近目标时,加速度会减小,但依然存在! 物体会飞过目标点,随后再由反向加速度将它拉回来。 最终,用摩擦力使其静止。 缓动 FlashIDE中,制作补间动画时,我们就可以看到“缓动输入”和“缓动输出”。 简单的缓动是个非常基础概念,就是将一个物体移动别处去。 创建这个“运动效果”时,希望物体能在几帧内慢慢移动到某一点。 我们可以求出两点之间的夹角,然后设置速度,再使用三角学计算出vx和vy,然后让物体运动。 每一帧都判断一下物体与目标点的距离,如果到达了目标则停止。 这种运动还需要一定条件的约束才能实现,但如果要让物体运动得很自然,显然这种方法是行不通的。 问题在于物体沿着固定的速度和方向运动,到达目标点后,立即停止。 这种方法用于表现物体撞墙的情景,也许比较合适。 但是物体移动到目标点的过程,就像是某个人明确地知道他的目的地,然后向着目标有计划地前进,起初运动的速度很快,而临近目标点时,速度就开始慢下来了。 换句话讲,它的速度向量与目标点的距离是成比例的。 使用缓动使物体归位,运动显得就很自然了。 下面是缓动的实现策略: 1.确定一个数字作为运动比例系数,这是个小于1的分数; 2.确定目标点; 3.计算物体与目标点的距离; 4.用距离乘以比例系数,得出速度向量; 5.将速度向量加到当前物体坐标上; 6.重复3到5步。 下面用ActionScript来实现上面的步骤: 首先,确定一个分数作为比例系数。 我们说过,速度与距离是成比例的。 也就是说速度是距离的一部分。 比例系数在0和1之间,系数越接近1,运动速度就会越快;系数越接近0,运动速度就会越慢。 但是要小心,系数过小会使物体无法到达目标。 开始我们以0.2作为系数,这个变量名就叫easing。 初始代码如下: vareasing: Number=0.2; 接下来,确定目标。 只需要一个简单的X,Y坐标,选择舞台中心坐标再合适不过了。 vartargetX: Number=stage.stageWidth/2; vartargetY: Number=stage.stageHeight/2; 下面,确定物体到达目标的距离。 假设已经有一个名为ball影片,只需要从ball的x,y坐标中减去目标的x,y。 vardx: Number=targetX-ball.x; vardy: Number=targetY-ball.y; 速度等于距离乘以比例系数: vx=dx*easing; vy=dy*easing; 将速度向量加到当前物体坐标上: ball.x+=vx; ball.y+=vy; 最后重复步骤3到步骤5,因此只需要加入enterFrame处理函数。 下面给出一个带拖动的缓动运动: package{ importflash.display.Sprite; importflash.events.Event; importflash.events.MouseEvent; publicclassEasingextendsSprite{ privatevarball: Ball; privatevareasing: Number=0.2; privatevartargetX: Number=stage.stageWidth/2; privatevartargetY: Number=stage.stageHeight/2; publicfunctionEasing(){ init(); } privatefunctioninit(): void{ ball=newBall; addChild(ball); ball.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown1); addEventListener(Event.ENTER_FRAME,onEnterFrame); } privatefunctiononMouseDown1(e: MouseEvent): void{ ball.startDrag(); removeEventListener(Event.ENTER_FRAME,onEnterFrame); stage.addEventListener(MouseEvent.MOUSE_UP,onMouseUp1); } privatefunctiononMouseUp1(e: MouseEvent): void{ ball.stopDrag(); addEventListener(Event.ENTER_FRAME,onEnterFrame); stage.removeEventListener(MouseEvent.MOUSE_UP,onMouseUp1); } privatefunctiononEnterFrame(e: Event): void{ varvx: Number=(targetX-ball.x)*easing; varvy: Number=(targetY-ball.y)*easing; ball.x+=vx; ball.y+=vy; } } } 在物体缓动运动到目标点时,物体最终会到达目标点并且完成缓动效果。 但是,即使不显示该对象,缓动代码仍在执行中,这一来浪费了CPU资源。 当物体到达目标时,应该停止执行代码。 判断物体是否到达目标可以用如下代码: if(ball.x==targetX&&ball.y==targetY){ //停止缓动 } 我们所讨论的缓动类型涉及到了著名的Xeno悖论。 Xeno也是位希腊人,爱好测量实验。 Xeno将运动分解为下面几个步骤: 物体要从A点到达B点,它首先要移动到两点间一半的距离。 然后物体再从该点出发,到达与B点距离一半的距离。 然后再折半。 再次只移动离目标一半的距离,但永远无法准确地达到目标。 从理论上讲位置越来越接近目标,但是永远无法准确地到达目标点。 然而,在代码中进行试验时,结果就发生了一些微妙的变化。 归根结底问题就在于“一次最少能移动多少个像素”,答案是1/20。 事实上,二十分之一像素有个特有的名字: twip(缇)。 在Flash内部计算单位都采用twip像素,包括所有Sprite影片,影片剪辑和其它舞台对象。 因此,在显示影片位置时,这个数值永远是0.05的倍数。 在很多软件中,如果物体与目标点的距离相差在一个像素以内,就可以说它已经到达了目标点,即可停止缓动了。 可以用勾股定理求出两点间的距离: distance=Math.sqrt(dx*dx+dy*dy); Flash并不关心物体是否到达目标或目标是否还在移动。 它只会问“我的目标在哪里? 距离有多远? 速度是多少? ”,每帧都如此。 因此,我们可以很容易将目标点改为鼠标所在的位置,只需将原来targetX和targetY的地方改成鼠标的坐标(mouseX和mouseY)。 代码如下: varvx: Number=(mouseX-ball.x)*easing; varvy: Number=(mouseY-ball.y)*easing; 缓动不仅限于运动,下面举如下例子: 将缓动用在alpha属性上。 开始设置为0,目标设置为1; 设置一个rotation属性和一个目标rotation。 当然,还需要一个能够表现旋转对象。 还可以应该到颜色上表现抖动效果。 弹性运动 弹性的加速度与物体到目标点的距离成正比例。 想象一下现实中的弹簧的性质。 把一个小球拴在橡皮圈一头,再将另一头系在一个固定的地方。 当小球悬在半空时,在没有施加外力的情况下,小球就处在目标点的位置上。 再将小球微微拉动,松手后橡皮圈会对其施加一些外力,又将小球拽回了目标点。 如果用最大力量将小球挪远,那么橡皮圈就会对小球施加很大的力。 小球急速向目标点飞去,并朝着另一面运动。 这时,小球的速度非常快。 当它越过了目标点时,橡皮圈开始把它向回拉--改变其速度向量。 这时,小球会继续运动,但是它运动得越远,所受到的拉力就越大。 然后,速度向量为零,方向相反,一切再重新开始。 最终,在反弹了几次后,速度逐渐慢下来直到停止--停在目标点上。 下面是一个由ActionScript实现一维坐标上的弹性运动: 这里我们仍然使用可以拖拽的小球作为主体。 默认位置还是X轴的0点,使它具有运动到中心点的弹性。 像使用缓动一样,需要一个变量保存弹性的数值。 可以认为这个数同距离的比例,较大的弹性值会使弹性运动显得十分僵硬。 较小的弹性值会使弹性运动像一条松紧带。 我们选用0.1作为弹性: privatevarspring: Number=0.1; privatevartargetX: Number=stage.stageWidth/2; privatevarvx: Number=0; 然后加入运动代码并且找出与目标点的距离: vardx: Number=targetX-ball.x; 下面计算加速度。 加速度与距离成正比,也就是距离乘以spring的值: varax: Number=dx*spring; 得到了加速度以后,把加速度加到速度向量中。 vx+=ax; ball.x+=vx; 注意: 每次的加速度随着物体越接近目标,变得越来越小,但是速度向量仍在不断增涨。 虽然涨幅不像启初那样快,但是速度却越来越快。 下面是这个文档类(Spring.as)的代码: package{ importflash.display.Sprite; importflash.events.Event; publicclassSpring1extendsSprite{ privatevarball: Ball; privatevarspring: Number=0.1; privatevartargetX: Number=stage.stageWidth/2; privatevarvx: Number=0; publicfunctionSpring1(){ init(); } privatefunctioninit(): void{ ball=newBall(); addChild(ball); ball.y=stage.stageHeight/2; addEventListener(Event.ENTER_FRAME,onEnterFrame); } privatefunctiononEnterFrame(e: Event): void{ vardx: Number=targetX-ball.x; varax: Number=dx*spring; vx+=ax; ball.x+=vx; } } } 下面是一个二维的跟随鼠标的代码: package{ importflash.display.Sprite; importflash.events.Event; publicclassSpring1extendsSprite{ privatevarball: Ball; privatevarspring: Number=0.1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 常用 AS30 实例