homeへのリンクです。

flashでAmazonECS 8

2006年07月23日

flash8まで、ステージ上にムービークリップのインスタンスを配置して名前をつけた場合、スクリプトからその名前でインスタンスを参照することができた。
flash9 public alphaでは駄目。
ステージ上のインスタンスに名前をつけると、エラーなる。

ReferenceError: Error #1056: classes.main.Main のプロパティ disparea を作成できません。

名前を消すとエラーはでない。

flash.display.DisplayObject(MovieClipの親クラスのひとつ)にnameプロパティがあるが、ステージ上に置いてあるインスタンスの場合、自らのクラス定義の中でも値を変更できない。

Error: Error #2078: タイムラインに配置されたオブジェクトの name プロパティは修正できません。

と表示される。

objA=new classname();
this.addChild(objA);

セミナーなどで話を聞いているので、上のようにやればスクリプト上でオブジェクトを把握できるのは知っている。
けれど、ステージとタイムラインを使えないなら、flashで開発する意味が無いので、ステージ上のムービークリップが自分で自分をMainに登録して、スクリプト上で把握できるようにする。

Mainクラスは以下のようになる。

package classes.main{
   import flash.display.*;
   import flash.events.*;
   import classes.loadbar.*;
   public class Main extends MovieClip{
      private var loadbar:LoadBar;
      public function Main(){
         this.loaderInfo.addEventListener(Event.COMPLETE, myOnLoad);
      }
      private function myOnLoad(eventObj:Event):void{
         this.stop();//ロードを監視するためにタイムラインをストップ
         trace(this.loadbar);//loadbarは参照できる。
      }
      public function setLoadBar(lb:LoadBar):void{
      //ステージ上のMCの名前参照ができないので、登録制にする。
         loadbar=lb;
      }
   }
}

LoadBarクラスは以下のようになる。

package classes.loadbar{
   import flash.display.*;
   import classes.main.*;
   public class LoadBar extends MovieClip{
      private var mytimeline:Main;
      public function LoadBar(){
         mytimeline=this.root;
         mytimeline.setLoadBar(this);
      }
   }
}

ただこうすると、使い回しが効かなくて、限りなく無意味になるので、素直にaddChildすることにした。
Mainクラスは以下のようになる。

package classes.main{
   import flash.display.*;
   import flash.events.*;
   import classes.loadbar.*;
   public class Main extends MovieClip{
      private var loadbar:LoadBar;
      public function Main(){
         this.stop();
         loadbar=new LoadBar();
         this.addChild(loadbar);
         loadbar.x=200;
         loadbar.y=298;
         this.loaderInfo.addEventListener(ProgressEvent.PROGRESS, loadbar.myProgress);
         this.loaderInfo.addEventListener(Event.COMPLETE, startMain);
      }
      private function startMain(eventObj:Event):void{
         loadbar.scaleX=1;
         this.removeChild(loadbar);
         this.gotoAndStop("main");//検索画面へ移動
      }
   }
}

_xはxに変更。
_xscaleはscaleXに変更。
scaleXの値の範囲は0~1に変更。
100を入れてしまうとちょっと驚く。

LoadBarクラスは以下。

package classes.loadbar{
   import flash.display.*;
   import flash.events.*;
   import classes.main.*;
   public class LoadBar extends MovieClip{
      private var mytimeline:Main;
      public function LoadBar(){
         this.scaleX=0;
      }
      public function myProgress(eventObj:Event):void{
         trace(eventObj.bytesTotal);//一番最初0になる。とのこと。
         trace(eventObj.bytesLoaded);
         var persentloaded:uint=0;
         if(eventObj.bytesTotal !=0){
            persentloaded=eventObj.bytesLoaded/eventObj.bytesTotal;
         }
         if(persentloaded<100){
            changeScale(persentloaded);
         }
      }
      private function changeScale(scale:uint):void{
         this.scaleX=Number(scale);
      }
   }
}

loaderInfoの使い心地は良い。便利。
ただ、ProgressイベントからたどれるbytesTotalは初回は0になるらしく、プレビューではまだ、ロードバーが完全に動作できているのか確認できてない。(Progressが1回しか発生しない)
MovieClipはスクリプト対ステージではアクセスせずに、スクリプト対ライブラリでアクセスするものと考えるとわかり易いかもしれない。