1. 在指定方向(角度)上移动
x方向的增量取的是Math.cos(angle),y方向的增量取的是Math.sin(angle)
{ flash.display.Sprite; flash.events.TimerEvent; flash.utils.Timer; Sample0514Sprite { circle:Sprite; angle:Number = 45; speed:int = 6; Sample0514() { circle = Sprite(); circle.graphics.beginFill(0xFFFF00); circle.graphics.drawCircle(50,50,30); circle.graphics.endFill(); .addChild(circle); timer:Timer = Timer(30); timer.addEventListener(TimerEvent.TIMER,onTimer); timer.start(); } onTimer(event:TimerEvent): { radian:Number = angle * Math.PI / 180; circle.x += Math.cos(radian) * speed; circle.y += Math.sin(radian) * speed; } } }
2. 减速运动
x方向的移动:(mouseX - object.x) * speed;
y方向的移动:(mouseY - object.y) * speed;
物体与目标位置的距离:
var vx:Number = (mouseX - circle.x);
var vy:Number = (mouseY - circle.y);
var distance:Number = Math.sqrt(vx*vx + vy*vy);
{ flash.display.Sprite; flash.events.MouseEvent; flash.events.TimerEvent; flash.utils.Timer; Sample0515Sprite { timer:Timer; circle:Sprite; Sample0515() { circle = Sprite(); circle.graphics.beginFill(0xFFFF00); circle.graphics.drawCircle(0,0,25); circle.graphics.endFill(); .addChild(circle); stage.addEventListener(MouseEvent.CLICK,onClick); timer = Timer(30); timer.addEventListener(TimerEvent.TIMER,onTimer); timer.start(); } onClick(event:MouseEvent): { (circle.x != mouseX && circle.y != mouseY) { timer.start(); } } onTimer(event:TimerEvent): { vx:Number = (mouseX - circle.x); vy:Number = (mouseY - circle.y); distance:Number = Math.sqrt(vx*vx + vy*vy); (distance<1) { timer.stop(); circle.x = mouseX; circle.y = mouseY; } else { circle.x += vx * 0.1; circle.y += vy * 0.1; } } } }
3. 加速运动
加速运动,就是每次移动时,坐标的增量递增
{ flash.display.Sprite; flash.events.Event; Sample0526Sprite { circle:Sprite; speed:Number = 0.5; angle:Number = 45; Sample0526() { circle = Sprite(); circle.graphics.beginFill(0xFFFF00); circle.graphics.drawCircle(50,50,20); circle.graphics.endFill(); .addChild(circle); .addEventListener(Event.ENTER_FRAME,onEnterFrame); } onEnterFrame(event:Event): { radian:Number = angle * Math.PI /180; speed += .3; circle.x += Math.cos(radian) * speed; circle.y += Math.sin(radian) * speed; } } }
4. 弹簧(胡克定律)
胡克的弹性定律指出:在弹性限度内,弹簧的弹力f和弹簧的长度x成正比,即f= -kx。k是物质的弹性系数,它由材料的性质所决定,负号表示弹簧所产生的弹力与其伸长(或压缩)的方向相反。
F=k·x
F -- 表示弹簧的弹力,单位是牛
k -- 劲度系数,单位是牛/米
x -- 是弹簧伸长或缩短的长度,单位是米
as实现弹簧定律的关键代码:
<1> 设定一个目标点(x1,y1)
<2> 得到物体中心点(x,y)到目标点(x1,y1)的增量(拉伸量,对应胡克定律里的x)
<3> 将增量累加到变量保存(vx,vy)
<4> 物体每次增加vx,vy(vx,vy为正值,则为远离中心点的弹簧动作;为负值,则为接近中心点的弹簧动作)
<5> 加上损耗(_vx *= 0.95; _vy * 0.95),不加损耗则为永动,类似钟摆效果。
一般在as里,设置k(劲度系数)为0.1或0.2;损耗设置为0.95(每次弹跳丢失5%的能量)
{ flash.display.Sprite; flash.events.Event; flash.events.MouseEvent; Sample0601Sprite { circle:Sprite; vx:Number = 0; vy:Number = 0; flag:Boolean = ; targetX:Number; targetY:Number; Sample0601() { circle = Sprite(); circle.graphics.beginFill(0xFFFF00); circle.graphics.drawCircle(0,0,30); circle.graphics.endFill(); circle.x = circle.y = 100; .addChild(circle); stage.addEventListener(MouseEvent.CLICK,onClick); stage.addEventListener(Event.ENTER_FRAME,onEnterFrame); } onEnterFrame(event:Event): { (flag) { ax:Number = (targetX - circle.x) * .1; ay:Number = (targetY - circle.y) * .1; vx += ax; vy += ay; circle.x += vx; circle.y += vy; vx *= .95; vy *= .95; } } onClick(event:MouseEvent): { flag = ; targetX = mouseX; targetY = mouseY; } } }
5. 利用sin和cos实现旋转,循环运动或摆动
Math.sin()和Math.cos函数的返回值范围在 -1 到 1 之间,sin()是从小到大,cos()是从大到小
可以通过循环输出sin()或cos()来得到一个范围内的一串数字,例如:
(i:Numer = 0; i<10; i+= 0.1) { (Math.sin(i)*50); (Math.cos(i)*50); }
根据上面的规律,可以实现左右摆动(钟摆)、沿中心点转动的效果
{ flash.display.Sprite; flash.events.Event; Sample0601Sprite { circle:Sprite; angle:Number = 0; Sample0601() { circle = Sprite(); circle.graphics.beginFill(0xFFFF00); circle.graphics.drawCircle(0,0,20); circle.graphics.endFill(); .addChild(circle); .addEventListener(Event.ENTER_FRAME,onEnterFrame); } onEnterFrame(event:Event): { circle.x = 200 + Math.sin(angle) * 50; circle.y = 200 + Math.cos(angle) * 50; angle += .2; } } }
6. 利用Math.atan2(y, x)计算两个点的夹角
已知一个点(x1, y1),通过Math.atan2(y1, x1)可以得到这个点相对于坐标原点(0, 0)X轴的夹角
假如有两个点A(x1, y1)、B(x2, y2),则可以将A点视为坐标原点(0, 0),然后通过Math.atan2(y2 - y1, x2 - x1)计算出A、B两点的夹角
一个眼珠跟随鼠标效果:
{ flash.display.Sprite; flash.events.Event; Sample0601Sprite { circle:Sprite; angle:Number = 0; Sample0601() { circle = Sprite(); circle.graphics.beginFill(0xFFFFFF); circle.graphics.drawCircle(0,0,30); circle.graphics.endFill(); circle.graphics.beginFill(0x000000); circle.graphics.drawCircle(20,0,5); circle.graphics.endFill(); circle.x = circle.y = 200; .addChild(circle); .addEventListener(Event.ENTER_FRAME,onEnterFrame); } onEnterFrame(event:Event): { dx:Number = mouseX - circle.x; dy:Number = mouseY - circle.y; radian:Number = Math.atan2(dy,dx); circle.rotation = radian * 180 / Math.PI; } } }
7. 弹簧(胡克定律)用来实现缩放(忽大忽小)
胡克定律也可以应用在缩放值(scale)上,生成一种匀速的缩放,一种应用是心脏扑通扑通跳动效果
{ flash.display.Sprite; flash.events.Event; flash.events.MouseEvent; Sample0602Sprite { rect:Sprite; vx:Number = 0; randomNum:Number = 1; Sample0602() { rect = Sprite(); rect.graphics.beginFill(0xFFFF00); rect.graphics.drawRect(-50,-50,100,100); rect.graphics.endFill(); rect.x = 200; rect.y = 150; .addChild(rect); rect.addEventListener(MouseEvent.CLICK,onClick); .addEventListener(Event.ENTER_FRAME,onEnterFrame); } onClick(event:MouseEvent): { randomNum = Math.random() * 2 - 0.5; } onEnterFrame(event:Event): { vx += (randomNum - rect.scaleX) * 0.1; rect.scaleX += vx; rect.scaleY = rect.scaleX; vx *= .9; } } }
8. 从一种颜色匀速变化到另一种颜色
利用物体的ColorTransform属性,改变redMultiplier, greenMultiplier, blueMultiplier的值
例如:newRed = (改变颜色的redMultiplier值 - 现在的redMultiplier值) * speed;
{ flash.display.Sprite; flash.events.Event; flash.events.MouseEvent; flash.geom.ColorTransform; Sample0602Sprite { _sprite:Sprite; _red2:Number = 0; _green2:Number = 0; _blue2:Number = 0; newRed:Number = 0; newGreen:Number = 0; newBlue:Number = 0; _easingSpeed:Number = 0.05; flag:Boolean = ; Sample0602() { _sprite = Sprite( ); _sprite.graphics.beginFill(0xffffff); _sprite.graphics.drawRect(-50, -50, 100, 100); _sprite.graphics.endFill( ); _sprite.x = 100; _sprite.y = 100; addChild(_sprite); addEventListener(Event.ENTER_FRAME, onEnterFrame); addEventListener(MouseEvent.CLICK, onClick); } onEnterFrame(event:Event): { (flag) { ctf:ColorTransform = _sprite.transform.colorTransform; _red1:Number = ctf.redMultiplier; _green1:Number = ctf.greenMultiplier; _blue1:Number = ctf.blueMultiplier; newRed += (_red2 - _red1) * _easingSpeed; newGreen += (_green2 - _green1) * _easingSpeed; newBlue += (_blue2 - _blue1) * _easingSpeed; _sprite.transform.colorTransform = ColorTransform(newRed, newGreen, newBlue); } } onClick(event:MouseEvent): { _red2 = .5; _green2 = .5; _blue2 = 1; flag = ; } } }
9. 字符串拼接
可以使用str += "abc"或str.concat("abc"),区别在于前者会改变原字符串,后者不会改变原字符串而是生成一个新的字符串
{ flash.display.Sprite; Sample0603Sprite { Sample0603() { str:String = ; str += ; (str); newStr:String = str.concat(); (str); (newStr); } } }
10. 获取字符串中的子串
可以使用
substr(startIndex, length)
substring(startIndex, endIndex)
slice(startIndex, endIndex)