一般的にMovieClipとSpriteの違いは、
・MovieClip:タイムラインを持てる。
・Sprite:タイムラインを持てない。
リファレンスを見てもMovieClipはSpriteのサブクラスであり、タイムライン操作についてのメソッドが追加されたものとなっている。
////////////////////////////////////////////////////////////////////////
・そもそも「タイムラインを持っている」とは具体的に何なのか?
フレームを2フレーム以上持っている状態を指すらしい。
参考:ActionScript3.0入門ノート|Spriteの作成と表示
つまり
・MovieClip:フレームを2フレーム以上持てる。
・Sprite:フレームを1フレームだけ持てる。
こういうことになるのでしょう。
////////////////////////////////////////////////////////////////////////
・ここで疑問なのです。
FlashIDEではドキュメントクラスをSpriteを継承したクラスを指定することができますよね。
この場合、メインタイムラインはSprite扱いということになると思うのですが、実際はそうではないようです。
以下の画像のような状態の場合、
これをパブリッシュすると、青い四角が点滅する状態となります。
ドキュメントクラスをSpirteにしているのに、メインタイムラインは2フレーム目以降も繰り返し再生されているのです。
ちなみに、この際フレームにstop();等のスクリプトを書くと、errorとなります。
これは、フレームにスクリプトが書けるのはMovieClipだけだからという理由です。
具体的にはフレームにスクリプトを書くという行為は、内部的にはaddFrameScript()というメソッドで実装されているようで、SpirteにはこのaddFrameScript()メソッドが定義されていないから、ということのようです。
つまり、ドキュメントクラスをSpriteで定義した場合(のメインタイムライン)は、完全なSpriteでもなく、またMovieClipでもないというような中途半端な存在に思えるのです。
////////////////////////////////////////////////////////////////////////
ちなみにMovieClipとしてライブラリに登録したシンボルの基本クラスをSpriteとし、
そのシンボルのタイムラインを10フレームにした場合について、
(下画像参照)
このシンボルをステージに置いた場合のシンボルの挙動はどうなると思いますか?
先ほどのように2フレーム目以降が繰り返し再生されるのでしょうか?
答えは、黒いシェイプは点滅しません。
1フレーム目のみが描画された状態でstop();状態となり、2フレーム目以降は無視されているようです。
これが本来のSpriteの挙動であると思います。
////////////////////////////////////////////////////////////////////////
メインタイムラインだけが特別な扱いになっているのでしょうか?
こういうもんだと思えば実害は無いのですが、なんか気持ち悪いですよね。
この理由をご存知の方いましたら是非ご教授くださいませ。
テスト環境:winXP FlashCS5
Tags: AS3, Flash
東京てらこでの発表ネタとして以前作ったものを少し改造しました。
基本用途は同じですので上のリンク先を御確認ください。
◆改修点
・パラメータの入力をswfパネルからできるようにしました。
・これによりフォント名については、直接入力から、PCにインスコされているフォントから選択する形式になりました。
(入力間違いが減って便利だと思う)
・以前のものは内包するshapeの色まで変わってしまいまいたが、静止テキストの色だけを変更するようにしました。
・mxp形式でインスコできるようにしました。(CS3/CS4/CS5)
・SWFパネルを常駐させるか、コマンド実行時のみ表示させるかの2通り用意しました。
・SWFパネル常駐タイプは、フォント名リストが表示できるSWFパネルがあわせてインスコされます。
◆使い方◆
▼SWFパネル常駐タイプ
1.ウィンドウ→他のパネル→ReInitializeStaticTextを選択
2.ライブラリで変更したいMCを選択し、SWFパネルのパラメータを調整しOKをクリック
※ウィンドウ→他のパネル→FontNameでフォント名一覧が表示されるSWFパネル表示
▼コマンド実行タイプ
1.コマンド→Re-InitializeStaticTextを選択するとSWFパネルが起動
2.ライブラリで変更したいMCを選択し、SWFパネルのパラメータを調整しOKをクリック
( SWFパネルは自動で閉じる)
以下よりDL可能です。
◆CS5
コマンド実行タイプ
SWFパネル常駐タイプ
◆CS4
コマンド実行タイプ
SWFパネル常駐タイプ
◆CS3
コマンド実行タイプ
SWFパネル常駐タイプ
Adobe推奨が以下のリンク
Flex SDKコード記述に関する規則とベストプラクティス
あくまでFlexSDK用っぽいので、FlashIDEがこれに準拠するかといったら微妙っぽい。
たとえば、{で改行をどこにいれるかという点では、
FlashIDEで、function生成のショートカットキーESC+f+nで生成されるコードは、
function () {
//処理
}
規約では、{を整列させると書かれている
function ()
{
//処理
}
とはいれ、それ以外の部分は大体真似していいんじゃないかと。
◆気になった部分だけmemo
・new Array() → []
・new Object() → {}
・if(flag == true) → if(flag) (flag:Boolean,Object)
・as演算子よりもキャストを使う
・単純な条件はifよりも三項演算子を使う (ifより遅くなるんじゃないの?)
・if文が(全ての項目のステートメントが)一項目のときはブロック{}を書かない
・for、while、do文では必ずブロック{}を書く
・protected override → override protected
・static public → pubilc static
・定数は全てstaticとする
・変数を初期化するときはコンストラクタではなく宣言時にする。
?なところもあるけど一通り目を通しておいてもよさげ。
Tags: AS3, Flash
製作の上であったら便利かな、と思ったのでクラス化。
◆動機
たとえば、あるボタンを押したら外部読み込み開始するとしたら、それが失敗したときなどを考慮してにエラー処理を実装しますよね。
この実装のチェックとしては、わざとエラーが起こる状態を再現してテストしなくちゃいけない。
たとえば、読み込むべきURLが外部xmlに記述してあって、それが存在しないURLだった場合のエラー処理だったら、わざとxmlに記述されたURLを間違えたものに書き換えてチェックとか。
というようなことを以前はやってました。
が、いちいちファイル書き換えてチェックするのが面倒。
そこで、
もしshiftキーを押しながらクリックしたら、存在しないURLを読みにいくようなロジックを最初から組んどけばテスト簡単じゃね?
お客さんにエラー時の動作処理をみてもらうときも、お客さんの負担減るんじゃね?
ってことで、shiftキーとctrlキーが押されてるかどうかを判定するクラスを作りました。
Singletonで作ってあるので、最初に初期化しちゃえば、どこからでも参照可能。
消すときも、Singletonなのでクラス名で検索書ければどこで使ってるかが一目瞭然(のはず)。
使い方は以下のような感じ
//準備
//ステージに追加、これだけでOK
addChild(AddKeyDownUtil.getInstance());
//使い方、以下のプロパティを参照して、true/falseを取得できる
//シフトキーが押されてたら、true,押されてなかったらflaseを返す
AddKeyDownUtil.getInstance().isShiftDown;//戻り値:Boolean
//コントロールキーが押されてたら、true,押されてなかったらflaseを返す
AddKeyDownUtil.getInstance().isCtrlDown;//戻り値:Boolean
//使用例)
//_btnがクリックされたときにシフトキーが押されているかいないかで処理を分岐
_btn.addEventListener(MouseEvent.CLICK, clickHandler);
private function clickHandler(e:MouseEvent):void {
if(AddKeyDownUtil.getInstance().isShiftDown){
//シフトキーが押されていた場合に実行したい処理
}else{
//シフトキーが押されていない場合に実行したい処理
}
}
クラスファイルは以下の通り
package bz393.util {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
/**
* ...
* @author 393
*/
public class AddKeyDownUtil extends Sprite{
public static var instance:AddKeyDownUtil;
public var isShiftDown:Boolean = false;
public var isCtrlDown:Boolean = false;
public function AddKeyDownUtil(enforcer:SingletonEnforcer) { };
public static function getInstance():AddKeyDownUtil {
if (!AddKeyDownUtil.instance) {
AddKeyDownUtil.instance = new AddKeyDownUtil(new SingletonEnforcer());
AddKeyDownUtil.instance.addEventListener(Event.ADDED_TO_STAGE,init);
}
return AddKeyDownUtil.instance;
}
static private function init(e:Event):void {
AddKeyDownUtil.instance.removeEventListener(Event.ADDED_TO_STAGE, init);
AddKeyDownUtil.getInstance().stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHander);
AddKeyDownUtil.getInstance().stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHander);
}
static private function keyDownHander(e:KeyboardEvent):void {
switch (e.keyCode) {
case Keyboard.SHIFT:
AddKeyDownUtil.instance.isShiftDown = true;
break;
case Keyboard.CONTROL:
AddKeyDownUtil.instance.isCtrlDown = true;
break;
}
}
static private function keyUpHander(e:KeyboardEvent):void {
switch (e.keyCode) {
case Keyboard.SHIFT:
AddKeyDownUtil.instance.isShiftDown = false;
break;
case Keyboard.CONTROL:
AddKeyDownUtil.instance.isCtrlDown = false;
break;
}
}
}
}
class SingletonEnforcer {
};
Tags: AS3, Flash, OREORELibrary