AS 3 CookBook学習整理(十)
19530 ワード
1.指定された方向(角度)に移動
x方向のインクリメントはMathである.cos(angle)、y方向の増分はMath.sin(angle)
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);
加速運動とは、移動するたびに座標の増分が増加することです.
フックの弾性法則は,弾性限界内でスプリングの弾性力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%のエネルギーが失われる)に設定されています.
Math.sin()とMath.cos関数の戻り値は−1から1の範囲であり,sin()は小さいものから大きいもの,cos()は大きいものから小さいものまでである.
sin()またはcos()を循環出力することによって、例えば、次のような範囲内の一連の数値を得ることができる.
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点の挟み角を算出する
目玉がマウスの効果に追従します.
フック法則はスケーリング値(scale)にも適用でき,心臓のドキドキ効果である均一なスケーリングを生成する.
オブジェクトのColorTransformプロパティを使用して、redMultiplier、greenMultiplier、blueMultiplierの値を変更します.
例えば、newRed=(色を変えるredMultiplier値-現在のredMultiplier値)*speed;
str+=「abc」またはstr.concat(「abc」)を使用できます.前者は元の文字列を変更し、後者は元の文字列を変更せずに新しい文字列を生成します.
使用可能
substr(startIndex, length)
substring(startIndex, endIndex)
slice(startIndex, endIndex)
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)