34.SWFをコンパイル時にEmbedする

画像を埋め込むのにはまった!

このページのお話は、FLASH CS3等のオーサリングソフトをお持ちの方には関係のないことでしょう。私はFLASH MX 2004しか持っていませんが、それでもそれを使うなら頭を悩ませなくてもいい話です。

タイトルにあるようにSWFファイルに画像を含めておく方法について、であります。

オーサリングソフトがあれば、簡単にできますよね?

ところがFlex2 SDKでやる、、、つまりコードに書いて実行しようとしたらえらく困りまして、、、そのあたりをまとめておきます。

JPEG/GIF画像を埋め込む場合

JPEGもしくはGIF画像を埋め込む場合、以下のように書くことができます。

package {
import flash.display.*;

public class hoge extends Sprite {

[Embed(source='image.gif')] private static const ImageEx:Class;

public function hoge(){// コンストラクタ
var imagehoge:Bitmap = new ImageEx();
addChild(imagehoge);
}
}
}

このようにすれば画像を扱うことができます。

Bitmapクラスのオブジェクトになりますが、座標とか大きさ、回転などのプロパティを設定できます。

SWF画像を埋め込む場合

「SWF画像」という言い方は変かな?つまり、MX 2004なんかで絵を1つだけ描いて、それをSWFとして出力したものでアニメーションではないものを指します。

SWFで使いたい理由はもちろん、ベクター画像だからであります。GIF画像なんかは拡大するとギザギザになってしまいますから、用途によってはどうしてもベクター画像を使いたいことがあるわけです。

上のコードと同様にやってみると、、、

package {
import flash.display.*;

public class hoge extends Sprite {

[Embed(source='image.swf')] private static const ImageEx:Class;

public function hoge(){// コンストラクタ
var imagehoge:Sprite = new ImageEx();
addChild(imagehoge);
}
}
}

単にクラスをBitmap→Spriteにしただけなんですけど、これで動きます。

また、下のように

var imagehoge1:Sprite = new ImageEx();
var imagehoge2:Sprite = new ImageEx();
var imagehoge3:Sprite = new ImageEx();

元の画像をベースにいくつでもオブジェクトを生成できます。あら、簡単!

ところで、このnew なんたらでオブジェクトを生成する方法、上の例では問題ないのですが、、、場合によっては要注意!なんです。

ええ、私、はまりました(^^;

SWFをEmbedする場合の注意点

上の例で言うと、生成後にそのサイズを見てみると、、、

var imagehoge:Sprite = new ImageEx();
trace("imagehoge.width="+imagehoge.width);

どういうわけか、どんなサイズのSWFを処理してもサイズが10と出力されるんです(他の環境ではどうか不明ですが、ウチの場合はこうなるんです)。

JPEGやGIF画像の場合は意図通りのサイズが出るのですが、SWFの場合は正しく表示されません。

どうも、オブジェクト生成直後にはまだプロパティは正しくとれないようで、、、

仕方なく、例えば次のようにして、1フレーム分待ってから使うようにしています。

//オブジェクト生成後
addEventListener(Event.ENTER_FRAME , waiting);
var count:uint=0;
function waiting(e:Event):void {
count++;
if (count >=2){
removeEventListener(Event.ENTER_FRAME , waiting);
trace("imagehoge.width="+imagehoge.width);
}
}

すると、意図通り、プロパティを得ることができます。

→35.NaNの謎

33.簡単な年齢・月齢の求め方←