ASのリハビリということでこんなサンプルを作ってみました。画面クリックで基準点が切り替わります。中学低学年レベルのまま止まっている苦手な数学も少し使ってみました。
ドキュメントクラスに"TestMatrix"を指定してください。4つのボールはあらかじめオーサリング時にステージに配置してあります。
ちなみに、ソースの解説はしません。数学は苦手分野なので下手に説明して間違った知識が広まってしまっては困りますからね^^;
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;
/**
* ...
* @author Ks-Product.com
*/
public class TestMatrix extends Sprite
{
public var axis:Sprite;
public var axisX:Number;
public var axisY:Number;
public var ballArray:Vector.<sprite>;
public function TestMatrix()
{
axisX = 100;
axisY = 200;
axis = new Sprite();
axis.graphics.beginFill(0x000000);
axis.graphics.drawCircle(0, 0, 5);
axis.graphics.endFill();
axis.x = axisX;
axis.y = axisY;
addChild(axis);
ballArray = Vector.<sprite>([ball1, ball2, ball3, ball4]);
addEventListener(Event.ENTER_FRAME, onEnterFrame);
stage.addEventListener(MouseEvent.CLICK, onClick);
}
private function onClick(e:MouseEvent):void
{
axisX = axis.x = e.stageX;
axisY = axis.y = e.stageY;
}
private function onEnterFrame(e:Event):void
{
rotate(-3);
}
/**
* 指定された軸を中心に回転する
* @param angle
* @param direction
*/
public function rotate(angle:Number,direction:Boolean = false):void
{
/* cos -sin | x
* sin cos | y
*
* cos*x - sin*y
* sin*x + cos*y
*
* */
var r:Number = angle * Math.PI / 180;
var cos:Number = Math.cos(r);
var sin:Number = Math.sin(r);
for (var i:uint = 0; i < ballArray.length; i++) {
var tx:Number = ballArray[i].x - axisX;
var ty:Number = ballArray[i].y - axisY;
var nx = cos * tx - sin * ty;
var ny = sin * tx + cos * ty;
ballArray[i].x = nx + axisX;
ballArray[i].y = ny + axisY;
if(direction) ballArray[i].rotation += angle;
}
}
}
}



コメント(0)
twitterでつぶやく
コメントが存在しません。