2010年10月21日

modoからFLASHへ書き出してみた その30 modo 401 SP4 ActionScript 3.0

前回に引き続きムービークリップの貼り付けだ。

前回は主にムービークリップのインスタンスをマテリアルにするMovieMaterialを調べたけど、今回は前回の最後にちょっとやってみたライブラリからムービークリップのインスタンスを生成してそれをマテリアルにするMovieAssetMaterialを調べてみたい。ムービークリップの登録は前回やった通りだ。あのプロセスでライブラリに下のように登録される。これをステージにドラッグ&ドロップすればインスタンスが生成されるわけだ。

fig01

リンケージIDはシンボル登録の時に設定したクラス名だ。

fig02

以下はMovieAssetMaterialのコンストラクタだ。

MovieAssetMaterial(
 linkageID:String = "",
 transparent:Boolean = false,
 animated:Boolean = false,
 createUnique:Boolean = false,
 precise:Boolean = false)

linkageIDはライブラリ内のムービークリップのID、transparentはムービークリップを透過にするかどうか、animatedはムービークリップのタイムラインアニメーションを使うかどうか、createUniqueはムービークリップのインスタンスを再利用しないで新しいインスタンスを生成するかどうか、preciseは画像の歪み防止機能を有効にするかどうかだ。linkageIDとcreateUnique以外はMovieMaterialのコンストラクタにあったパラメータだ。逆にrectパラメータが無くなってムービークリップのエリアを決める部分が無くなった。でもこれはマテリアルを生成した後で指定する事が出来るので問題ない。たとえばこんな感じだ。

var material:MovieAssetMaterial
 =new MovieAssetMaterial("mc_fish",false,true,false,true);
material.rect
 =new Rectangle(-800,-400,1600,800);

もちろんこんなことをやるかわりにムービークリップの範囲にしたい範囲に背景を入れてやれば済む(それも前回やったね)。

さて、以下がライブラリに登録されたムービークリップからリンケージID「”mc_fish”」を見つけ出してインスタンスを作り、マテリアルとして球体に貼り付けた例だ。前回のインスタンスを直接指定するものと違ってリンケージIDは名前の文字列をファンクションに渡す。

package  {
 import org.papervision3d.view.BasicView;
 import org.papervision3d.objects.primitives.Sphere;
 import org.papervision3d.materials.MovieAssetMaterial;
 import flash.geom.Rectangle;
 import flash.events.Event;

 public class McTest02 extends BasicView{
  var obj:Sphere;
  public function McTest02() {
   var material:MovieAssetMaterial
  =new MovieAssetMaterial("mc_fish",false,true,false,true);
   material.rect
  =new Rectangle(-800,-400,1600,800);
   obj=new Sphere(material,400,24,12);
   scene.addChild(obj);
   startRendering();
   addEventListener(Event.ENTER_FRAME,loop);
  }
  private function loop(e:Event){
   obj.rotationY+=3;
  }
 }
}

これがその結果。今回は貼り付けている事が分かりやすいように球を回転させてみた。

fig01

MovieAssetMaterialはMovieMaterialを継承していて内部にムービーインスタンスを保持している。それにはmovieプロパティからアクセスできる。ただ型がDisplayObjectなのでムービークリップのインスタンスとして扱うにはキャストしてやる必要がある。生成したムービークリップのクラスはムービークリップを登録した時に設定した「mc_fish」クラスだ。

クラスのコードを書き出すとこんなだ。

package  {
 import flash.display.MovieClip;
 public class mc_fish extends MovieClip {
  public function mc_fish() {
   // constructor code
  }
 }
}

特に何の追加もしていないからMovieClipクラスにキャストしてもいいけどね。キャストは使うたびに毎回やってもいいし、キャストしたものを変数に代入してそれを使ってもいい。下の2つの例はそれぞれの方法でムービークリップの総フレーム数を出力ウィンドウに表示させている。

逐一キャストをかけて使う場合
 trace((material.movie as mc_fish).totalFrames);
        または
 trace(mc_fish(material.movie).totalFrames);

キャストをかけたものを変数にとっておいて使う場合
 var mc:mc_fish = material.movie as mc_fish;
        または
 var mc:mc_fish = mc_fish(material.movie);
 trace(mc.totalFrames);

