[AS3.0]変形した MovieClip のローカルマウス座標

マウスの座標を得るには「mouseX」や「mouseY」を使い、
ムービークリップの左上を基準(0,0)とした、マウス座標を得るには
「mc.mouseX」「mc.mouseY」のようにすれば、ムービークリップから見た
マウスのローカル座標が得られます。

しかし、ムービークリップの height や scaleX などを書き換えて変形した場合、
マウスのローカル座標が実際のピクセルと異なって取得されてしまいます。
例えば二倍に拡大した場合、実際の 1 ピクセルは 0.5 ピクセルとなります。

mc_box.scaleX = 2;

stage.addEventListener(MouseEvent.MOUSE_MOVE, function(){
  trace(mc_box.mouseX);
});

このズレを解消するには、元のムービークリップからの拡大率をマウス座標に掛けます。

trace(mc_box.mouseX * mc_box.scaleX);

もし他に根本的な解決策があればコメントよろしくお願いします。

[AS3.0]オブジェクトを複製してドラッグ操作する

as3-box-dispense

ボタンを押すたびにオブジェクトがステージに追加され、
それぞれをドラッグ&ドロップで移動できるプログラムを
ActionScript 3.0 でやってみました。

import flash.display.MovieClip;

var myObjects:Array = new Array();
var index:int = 0;

mc_button.addEventListener(MouseEvent.CLICK, dispense);

function dispense(event:MouseEvent){
	myObjects[index] = new box();
	myObjects[index].num = index;
	stage.addChild(myObjects[index]);
	myObjects[index].buttonMode = true;
	myObjects[index].addEventListener(MouseEvent.MOUSE_DOWN, clipStartDrag);
	myObjects[index].addEventListener(MouseEvent.MOUSE_UP, clipStopDrag);
	index++;
}

function clipStartDrag(event:MouseEvent):void{
	var target:MovieClip = MovieClip(event.currentTarget);
	target.startDrag();
}

function clipStopDrag(event:MouseEvent):void{
	var target:MovieClip = MovieClip(event.currentTarget);
	target.stopDrag();
}

ボタン「mc_button」を押すとライブラリから「box」が追加されます。
一応狙った動作は実現できていますが不慣れなので正しいかどうかは不明です。

普段 PHP をやっていると型を意識するのが難しいですね。

二点間の角度を求める

不運なことに私の数学の知識は殆ど無に等しいので、
原点と、ある座標を結んでできる線分の角度を求める方法を知りません。

何となく分かるのは、(x, y) = (10, 10)の時、見た感じ45度だろうという事、
sin, cos, tan(三角関数というらしい)のどれかを使えばできそうということだけです。

45degree

さっそく数学の公式の載っているサイトhttp://keisan.casio.jp/
を見てみると、

atan

なるほど、わかりません。

数学詳しい人に聞いたら tan^-1 はアークタンジェント(逆正接関数)というものらしいので、
プログラミング言語で言うところの atan(y/x) 関数で処理ができそうです。
と思って試していたら、「ゼロ除算」エラーが出ました。
90° の時はゼロで割ることになってしまうので当然ですがエラーになります。

このようなときのためにちゃんと atan2(y, x) という関数が用意されているみたいです。

ためしに「echo atan2(10,10)」を実行してみると「0.78539816339745」という値が得られました。
これはラジアンという単位だそうで、度数法で表すには PHP では rad2deg() で変換できます。
AS3.0 の場合円周率を用い、「 Math.atan2(y,x) * 180 / Math.PI 」で度数を求めます。
ちなみに、PHP で円周率を用いる場合は pi() が使えます。