Top > FlashGeneral

グラフィック関連のメソッド

塗りつぶし

Sprite.graphics.beginFill(0x000000,1)

このメソッドは、後続のdrawCircle()やlineToなどの描画時に影響する。 メソッド自身の呼び出し時には何も起こらない。

フィルタ

Sprite.filters = [new BlurFilter(x,y, 1)]; filtersプロパティは実際はDisplayObjectで実装されている。

用意されているフィルタは下記を参照。

http://livedocs.adobe.com/flex/2_jp/langref/flash/filters/package-detail.html

  • ブラー(ぼかし)

フィルタの反映には、filters変数の再設定が必要。
フィルタはgraphics.endFill()を実施後に適用する。
コンストラクタはx、yのぼかし量とぼかし回数。回数が多いと実行速度が落ちる。
BitmapFilterQuality.HIGHを指定するとガウスぼかしになる。

obj.filters = [new BlurFilter(10, 10, BitmapFilterQuality.HIGH)];
  • グロー

日食のような光に縁取られたような効果のフィルタ。

  • ベベル

影の逆で、傾斜を持たせて立体感を出すフィルタ。

  • ドロップシャドウ オブジェクトに影が落ちたような効果のフィルタ。

コンストラクタで距離、角度、色、アルファ値を指定。

角度は右方向から時計回りになっている模様。

obj.filters = [new DropShadowFilter(5,30,0xFFFFFF,.8)];

塗りつぶしの注意点2009-08-20追記

SpriteのgraphicにdrowXXX()メソッドで描画する場合、それ以前にSprite.widhtとSprite.heightを設定しておくと何も画面に表示されなかった。理由は不明だが、とりあえずそういうものだと思って同じことをしてはまらないよう気をつける。

例:

//      ここでwidthとheightを設定すると駄目。
//      s.width = tf.width;
//      s.height = tf.height;

     s.graphics.beginFill(bgcolor);
     s.graphics.drawRect(0, 0, tf.width, tf.height);
     s.graphics.endFill();

文字列を画像としてSpriteに表示する(Spriteでラベル付きボタンを作成する)2009-08-20

Spriteにラベル文字列を表示して、ボタンとして利用する。ラベルの文字列部分はTextField部品をSpriteに追加すればよいが、そのままだとマウスカーソルがラベル部分だけ "I" 型になってかっこ悪かったので、ラベル文字列をいったんBitmapデータにして、BitmapをSpriteに追加してみた。 もっとよいやり方はあると思うが、これはこれで応用も利くと思うので、ひとつのやり方として試してみた。

文字を画像として表示した場合、拡大するとギザギザが目立ってしまう。拡大する場合は拡大後のサイズで文字を再作成、Bitmap化してSpriteに表示してあるものと差し替る必要がある。

 // 文字Bitmap作成用TextField
 var tf:TextField = new TextField();
 tf.selectable = false;
 tf.y = 0;
 tf.x = 0;
 tf.text = title;
 // TextField背景色設定
 tf.background = true;//  <---背景色を設定する場合は、この設定も必須。
 tf.backgroundColor = bgcolor;
 var fmt:TextFormat = new TextFormat();
 //この辺のフォーマットの設定は適当。必要に応じていじる。
 fmt.font = "MS Gothic";
 fmt.size = fontSize;
 fmt.bold = true;
 fmt.align = TextFormatAlign.CENTER;
 fmt.letterSpacing = 5;
 // TextFieldにフォーマット設定
 tf.setTextFormat(fmt);
 tf.textColor = fgcolor;
 tf.width = tf.textWidth;
 tf.height = tf.textHeight;

 // 画面に表示するボタンのインスタンス。ボタンらしくするためbuttonModeを設定
 var btn:Sprite new Sprite();
 btn.buttonMode = true;

 var bmd:BitmapData = new BitmapData(tf.width,tf.height);
 // FextField部品からBitmapのデータ作成
 bmd.draw(tf);
 // Bitmap作成
 var bm:Bitmap = new Bitmap(bmd);
 bm.width = tf.width;
 bm.height = tf.height;
 // 後から画像を差し替える場合に備え、参照できるよう名前を付けておく。
 bm.name = "labelBitmap";
 btn.addChild(bm);
 addChild(btn);

BitmapDataで透過処理

上の続き。pixelのサイズでループして、pixelが透過したい背景色だった場合、32bitの先頭8bitの透過度を更新する。下記の例でbgAlphaは0〜1の値なので、intやuintは不可で、Numberである必要がある。