MovieClipクラスのインスタンスのtotalFramesプロパティがムービーの長さだ。

MovieClipはplayメソッドで再生させたりstopメソッドで停止させたりgotoAndStopやgotoAndPlayメソッドで特定のフレームに移動して止めたりそこから再生させたりできる。

例えば2つのボタンを作って、

fig03

それぞれのインスタンス名をbtn_playとbtn_stopにして、

fig04

以下のようにコードを書直せば、ボタンを押してムービークリップの再生と停止を切り替えられる。

package  {
 import org.papervision3d.view.BasicView;
 import org.papervision3d.objects.primitives.Sphere;
 import org.papervision3d.materials.MovieAssetMaterial;
 import flash.geom.Rectangle;
 import flash.events.Event;
 import flash.events.MouseEvent;

 public class McTest02 extends BasicView{
  var obj:Sphere;
  var mc:mc_fish;
  public function McTest02() {
   var material:MovieAssetMaterial=new MovieAssetMaterial("mc_fish",false,true,false,true);
   material.rect=new Rectangle(-800,-400,1600,800);
   obj=new Sphere(material,400,24,12);
   mc = material.movie as mc_fish;
   scene.addChild(obj);
   startRendering();
   addEventListener(Event.ENTER_FRAME,loop);
   btn_play.addEventListener(MouseEvent.CLICK,btn_action);
   btn_stop.addEventListener(MouseEvent.CLICK,btn_action);
  }
  private function loop(e:Event){
   obj.rotationY+=3;
  }
  private function btn_action(e:MouseEvent):void{
   switch(e.currentTarget){
    case btn_play:
     mc.play();
     break;
    case btn_stop:
     mc.stop();
     break;
   }
  }
 }
}

これがその結果。

Adobe Flash Player を取得

Playボタンを押すとムービークリップが動き、Stopボタンを押すとムービーが静止するのがわかる。

ただしマテリアルを複数に割り当てる場合、コンストラクタのcreateUniqueパラメータがfalseだと同じリンクIDから生成したマテリアルは同じムービークリップのインスタンスを使いまわすので、1つのムービークリップを止めたつもりが同じマテリアルのムービークリップが全部止まってしまう。同じリンクIDのマテリアルでも、生成されるマテリアルごとにムービークリップの制御を個別にしたい場合は、createUniqueパラメータをtrueにする必要がある。下のコードは球を2つ並べて1つのリンケージIDから2つのマテリアルを生成して2つの球にそれぞれ割り当てて、material1の方だけムービーをストップさせたものだ。

package  {
 import org.papervision3d.view.BasicView;
 import org.papervision3d.objects.primitives.Sphere;
 import org.papervision3d.materials.MovieMaterial;
 import org.papervision3d.materials.MovieAssetMaterial;
 import flash.geom.Rectangle;
 import flash.events.Event;

 public class McTest03 extends BasicView{
  var obj1:Sphere;
  var obj2:Sphere;
  public function McTest03() {
   var material1:MovieAssetMaterial=new MovieAssetMaterial("mc_fish",false,true,false,true);
   var material2:MovieAssetMaterial=new MovieAssetMaterial("mc_fish",false,true,true,true);
   material1.rect=new Rectangle(-800,-400,1600,800);
   material2.rect=new Rectangle(-800,-400,1600,800);
   mc_fish(material1.movie).stop();
   obj1=new Sphere(material1,400,24,12);
   obj2=new Sphere(material2,400,24,12);
   scene.addChild(obj1);
   scene.addChild(obj2);
   obj1.x=-400;
   obj1.z=300;
   obj2.x=400;
   obj2.z=300;
   startRendering();
   addEventListener(Event.ENTER_FRAME,loop);
  }
  private function loop(e:Event){
   obj1.rotationY+=3;
   obj2.rotationY+=3;
  }
 }
}

これが実行結果。もし上のコードの赤い文字のcreateUniqueをfalseにしたら、2つのムービークリップは同じインスタンスが使われて2ともに静止する事になる。

fig05

それではまた次回。

modoカテゴリー別ページ



take_z_ultima at 11:30│Comments(0)TrackBack(0)modo | FLASH

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 

Archives