Adobe Flash非公式テクニカルノート MatrixTransformerクラスによりインスタンスを任意の座標で回す
fl.motion.MatrixTransformerクラスはMatrixオブジェクトを扱う静的メソッドで成立ち、Matrixクラスを補うクラスといえます。本稿では、MatrixTransformerクラスのメソッドを使って、インスタンスを任意の座標で回してみます。 01 Matrixクラスだけでインスタンスを回す 変換行列による座標変換で注意しなければならないのは、変換の原点が動かせないことです。Matrixクラスで伸縮や回転などの変形を加えると、つねに親インスタンスの基準点が原点になります。[自由変形ツール]でいうなら、中心点が親タイムラインの基準点に固定されるようなものです(図001)。 図001■[自由変形ツール]で親タイムラインの基準点を中心点にするFlashを使い始めたとき、おそらく動かせなくて誰もがつまずくのはシンボルの基準点でしょう。解決方法は、コロンブスの卵でした。基準点が動かないのなら、中身を動かせばよいのです。実は、Matrixクラスでは伸縮や回転のほかに、座標を動かす平行移動という変換ができます。この平行移動を加えると、任意の点を中心にインスタンスを変形できます。 まず、変換の中心にしたい点が親インスタンスの基準点になるように平行移動します。そのうえでつぎに、変形(伸縮・拡大)を行えば、中心にしたい点(= 親インスタンスの基準点)が原点となって変換されます。その後、インスタンスを改めてもとの位置に戻せばよいのです(図002)。 図002■親インスタンスの基準点に移動して変形したうえでもとの位置に戻す
それではお題に戻って、インスタンスの基準点を中心とした回転です(図003)。使うメソッドは、平行移動がMatrix.translate()、回転はMatrix.rotate()になります。後者の引数に渡す角度は、度数でなくラジアンであることにお気をつけください。 Matrixオブジェクト.translate(x座標, y座標) 図003■タイムラインに置いたインスタンスを基準点で回す 基準点で回したいMovieClipシンボルに書くフレームアクションは、以下のスクリプト001です。まず、第1〜2行目で、インスタンスのxy座標を変数にとります。これらの値は、インスタンスを親タイムラインの基準点に平行移動するとき使います。つぎに、第3〜4行目は、インスタンスのアニメーションでフレームごとに5度回したいので、メソッドに渡せるようラジアン値に直します。そして、第5行目が、DisplayObject.enterFrameイベント(定数Event.ENTER_FRAME)にリスナー関数(xRotate())を登録します。 インスタンスを基準点で回すのはこのリスナー関数(xRotate())です(スクリプト001第6〜12行目)。もっとも、Matrixクラスによる座標変換の流れは、すでに述べたとおりです。まず、インスタンスに適用されているMatrixオブジェクトを取出します(第7行目)。つぎに、Matrixオブジェクトを親タイムラインの基準点に平行移動し(第8行目)、予め定めた角度回したうえで(第9行目)、平行移動でもとの位置に戻しています(第10行目)。最後に、変換を加えたMatrixオブジェクトは、インスタンスがもつ(DisplayObject.transformプロパティの)Transform.matrixプロパティに設定し直さなければならないことにご注意ください(第11行目)。 スクリプト001■Matrixクラスによりインスタンスを基準点で回す
これがMatrixクラスを使ったインスタンスの回し方です。上記スクリプト001をフレームアクションに書いたMovieClipインスタンスは、自らの基準点を中心に回り続けます。
02 MatrixTransformer.rotateAroundInternalPoint()メソッドでインスタンスを回す MatrixTransformer.rotateAroundInternalPoint(Matrixオブジェクト, x座標, y座標, 度数角) インスタンスから見たインスタンスの基準点は、つねに座標(0, 0)です。すると、前掲スクリプト001は、MatrixTransformer.rotateAroundInternalPoint()メソッドを使えばつぎのスクリプト002のようにすっきりと書替わります。 スクリプト002■MatrixTransformer.rotateAroundInternalPoint()メソッドによりインスタンスを基準点で回す
では応用として、インスタンスをプレスつまりマウスボタンを押し続けたら初めにクリックした座標で回り続け、マウスボタンを放したらアニメーションは止めるようにしてみましょう。以下のスクリプト003が、マウスプレスした座標で回すMovieClipシンボルに書くフレームアクションです。 インスタンスの上でマウスボタンを押すと(定数MouseEvent.MOUSE_DOWN)、リスナー関数(xStart)が呼出されます(第4〜10行目)。この関数は、クリックしたマウス座標を変数に覚え(第6〜7行目)、前掲スクリプト002と同じようにインスタンス回転のリスナー関数(xRotate())をDisplayObject.enterFrameイベントに登録しています(第8行目)。そして、マウスボタンを放したとき(定数MouseEvent.MOUSE_UP)のために、アニメーション停止のイベントリスナー(xStop())が加えられます(第9行目)。 インスタンスを回転するリスナー関数(xRotate())のやっていることは(第11〜15行目)、基本的に前掲スクリプト002(第3〜7行目)と変わりません。ただ、MatrixTransformer.rotateAroundInternalPoint()メソッドに渡す回転の中心座標が、初めにインスタンスをクリックした位置の変数値(nXとnY)だという違いがあるだけです(第13行目)。 マウスボタンを放すと、リスナー関数(xStop())が呼出されます(第16〜19行目)。そして、アニメーションの関数(xRotate())と自身を、それぞれイベントリスナーから除きます。 スクリプト003■マウスプレスした座標でインスタンスを回す
図004■マウスでプレスした位置を中心にインスタンスが回る 03 MatrixTransformer.rotateAroundExternalPoint()メソッドでインスタンスを回す MatrixTransformer.rotateAroundExternalPoint(Matrixオブジェクト, 親空間のx座標, 親空間のy座標, 度数角) 前掲スクリプト003は、このMatrixTransformer.rotateAroundExternalPoint()を使って書替えることもできます。つぎのスクリプト004のとおり、メソッドの引数に渡す中心座標(第13行目)を親から見た座標に変えるだけです(第6および第7行目)。 スクリプト004■マウスプレスした座標でインスタンスを回す − 親座標空間から捉える
作成者: 野中文雄 Copyright © 2001-2012 Fumio Nonaka. All rights reserved. |
||||||||||||||||||