var bmd:BitmapData = new BitmapData(tf.width, tf.height);
bmd.draw(tf);

// 背景透過の処理
if(bgAlpha != 1){
  for (var y:int = 0; y < tf.height; y++) {
    for (var x:int = 0; x < tf.width; x++) {
      var tmp:uint = bgcolor | 0x0000ff << 24;
      if (bmd.getPixel32(x, y) ==  tmp) {//getPixel32でなくgetPixelでえれば一行上の処理は要らないはず…
        tmp = bgcolor | (0xff * bgAlpha) << 24;
        bmd.setPixel32(x, y, tmp);}}}}

2009-08-23

色の変換(ColorTransform)

ColorTransformで色と透明度の変換を行う。

パラメータの最初の4つは、現在値のRGBAに対して乗算する値、後半の4つは現在値のRGBAに対して加減算する値。

Sprite.transform.colorTransform = new ColorTransform(r1, g1, b1, a1, r2, g2, b2, a2);
Bitmap.bitmapData.colorTransform(bitmapData.rect, new ColorTransform(r1, g1, b1, a1, r2, g2, b2, a2));

下の方法だと、変換を適用する範囲を指定することができる。 変換に利用する値はコンストラクタでなく、ColorTransformインスタンスのフィールドでも設定できる。

その他

Spriteを簡単にボタンらしく見せる

Sprite.buttonMode = true;

内部的に利用し、外からアクセスさせないクラス

XXX.asソースファイルのpackageスコープ外に、直にclassを定義する。classはいくつでも定義可能。

package{
  //外からアクセスさせる通常のクラス
  public class XXX{
    // 内部利用目的のクラスを利用
    var a:Aclass = new Aclass()
  }
}

Aclass{}
Bclass{}

AS3のbit演算

uintで先頭のビットが立っている場合、ifの中などでインラインでbit演算をしようとすると、intに変えられるようで、正しい(本来意図していた)結果が得られないことがある。

以下は32bitの先頭が立っている。bit演算の戻り値がintであるため数値が不一致になり、ifの結果がfalseになる。

var i:uint = 0x8fffffff;
if(i == (0x000000ff| (0x0000ff<<8)| (0x0000ff<<16)| (0x00008f<<24)))fn();

下記は先頭bitが0の例だが、符号の影響を受けないので意図した結果が得られる。

var i:uint = 0x7fffffff;

if(i == (0x000000ff| (0x0000ff<<8)| (0x0000ff<<16)| (0x00007f<<24)))fn();

逆に、変数の方をuintからintにすると、数値表現が同じ-になるのでtrueとなる。

var i:int = 0x8fffffff;
if(i == (0x000000ff| (0x0000ff<<8)| (0x0000ff<<16)| (0x00008f<<24)))fn()

ビット演算の結果をintで受けた後、uintに代入する。ifでuint同士を比較してもtrueとなる。

var i:uint = 0x8fffffff;
var ii:int = 0x000000ff| (0x0000ff << 8)| (0x0000ff<<16)| (0x00008f<<24);
var iii:uint = ii;
if(i == iii)fn((0x000000ff| (0x0000ff<<8)| (0x0000ff<<16)| (0x00008f<<24)));

上記と逆で、ビット演算の結果をuintで受けた後、intに代入する。ifでint同士を比較してもtrueとなる。

var i:int = 0x8fffffff;
var ii:uint = 0x000000ff| (0x0000ff << 8)| (0x0000ff<<16)| (0x00008f<<24);
var iii:int = ii;
if(i == iii)fn((0x000000ff| (0x0000ff<<8)| (0x0000ff<<16)| (0x00008f<<24)));

要は比較する時にintとuintにならなければよいので、uintでキャストしてもよい。

if(i == uint(0x000000ff| (0x0000ff << 8)| (0x0000ff<<16)| (0x00008f<<24)) )fn();

ビルド時のデバッグオプションの影響

  • デバッグプレイヤーを使用した場合、trace()でトレースが出力される
  • エラー発生時に、行番号などの詳細情報が表示される 2009-08-23

MouseEvent.ROLL_OVERとMouseEvent.MOUSE_OVERの違い

リスナを追加した親Spriteの下に子供のSpriteが複数あった場合、マウスが子供同士の上をまたがった時、イベントが発生するのがMOUSE_OVER、発生しないのがMouseEvent.ROLL_OVER。

