ASOK?
ActionScriptでFlashつくるよ
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
page top

「capture」「bubbling」に関しては日本語の資料が少ない…。

子から親を「bubbling」、親から子を「capture」と言うらしい。
MouseEventは子から親へと伝播する。つまりbubbling。
addEventListenerの引数「useCapture」をtrueに設定することで、「capture」にできる(?)

useCapture:Boolean (default = false) ― リスナーが、キャプチャ段階、またはターゲットおよびバブリング段階で動作するかどうかを判断します。useCapture を true に設定すると、リスナーはキャプチャ段階のみでイベントを処理し、ターゲット段階またはバブリング段階では処理しません。useCapture を false に設定すると、リスナーはターゲット段階またはバブリング段階のみでイベントを処理します。3 つの段階すべてでイベントを受け取るには、addEventListener を 2 回呼び出します。useCapture を true に設定して 1 度呼び出し、useCapture を false に設定してもう一度呼び出します。

EventDispatcher.addEventListener()メソッド

イベント処理段階(?)として、ターゲット段階、キャプチャ段階、バブリング段階があるみたいだ。

btnAがクリックされると、イベントオブジェクトはイベントフローをステージからイベントターゲットに向けて下がっていきます。これをキャプチャ段階と言います。

イベントターゲットであるbtnAに到達した段階をターゲット段階と言います。

イベントオブジェクトは最後にステージに向かって浮上(バブリング)します。これをバブリング段階と言います。

8-1-1.イベントモデルの概要とイベントフロー

キャプチャ段階⇒ターゲット段階⇒バブリング段階と推移するんだと。
useCaptureはどの段階で処理するかを指定するのか。

イベントがどの段階で呼ばれているのか調べるには、eventPhase プロパティを使用します。 フェーズの一覧です。

途中で処理を中断できる!

イベントは、「キャプチャ → ターゲット → パブリック」と順番に実行されますが、この流れを途中で終了したい場合は、 stopImmediatePropagation() メソッドか stopPropagation() メソッドを使用します。

 

stopImmediatePropagation() メソッドは直ちに中断したい場合に使用します。
stopPropagation() メソッドは現在のノードの処理が終わってから中断したい場合に使用します。

FlashゲームPG講座 For AS3.0【EventDispatcher クラスについて】

スポンサーサイト
page top

↓クリック

http://blog-imgs-32.fc2.com/s/a/z/sazzzzz/Event_ACTIVATE.swf

-ACTIVATE、DEACTIVATEイベント- N2-Works Air・Flash(Flex×ActionScript3.0)TIPS

page top

Capabilities.playerType の値を調べる。"ActiveX" または "PlugIn" ならブラウザ上。

ThunderboltAS3 org.osflash.thunderbolt.Logger より。

page top

メインタイムラインのparentのクラスを調べる。
親swfならStage、子swfならLoader。

page top
たぶんCastXXXXをViewControllerにして、SceneObjectをControllerにすればいいんだろな。
ただし、SceneObject以外にもControllerはあっていい。
Modelを忘れないように。

Progressionの構成がViewまわり主体になっていて、チュートリアル見てもView主体なので、どうも惑わされてしまう…。
page top
1119: 未定義である可能性が高いプロパティ STATE_NONE に静的型 Class の参照を使用してアクセスしています。

CastSpriteのサブクラス"CompleteMailError"の、static publicなプロパティを参照したときに発生。
どうみてもパスは通っている。記述も間違いない。FlashDevelopの[F4]でジャンプできてるし…

原因

FLA上のMovieClipの方を見に行ってたみたい。

CompleteMailErrorのリンケージ設定
クラス:CompleteMailError
基本クラス:project.ui.CompleteMailError

↑こうしてたせい。やっぱこう↓しないとダメか…

クラス:project.ui.CompleteMailError
基本クラス:flash.display.MovieClip
page top

AddChildの挙動を研究のつづき。

(結局)AddChildコマンドのソースを覗いてみる。

AddChildコマンドの処理内容

addChid()する。
引数childが ExecutorObject を実装して、かつ引数containerが存在しない場合、
 ExecutorObject が実行中なら中断し、
 イベントリスナ登録し、(EXECUTE_COMPLETE、EXECUTE_INTERRUPT、EXECUTE_ERROR)
 ExecutorObject に execute( new CastEvent( CastEvent.CAST_ADDED ), super.extra ) を実行。

RemoveChildコマンドの処理内容

引数childが ExecutorObject を実装して、かつ引数containerが存在しない場合、
 ExecutorObject が実行中なら中断し、
 イベントリスナ登録し、(EXECUTE_COMPLETE、EXECUTE_INTERRUPT、EXECUTE_ERROR)
 ExecutorObject に execute( new CastEvent( CastEvent.CAST_REMOVED), super.extra ) を実行。
