AS 3 CookBook学習整理(十)

19530 ワード

1.指定された方向(角度)に移動
x方向のインクリメントはMathである.cos(angle)、y方向の増分はMath.sin(angle)
package {
 import flash.display.Sprite;
 import flash.events.TimerEvent;
 import flash.utils.Timer;
 public class Sample0514 extends Sprite
 {
  private var circle:Sprite;
  private var angle:Number = 45;
  private var speed:int = 6; // 6 
   
  public function Sample0514()
  {
   circle = new Sprite();
   circle.graphics.beginFill(0xFFFF00);
   circle.graphics.drawCircle(50,50,30);
   circle.graphics.endFill();
   this.addChild(circle);
   
   var timer:Timer = new Timer(30);
   timer.addEventListener(TimerEvent.TIMER,onTimer);
   timer.start();
  }
  
  private function onTimer(event:TimerEvent):void
  {
   var 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);
package {
 import flash.display.Sprite;
 import flash.events.MouseEvent;
 import flash.events.TimerEvent;
 import flash.utils.Timer;
 public class Sample0515 extends Sprite
 {
  private var timer:Timer;
  private var circle:Sprite;
  
  public function Sample0515()
  {
   circle = new Sprite();
   circle.graphics.beginFill(0xFFFF00);
   circle.graphics.drawCircle(0,0,25);
   circle.graphics.endFill();
   this.addChild(circle);
   
   stage.addEventListener(MouseEvent.CLICK,onClick);
   timer = new Timer(30);
   timer.addEventListener(TimerEvent.TIMER,onTimer);
   timer.start();
  }
  private function onClick(event:MouseEvent):void
  {
   if(circle.x != mouseX && circle.y != mouseY)
   {
    timer.start();
   }
  }  
  
  private function onTimer(event:TimerEvent):void
  {
   var vx:Number = (mouseX - circle.x);
   var vy:Number = (mouseY - circle.y);
   
   var distance:Number = Math.sqrt(vx*vx + vy*vy);
   
   if(distance<1)
   {
    timer.stop();
    circle.x = mouseX;
    circle.y = mouseY;
   }
   else
   {
    circle.x += vx * 0.1;
    circle.y += vy * 0.1;   
   }
  }
 }
}
3.加速運動
加速運動とは、移動するたびに座標の増分が増加することです.
package {
 import flash.display.Sprite;
 import flash.events.Event;
 public class Sample0526 extends Sprite
 {
  private var circle:Sprite;
  private var speed:Number = 0.5;
  private var angle:Number = 45;
  
  public function Sample0526()
  {
   circle = new Sprite();
   circle.graphics.beginFill(0xFFFF00);
   circle.graphics.drawCircle(50,50,20);
   circle.graphics.endFill();
   this.addChild(circle);
   
   this.addEventListener(Event.ENTER_FRAME,onEnterFrame);
  }
  
  private function onEnterFrame(event:Event):void
  {
   var 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>目標点を1つ設定する(x 1,y 1)
<2>物体の中心点(x,y)から目標点(x 1,y 1)への増分(引張量、フック法則の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%のエネルギーが失われる)に設定されています.
package {
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.events.MouseEvent;
 public class Sample0601 extends Sprite
 {
  private var circle:Sprite;
  private var vx:Number = 0;
  private var vy:Number = 0;
  private var flag:Boolean = false;
  private var targetX:Number;
  private var targetY:Number;
  
  public function Sample0601()
  {
   circle = new Sprite();
   circle.graphics.beginFill(0xFFFF00);
   circle.graphics.drawCircle(0,0,30);
   circle.graphics.endFill();
   circle.x = circle.y = 100;
   this.addChild(circle);
   
   stage.addEventListener(MouseEvent.CLICK,onClick);
   stage.addEventListener(Event.ENTER_FRAME,onEnterFrame);
  }
  
  private function onEnterFrame(event:Event):void
  {
   if(flag)
   {
    var ax:Number = (targetX - circle.x) * .1;
    var ay:Number = (targetY - circle.y) * .1;
    
    vx += ax;
    vy += ay;
 
    circle.x += vx;
    circle.y += vy;
    
    vx *= .95;
    vy *= .95;
   }
  }
  
  private function onClick(event:MouseEvent):void
  {
   flag = true;
   targetX = mouseX;
   targetY = mouseY;
  }
 }
}
5.sinとcosによる回転、循環運動または揺動
Math.sin()とMath.cos関数の戻り値は−1から1の範囲であり,sin()は小さいものから大きいもの,cos()は大きいものから小さいものまでである.
sin()またはcos()を循環出力することによって、例えば、次のような範囲内の一連の数値を得ることができる.
for(var i:Numer = 0; i<10; i+= 0.1)
{
 trace(Math.sin(i)*50);// -50 50 
 
 trace(Math.cos(i)*50);// 50 -50 
 
}
上の法則により、左右にスイング(振り子)し、中心点に沿って回転する効果が得られます
package {
 import flash.display.Sprite;
 import flash.events.Event;
 
 public class Sample0601 extends Sprite
 {
  private var circle:Sprite;
  private var angle:Number = 0;
  
  public function Sample0601()
  {
   circle = new Sprite();
   circle.graphics.beginFill(0xFFFF00);
   circle.graphics.drawCircle(0,0,20);
   circle.graphics.endFill();
   this.addChild(circle);
   
   this.addEventListener(Event.ENTER_FRAME,onEnterFrame);
  }
  
  private function onEnterFrame(event:Event):void
  {
   //  
   //circle.x = 200 + Math.sin(angle) * 50;
    
   //  
   circle.x = 200 + Math.sin(angle) * 50;
   circle.y = 200 + Math.cos(angle) * 50;
   
   //  
   //circle.x = 200 + Math.cos(angle) * 50; 
   //circle.y = 200 + Math.sin(angle) * 50;
  
   //  
   //circle.x = 200 + Math.sin(angle) * 50; 
   //circle.y = 200 + Math.cos(angle) * 20;
  
   //  
   //circle.x = 200 + Math.sin(xAngle) * xRadius; 
   //circle.y = 200 + Math.cos(yAngle) * yRadius; 
   //_xAngle += _xSpeed;
   //_yAngle += _ySpeed;
    
   angle += .2;
  }
 }
}
6.Mathを利用する.atan 2(y,x)は2つの点の挟み角を計算する
Mathを通過する点(x 1,y 1)が既知である.atan 2(y 1,x 1)は、座標原点(0,0)X軸に対するこの点の挟み角を得ることができる
2つの点A(x 1,y 1)、B(x 2,y 2)がある場合、A点を座標原点(0,0)としてMathを通過することができる.atan 2(y 2-y 1,x 2-x 1)A,Bの2点の挟み角を算出する
目玉がマウスの効果に追従します.
package {
 import flash.display.Sprite;
 import flash.events.Event;
 
 public class Sample0601 extends Sprite
 {
  private var circle:Sprite;
  private var angle:Number = 0;
  
  public function Sample0601()
  {
   circle = new 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;
   this.addChild(circle);
   
   this.addEventListener(Event.ENTER_FRAME,onEnterFrame);
  }
  
  private function onEnterFrame(event:Event):void
  {
   var dx:Number = mouseX - circle.x;
   var dy:Number = mouseY - circle.y;
   
   var radian:Number = Math.atan2(dy,dx);
   
   circle.rotation = radian * 180 / Math.PI;
  }
 }
}
7.スプリング(フックの法則)スケールを実現するために使用される(大きくなったり小さくなったりする)
フック法則はスケーリング値(scale)にも適用でき,心臓のドキドキ効果である均一なスケーリングを生成する.
package {
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.events.MouseEvent;
 public class Sample0602 extends Sprite
 {
  private var rect:Sprite;
  private var vx:Number = 0;
  private var randomNum:Number = 1;
  
  public function Sample0602()
  {
   rect = new Sprite();
   rect.graphics.beginFill(0xFFFF00);
   rect.graphics.drawRect(-50,-50,100,100);
   rect.graphics.endFill();
   rect.x = 200;
   rect.y = 150;
   this.addChild(rect);
   
   rect.addEventListener(MouseEvent.CLICK,onClick);
   
   this.addEventListener(Event.ENTER_FRAME,onEnterFrame);
   
  }
  
  private function onClick(event:MouseEvent):void
  {
   randomNum = Math.random() * 2 - 0.5;
  }
  
  private function onEnterFrame(event:Event):void
  {   
   vx += (randomNum - rect.scaleX) * 0.1;
   rect.scaleX += vx;
   rect.scaleY = rect.scaleX;
   
   vx *= .9;
  }
 }
}
8.ある色の均一な変化から別の色へ
オブジェクトのColorTransformプロパティを使用して、redMultiplier、greenMultiplier、blueMultiplierの値を変更します.
例えば、newRed=(色を変えるredMultiplier値-現在のredMultiplier値)*speed;
package {
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.events.MouseEvent;
 import flash.geom.ColorTransform;
 public class Sample0602 extends Sprite
 {
  private var _sprite:Sprite;
  private var _red2:Number = 0;
  private var _green2:Number = 0;
  private var _blue2:Number = 0;
  
  private var newRed:Number = 0;
  private var newGreen:Number = 0;
  private var newBlue:Number = 0;
  
  private var _easingSpeed:Number = 0.05;
  
  private var flag:Boolean = false;
  
  public function Sample0602()
  {
   _sprite = new 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);
  }
  
  public function onEnterFrame(event:Event):void 
  {
   if(flag)
   {
    var ctf:ColorTransform = _sprite.transform.colorTransform;
    
    var _red1:Number = ctf.redMultiplier;
    var _green1:Number = ctf.greenMultiplier;
    var _blue1:Number = ctf.blueMultiplier;
    
    newRed += (_red2 - _red1) * _easingSpeed;
    newGreen += (_green2 - _green1) * _easingSpeed;
    newBlue += (_blue2 - _blue1) * _easingSpeed;
    
    _sprite.transform.colorTransform = new ColorTransform(newRed, newGreen, newBlue);
   }
  }
  
  public function onClick(event:MouseEvent):void 
  {
   _red2 = .5;
   _green2 = .5;
   _blue2 = 1;
   
   flag = true;
  }
 }
}
9.文字列の結合
str+=「abc」またはstr.concat(「abc」)を使用できます.前者は元の文字列を変更し、後者は元の文字列を変更せずに新しい文字列を生成します.
package {
 import flash.display.Sprite;
 public class Sample0603 extends Sprite
 {
  public function Sample0603()
  {
   var str:String = "abc";
   str += "def";
   trace(str);//abcdef
   var newStr:String = str.concat("fox");
   trace(str);//abcdef
   trace(newStr);//abcdeffox
  }
 }
}
10.文字列のサブストリングの取得
使用可能
substr(startIndex, length)
substring(startIndex, endIndex)
slice(startIndex, endIndex)