任意の点を中心にムービークリップを回転させる(その2)

問題はクリックした時の座標が二回目以降うまくとれていないことにあったようだ。
一回目のクリックではMCは回転されてないため、単純にクリックした位置のローカル座標をとればうまく座標位置がとれる。(図1)
ところが、2回目以降のクリックはMCが回転しているためMCのローカル座標をとってもクリックした位置の座標がとれない。(図2)

rotate2.gif

この問題は、「常に回転していない MCを基準に考える」ことで解決できる。
図2のクリックされた赤い点の座標は、図1の赤い点をクリックして回転させた座標だからだ。

前回書いたクラスを改良してみる。

class Rotater {
private var trg:MovieClip;
function Rotater(t:MovieClip) {
trg = t;
}
function rotate(rotation:Number, x:Number, y:Number):Void {
//現在のクリックした点の座標(x1,y1)
var x1:Number, y1:Number;
var rad1 = Math2.degreesToRadians(trg._rotation);
x1 = x*Math.cos(rad1)-y*Math.sin(rad1);
y1 = x*Math.sin(rad1)+y*Math.cos(rad1);
//rotation度回転した点の座標(x2,y2)
var x2:Number, y2:Number;
var rad2 = Math2.degreesToRadians(rotation);
x2 = x*Math.cos(rad2)-y*Math.sin(rad2);
y2 = x*Math.sin(rad2)+y*Math.cos(rad2);
trg._rotation = rotation;
trg._x += x1-x2;
trg._y += y1-y2;
}
}

どうやらうまくいったようだ
[サンプル]

カテゴリー: ActionScript2 パーマリンク

任意の点を中心にムービークリップを回転させる(その2) への1件のフィードバック

  1. がう のコメント:

    こんなコードだと、指定した位置で好きに回転できます

    // (500,500)の位置に30度回転した状態で表示
    // 24,17はmovieclipの大きさです
    setRotate(hoge, 30, 500, 500, 24, 17);

    function setRotate(mc:MovieClip, deg:Number, x:Number, y:Number, w:Number, h:Number) {
    var rad = deg*Math.PI/180.0;

    var x1:Number = -w/2.0;
    var y1:Number = -h/2.0;
    var x2:Number = x1*Math.cos(rad) – y1*Math.sin(rad);
    var y2:Number = x1*Math.sin(rad) + y1*Math.cos(rad);

    mc.x = x + x2;
    mc.y = y + y2;
    mc.rotation = deg;
    }

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です