2009年4月アーカイブ

BitmapDataクラス

| コメント(0) | トラックバック(0)

FLASH8から追加されたクラス、BitmapData。
参考書をもとにこんなの作ってみた。スクリーンクリックでスタート

FLASH PLAYER

Get Adobe Flash player

_rootに画面サイズの写真をムービークリップ化したもの(インスタンス名:bg)と透明ボタン(インスタンス名:btn)を配置。以下のコードをタイムライン2フレーム目に記述。1フレーム目は「stop();」。

import flash.display.BitmapData;

var b:Number=0;//マスのナンバー
var row:Number=20;//行数
var col:Number=20;//列数

//マスごとビットマップ化する関数定義
function makeBMP():Void{
 for(var g:Number=0;g<row;g++){
  for(var d:Number=0;d<col;d++){
   var container:MovieClip=_root.createEmptyMovieClip("con"+b,b);
   var bmp=new BitmapData(Stage.width/col,Stage.height/row,false);
   //元画像をマスごとずらす
   _root.bg._y-=Math.floor((g*(Stage.height/row)));
   _root.bg._x-=Math.floor((d*(Stage.width/col)));
   //_rootをbmpに一旦保存
   bmp.draw(_root);
   //保存した_rootをcontainerに乗せる
   container.attachBitmap(bmp,0);
   container._x=-10000;
   
   _root.bg._y+=Math.floor((g*(Stage.height/row)));
   _root.bg._x+=Math.floor((d*(Stage.width/col)));
   
   b++;
  }
 }
 b=0;
 for(g=0;g<row;g++){
  for(d=0;d<col;d++){
   //containerの位置を元に戻す
   _root["con"+b]._y=g*(Stage.height/row);
   _root["con"+b]._x=d*(Stage.width/col);
   //vanishの目標値ランダム設定
   _root["con"+b].nextx=Math.random()*Stage.width;//_x
   _root["con"+b].nexty=Math.random()*Stage.height;//_y
   _root["con"+b].nextr=Math.floor(Math.cos(b*10)*(Math.random()*90));//_rotation
   _root["con"+b].nexta=0;//_alpha
   _root["con"+b].nexts=Math.random()*200;//_xscale&_yscale
   //vanish関数を呼び出す
   _root["con"+b].onEnterFrame=vanish;
   b++;
  }
 }
 //元画像のvisibleをfalseに
 _root.bg._visible=false;
}
//vanish関数定義
function vanish(){
 this._x+=(this.nextx-this._x)/10;
 this._y+=(this.nexty-this._y)/10;
 this._rotation+=(this.nextr-this._rotation)/12;
 this._alpha+=(this.nexta-this._alpha)/15;
 this._xscale+=(this.nexts-this._xscale)/15;
 this._yscale+=(this.nexts-this._yscale)/15;
 if(this._alpha<0.5){
  delete this.onEnterFrame;
  removeMovieClip(this);
  //元画像のvisibleをtrueに戻す
  _root.bg._visible=true;
 }
}
//ボタンアクション定義
_root.btn.onRelease=function(){
 makeBMP();
 _root.play();
}

以下、公式。

import flash.display.BitmapData;
var BitmapDataインスタンス:BitmapData=new BitmapData(幅:Number,高さ:Number,[transparent:Boolean], [fillColor:Number]);
BitmapDataインスタンス.draw(Bitmap化するインスタンス);
MovieClip.attachBitmap(BitmapDataインスタンス,0,auto,true);

【まとめ】
生成するBitmapDataは、常に指定した大きさで左上に作られる。したがって、今回のサンプルのようなものを製作するためには、マスごとずらしながら生成していく必要がある。左上隅の画像をスクリーンショットで、取るイメージか。
また、BitmapDataはかなりメモリを使用するみたいなので、サンプルの行と列の数を増やしすぎるとPCがフリーズするので注意。
勉強不足のため、現段階ではBitmapDataを使って、このほかにどのような面白いことができるのか模索中。

MovieClipLoaderクラス

| コメント(0) | トラックバック(0)

MX2004から採用。jpgやswfをロードするときに発生するイベントを内包する便利なクラス。
以下公式。

