AS3 CookBook学习整理(十)

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)

转载于:https://www.cnblogs.com/CoderWayne/archive/2010/07/15/1778070.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值