[AS3.0]ある座標を中心に回転させる

かなり原始的な例ですが、回転前の基準点と回転後の基準点を測り、
ずれた分だけ移動させています。

import flash.display.MovieClip;

mc_box.addEventListener(Event.ENTER_FRAME, rotate);

//回転の中心
var tmp_pos : Point = new Point( ( mc_box.width/2 ) / (mc_box.scaleX), (mc_box.height / 2) / (mc_box.scaleY));

function rotate(event:Event):void{
  //回転前の座標
  var global_pos : Point = mc_box.localToGlobal(tmp_pos);

  mc_box.rotation++;
	
  //回転後の座標
  var after_pos : Point = mc_box.localToGlobal(tmp_pos);

  mc_box.x = mc_box.x - (after_pos.x - global_pos.x);
  mc_box.y = mc_box.y - (after_pos.y - global_pos.y);
}

数学的な厳密さを求めなければこれでも十分機能すると思いますが、
rotateAroundInternalPoint() を使えばもっと簡単にかけます。

rotateAroundInternalPoint(Matrix, X座標, Y座標, 変化角度)

参考
http://fumiononaka.com/TechNotes/Flash/FN0708001.html

import flash.display.MovieClip;
import flash.display.DisplayObject;
import flash.geom.Matrix;
import fl.motion.MatrixTransformer;

mc_box.addEventListener(Event.ENTER_FRAME, rotate);

//回転の中心
var tmp_pos : Point = new Point( ( mc_box.width/2 ) / (mc_box.scaleX), (mc_box.height / 2) / (mc_box.scaleY));

function rotate(event:Event):void{
  var myMatrix:Matrix = mc_box.transform.matrix;
  MatrixTransformer.rotateAroundInternalPoint(myMatrix, tmp_pos.x, tmp_pos.y, 1);
  mc_box.transform.matrix = myMatrix;
}

こちらは角度を指定するのではなく、何度ずつ回転するかを指定するタイプです。

[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 をやっていると型を意識するのが難しいですね。