通常はROLL_OVERを使えば要件を満たすのではないかと思う。 2009-08-23

リンク

web上でActionScriptをコンパイル、実行できるサイト

http://wonderfl.net/

参考 http://level0.kayac.com/2009/06/wonderflparticle.php

http://clockmaker.jp/blog/2008/12/wonderfl/

VisualStudio2008でFlash開発

http://www.sapphiresteel.com/Download-Amethyst-Adobe-Flex-IDE

tamarinのソースの場所

http://hg.mozilla.org/tamarin-central

Flex SDKのActionScript Compiler(バイトコードを生成) modules/asc asc.jar

参考サイト http://blog.s2factory.co.jp/yoshizu/2008/04/tamarin.html#more

http://shin1o.blogspot.com/2009/02/flexsdk.html

高速化

参考

http://www.aoi-sola.net/category/flash10/

Adobe Alchemy

これはC/C++のソースを中間コードに変換し、中間コードからASを生成し、ABCでASのバイトコードに変換する技術らしい。これによって最適化した処理が可能となる。

http://labs.adobe.com/wiki/index.php/Alchemy:Documentation:Getting_Started

setIntervalとsetTimeout

setInterval()はパラメータのメソッドを一定の間隔でえんえんと繰り返す。setTimeout()は一度だけ呼び出す。setTimeoutのつもりでsetIntervalを呼び出しているとFlashPlayerがフリーズしたりする。

FlashPlayer9 と FlashPlayer10の違い

FP9だと_root.alphaを0にして、childのalphaを1にすると、childだけ表示された。

FP10だと、_root.alphaを0にすると、childにも引き継がれて、childのalphaを1にしても何も表示されなかった。

flash埋め込み用htmlのタグの書き方

とりあえずIE7とFirefox3.5で表示だけ確認。 一時期はIEでクリックしないとFlashコンテンツがアクティブにならない現象があったが、今は解消されている。

embedタグは古い書き方とのこと。

<object width="100%" height="100%" id="MySWF">
  <param name="movie" value="MySWF.swf"></param>
  <param name="wmode" value="transparent"></param>
  <embed src="MySWF.swf" type="application/x-shockwave-flash"
    wmode="transparent" width="100%" height="100%" name="MySWF"></embed>
</object>

objectタグだけを使った方法。

<object data="MySWF.swf"
        type="application/x-shockwave-flash"
        width="100%" height="100%">
 <param name="movie" value="MySWF.swf"/>
</object>

2009-09-23

シンプルなHTMLタグだけだと両者とも表示されたが、doctypeやxmlのネームスペースの宣言を入れると、シンプルな下の書き方だと表示されないブラウザがあった。W3Cののvalidatonでembedタグは非推奨と言われるが、SWFObjectなどのJavaScriptを使う以外には今のところ上のembedタグを使うしか方法がない模様。

参考:

http://xiss.g.hatena.ne.jp/orzccc/20080716/1216226479

http://www.adobe.com/jp/devnet/flash/articles/spark_project_swf_embed.html

FlashPlayer Debug版

http://www.adobe.com/jp/support/flashplayer/downloads.html

http://www.adobe.com/support/flashplayer/downloads.html

その他セキュリティ情報

http://blogs.adobe.com/psirt/

http://www.adobe.com/support/security/

各種アップデートの入手先

http://www.adobe.com/support/security/bulletins/apsb10-06.html

WrapperHTMLファイルのwmode指定とSWFの日本語入力

WrapperのHTMLファイルのタグにwmodeを指定しているとFlashPlayer10でも日本語入力が正常に動作しない。 wmodeはFlashの背景色のパラメータ。

opaque :不透明

transparent :透過

指定をなくしておけばIE、FireFoxとも正しく入力できた。Web上の情報ではwmode指定がないとfps指定が正しく反映されないという不具合があったらしいがFlash10では修正されているらしい。なので対処としてはWrapperファイルのwmodeは指定なしにしておけばよさそう。

SWFProfiler

シンプルなプロファイラ。 メモリとFPS表示。簡単なメモリリークの検出に利用できる。

下記から入手可能。

http://www.lostinactionscript.com/blog/index.php/2008/10/06/as3-swf-profiler/


リロード   新規 編集 凍結解除 差分 添付 複製 名前変更   ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: 2010-02-20 (土) 12:18:45 (2588d)