//MovieClipLoaderインスタンスを生成
var mcl:MovieClipLoader=new MovieClipLoader();
//リスナーオブジェクトを生成
var obj:Object=new Object();
//リスナーオブジェクトに各イベント時の処理を記述
obj.onLoadStart=function(_mc:MovieClip):Void{
//ロード開始時の処理を記述

obj.onLoadError=function(_mc:MovieClip,errstr:String,HttpStatus:Number):Void{
//エラー時の処理を記述
}
obj.onLoadProgress=function(_mc:MovieClip,loadedBytes:Number,totalBytes:Number):Void{
//ロード中の処理を記述
}
obj.onLoadComplete=function(_mc:MovieClip):Void{
//ロード完了時の処理を記述
}
obj.onLoadInit=function(_mc:MovieClip):Void{
//ロードしたSWFの第1フレームアクション実行後の処理を記述(画像サイズなどの調整はココで
}
//イベントリスナーをMovieClipLoaderインスタンスに登録
mcl.addListener(obj);
//swf「ayabin.swf」をMovieClipLoaderインスタンスにロード
mcl.loadClip("ayabin.swf",表示させる(ターゲット)ムービークリップ);

参考資料:Flashテクニカルノート「MovieClipLoaderクラスについて」

とりあえずサンプルを作ってみた。スクリーンをクリックでスタート。

FLASH PLAYER

Get Adobe Flash player

【サンプル製作過程】
画面サイズは300x300。
_rootにムービークリップload_mc(インスタンス名:load_mc)とprogressbar(インスタンス名:progressbar)を配置。
progressbarには300x40のbg(シェイプ)、「%」(静止テキスト)、ムービークリップbar(インスタンス名:bar)、それにダイナミックテキスト(インスタンス名:percent)をそれぞれ配置。

以下ソース。
タイムライン1フレーム目に記述。

stop();
var mcl:MovieClipLoader=new MovieClipLoader();
var obj:Object=new Object();
obj.onLoad=function(){
 _root.progressbar.bar._xscale=0;
}
/*ロード開始時の処理*/
obj.onLoadStart=function():Void{
 _root.load_mc._alpha=0;
}
/*ロード中の処理*/
obj.onLoadProgress=function(_mc:MovieClip,loadedBytes:Number,totalBytes:Number):Void{
 per=Math.ceil(loadedBytes/totalBytes*100)
 _root.progressbar.percent.text=per;
 _root.progressbar.bar._xscale=per;
}
/*ロード終了後の処理*/
obj.onLoadComplete=function():Void{ 
//必ず100%で終わるようにする
_root.progressbar.percent.text="100";
 _root.progressbar.bar._xscale=100;
//読み込んだ画像をフェードイン
 _root.load_mc.onEnterFrame=function():Void{
  this._alpha+=10;
  if(this._alpha>=100){
   delete this.onEnterFrame;
   this._alpha=100;
  }
 }
 //プログレスバーを画面下へ
 _root.progressbar.onEnterFrame=function():Void{
  this._y+=(Stage.height-this._y)/5;
  if(this._y>=299){
   delete this.onEnterFrame;
  }
 }
}
//ロードしたjpgの第1フレームアクション実行後の処理
obj.onLoadInit=function(target_mc:MovieClip):Void{
 scale=Math.ceil((300/target_mc._height)*100);
 target_mc._xscale=target_mc._yscale=scale;
}
mcl.addListener(obj);

//キャッシュ対策のための変数生成
var date:Date = new Date();
var time:Number = date.getTime();

mcl.loadClip("読み込みたい外部ファイルURL?time="+time,load_mc);

注意)読み込まれた外部ファイルはブラウザにキャッシュされる。以後はキャッシュを読むため、すぐに100%になってしまう。このため、コードの最後で「キャッシュ対策」を行っている。

対策の必要がなければ、「キャッシュ対策」の部分ははずしても問題ない。

イベントリスナー

| コメント(0) | トラックバック(0)

「フルフラッシュサイト(2)」の項で説明した通り、ステージイベント(画面リサイズ)発生時の処理はすべて、リスナーオブジェクトを生成し、そのオブジェクトに対して各処理を記述した上で、「addEventListener」メソッドを使ってステージに追加する。

例えば、画面をリサイズする場合、「Stage.onResize=function{.....}」てな感じで問題ないような気もするが、「Stage」はムービークリップなどと違って、リスナーイベントハンドラメソッド(on、onClipEventなど)が定義されていないため、このような記述ではコンパイルエラーになるそうだ。

ちなみにFLASHの「ヘルプ」には、「イベントリスナーの使用」の項に詳しく載っており、それによると

イベントリスナーとは、あるオブジェクトでブロードキャストしたイベントを別のオブジェクトで受け取れるようにするというもの

とある。また、

イベントをブロードキャストできる ActionScript クラスには、KeyMouseMovieClipLoaderSelectionStageTextField があります

となっている。
なるほど、すべてのクラスってわけじゃないのね。一安心。
ちなみに「ブロードキャスト」ってのは、「キャッチ」に置き換えると、意味がよく分かる。

このアーカイブについて

このページには、2009年4月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2009年3月です。

次のアーカイブは2009年5月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。