removeChild()する。

page top

どうにも腑に落ちないし、放置してると危険なので、Progressionのキャストを研究してみる。

MovieClipに対して、AddChild,RemoveChildコマンドを使う

問題ない。なにせオフィシャルのチュートリアルが、それやってる。

そのMovieClipに対して、CastSpriteをAddChildしてみる

実行順によって差異が!

page top
シーン移動の途中で止まってしまうことがある。
うまく動いたり、動かなかったり。

とりあえず、AddChildコマンドを止めて、DisplayContainer.addChild()にしたら、大丈夫に。

自分の使い方が悪いのか。

・Flashアプリで配置しているMovieClipの親クラスをCastSpriteにしている。⇒CastSpriteをFlashIDEで配置してもいいのか?
・CastSpriteでなく、Spriteを使っているところがある。⇒全部CastSpriteにしないとダメ?
page top

initObjectのキー名は、プロパティ名とかぶっちゃダメみたい。

とかやると、それだけでダメ。

原因は、ExSpriteのコンストラクタ。これはバグとかでなく、仕様を理解してなかった自分が悪い。

page top

BitmapDataまわりのバグが多くて腹が立つ。

サイズの大きなBitmapDataを自分自身に縮小コピーすると、ゴミが描画される。

マスクしたSpriteをBitmapDataにdraw()すると、マスク位置が誤って判定される。

void element blog: drawする時はマスクにご用心
ASOK? マスクとBitmapData.draw()

BitmapData→BitmapDataの拡大には倍率に制限がある。

制限値を超えると描画自体が行われない。だいたい8倍くらいまで。
ASOK? BitmapData.draw()のスケールは8倍ぐらいまで

BitmapData.copyChannel()でアルファをコピーする場合、出力ポイントを(0,0)以外にすると、アルファ以外のチャンネルも変更されてしまう。

ASOK? BitmapData.copyChannel() のバグ

BimapData.draw(Sprite)は、表示どおりにならない場合がある。

BlendMode.ALPHA & BlendMode.LAYERを使ったマスクは正しく描画されないようだ。

page top
AS2でも怪しかったようだが、マスクしたSpriteをBitmapDataにdraw()すると、マスクがずれて認識されている。
どうも表示上の左上を基準点として扱ってしまってるみたい。
stage.align=StageAlign.TOP_LEFT;
で、一応解決。

void element blog: drawする時はマスクにご用心――AS2での症状。
page top
TextFieldとか、各種プロパティをスクリプトで設定するのが非常にめんどくさい。
ステージに配置したオブジェクトから、ASを自動生成できればいいんじゃね?

MovieClip → AS
TextField → AS
TextField → StyleSheet
page top
検証途中のメモ。

ステージ上のMovieClipをAddChildすると、うまくいくときもあるけど、たいてい
「指定したインデックスが境界外です。」
エラーが発生するよ。
page top

まずは結論から。

getDefinitionByNameまとめ

  1. 引数にクラス名を渡し、Classにキャスト。
  2. swf内にクラスを含めるため、クラスを参照しておく。
  3. クラス名はパッケージを含むフルパスで
page top

Actions

Accelerate

パーティクル全体に加速度を加える

AntiGravity

逆重力?Explosionに似ている。

ApproachNeighbours

パーティクル同士がお互いに寄ってく

BoundingBox

パーティクルがぶつかると跳ね返る

Collide

パーティクル同士がぶつかると跳ね返る

DeathZone

パーティクル消えるZone

Explosion

爆発。AntiGravityと似ているが、衝撃波の速度をコントロールできる。

GravityWell

重力

Jet

パーティクルに加速度を加える。Accelerateと似ているが、こちらはZone指定ができる。

LinearDrag

パーティクルの移動速度に対する抵抗。

MatchVelocity

パーティクル同士の移動ベクトルを合わせる。

MinimumDistance

パーティクル同士がお互いに距離を取ろうとする。

MutualGravity

パーティクル同士の反重力。

RandomDrift

パーティクルの移動ベクトルに、ランダムなベクトルを加える。

SpeedLimit

パーティクルの速度制限。

page top

ブログ編集用に、タグを挿入するブックマークレットを作ってみた。

動作環境

Google Chromeでしか試してません。悪しからず。
でも、依存性有りそうなのは、タグ挿入後のカーソル位置操作だけだと思う。たぶん…

問題点

  • <textarea>が複数あると正しく動作しない。 ver.0.1.3にて対応
  • <input>に対応してない。

使い方

  1. テキストエリアの文字列を選択
  2. ブックマークレットを実行
  3. プロンプトが出るのでタグ名を入力

DreamweaverのCtrl+Tをイメージして作りました。使ってみたらチョー便利。

参考文献

以下のページを大いにパク参考にさせてもらいました。ありがとう!

bookmarkletで選択文字列を取得することを考える - 徒書

おすすめ

Chromeエクステンションの Shortcut Manager と組み合わせると、Dreamweaverのような使い心地!自分は Alt+T に設定してます。

窓の杜 - 【REVIEW】Google Chromeに任意のショートカットキーを登録できる「Shortcut Manager」

page top

思いつき。プロパティの操作を、Rubyっぽくかけないだろうか。

こんな風に。

(Rubyの特長は、「こんな設計・構造であるべき」ではなく、「こんな処理はこう書きたい」から発想してるとこ?)

page top

Flash Player および AIR は、ActionScript 3.0 Loaderクラス、Flash オーサリングツールライブラリのビットマップ、または BitmapData オブジェクトを使用して表示されるビットマップ(JPEG、GIF または PNG ファイル)についての MIP マップを作成します。Flash Player は、ActionScript 2.0 の loadMovie() 関数を使用して表示されるビットマップについても、MIP マップを作成します。
MIP マップは、フィルタが適用されたオブジェクトまたはビットマップキャッシュされたムービークリップには適用されません。ただし、フィルタが適用された表示オブジェクト内にビットマップ変換が含まれている場合は、そのビットマップがマスクされたコンテンツ内にある場合でも、MIP マップが適用されます。
Adobe ActionScript 3.0 * ミップマッピングの利用

Flash Player に搭載されているミップマッピングは box filtering と言われる一番単純なものです。
Mip マップを有効に活用するには、画像の幅と高さを 2 で何回も割れる数値にします。
Flash Player の Mip マップサポートについて - akihiro kamijo

2010/09/01追記

初回のレンダリング時は、裏でミップマップを生成しているせいか、重い。事前に縮小しておくと、ミップマップが用意されて軽くなる、ような気がする。

page top

BitmapData → BitmapData の時、スケールが大きいと描画してくれない?

rotation()とか使うとそれによって、描画できる限界値は変化する。
確実に描画してくれるのは8倍ぐらいまで。
例外は発生しない。描画してくれなかったことを知る手段がない?

Sprite → BitmapData の場合

ベクトルなものは平気だけど、画像はやっぱりダメでした。
シェイプ、静止テキストはOK。画像は限界を超えると急に描画されなくなる。
画像も分解すればなぜかOK
→画像を外部swfにして読み込んだ場合もOKみたい。

page top

激しく勘違い、というか、ボケてたみたい。

コード1

コード2

コード2のエラー発生理由がわからない。
エラーがコマンド定義時に発生しているなら分かるが、実行時に発生しているように見える。
変数maruは、コマンド定義時にはnullだが、AddChild実行時はShapeインスタンスになっているはず。
参照渡しじゃなくて、値渡しだとか?

あれ?
何言ってんだ俺。新しいオブジェクトが代入されたんだから、当たり前じゃん。

コマンド定義時:

変数maru → null
AddChildコマンド内部からの参照 → (変数maru →)null

maru = new Shape();実行後:

変数maru → Shapeインスタンス
AddChildコマンド内部からの参照 → null(当然そのまま)

コード3

page top
ドキュメントによるとMatrix.createBox()は、identity()、rotate()、scale()、translate()を順に実行するのと同等と、書いてある。
createBox (Matrix.createBox メソッド)

実験してもその通りなんだけど、座標変換に使うなら
identity()、rotate()、scale()、translate()
じゃなくて、
identity()、scale()、rotate()、translate()
にすべきだと思うんだが。
自分の想定とは違う使い方をするためのものなのだろうか。

参考資料
四角形の自由変形
page top

2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768
65536
131072
262144
524288
1048576
2097152
4194304
8388608
16777216
33554432
67108864
134217728
268435456
536870912
1073741824
2147483648
4294967296
8589934592
17179869184
34359738368
68719476736
137438953472
274877906944
549755813888
1099511627776
2199023255552
4398046511104
8796093022208
17592186044416
35184372088832
70368744177664
140737488355328
281474976710656
562949953421312
1125899906842624
2251799813685248
4503599627370496
9007199254740992
18014398509481984
36028797018963970
72057594037927940
144115188075855870
288230376151711740
576460752303423500
1152921504606847000
2305843009213694000
4611686018427388000
9223372036854776000
18446744073709552000
36893488147419103000
73786976294838210000
147573952589676410000
295147905179352830000
590295810358705700000

page top
Copyright © 2005 ASOK?. all rights reserved.

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。