カテゴリー : Actionscript 3.0

こっそりトップページ更新

こっそりとトップページを更新しました。
前のは無駄に Tweensy とか使ってあったり、更にはなぜか Tweener も併用していたというよく分からん構成になっていたわけですが、いい加減書きなおそうと一念発起した次第です。トローンとした感じはうまくできたかなーと思います。ただ満足できてない部分もあるので、今後もバージョンアップして行こうと思います。

ソースはこちら

ListURLLoader 公開

初スパークしました!

ListURLLoader

複数のテキストデータを一度に読み込んで配列で返すクラスです。
ちなみに2次元配列版もあるけど、用途が限られ過ぎますよね・・・。
将来的にはマルチな Loader を目指します。

外部フォント埋め込み時にパブリッシュを早くするTIPS

フォントを埋め込む必要がある案件で、パブリッシュの度にフォント埋め込み処理を行っていては効率が悪いです。そこでどうにかしてフォントを外部から読むことができないかなと調べてみました。

■ フォント埋め込み用の swf を作成する

そのままなんですが、フォント埋め込み用の swf を作成します。新規作成し、Flash IDE のライブラリで右クリック、「新しいフォント」で埋め込みたいフォントを選択します。リンケージで 「ActionScript に書き出し」、「最初のフレームに書き出し」にチェックを入れます。そしてパブリッシュ。ここでできた swf をメインの swf に読み込むことで、フォントを外部読み込みとして扱うことができます。
この swf 名を「fontCollection.swf」とします。

■ メイン swf に fontCollection.swf を読み込む

以下に Progression で使う場合のやり方を記します。ついでにこないだの Singleton も絡めます。

・IndexScene ( import は省略します)
private var _fontCollection:CastLoader;
private var _singleton:Singleton;
public function IndexScene() {
	_singleton = Singleton.getInstance();
}
protected override function _onLoad():void {
	//font
	_fontCollection = new CastLoader();
	var _loaderContext:LoaderContext = new LoaderContext();
	_loaderContext.applicationDomain = ApplicationDomain.currentDomain;
	_fontCollection.load(new URLRequest("fontCollection.swf"), _loaderContext);
	_fontCollection.onCastLoadComplete = function():void {
		var _className = "リンケージで設定した時の名前";
		var _loadedFont:Font = new Font();
		var LoadedFontClass:Class = ApplicationDomain.currentDomain.getDefinition(_className) as Class;
		Font.registerFont(LoadedFontClass);
		_loadedFont = new LoadedFontClass();
				
		// 読み込んだフォントデータを Singleton へ
		_singleton.embedFontData = _loadedFont;
	}
}

・Singleton
package {
	import flash.text.Font;

	/**
	 * Singleton
	 */
	public class Singleton {

		/**
		 * own
		 */
		private static var _singleton:Singleton;
		
		/**
		 * font
		 */
		private var _embedFontData:Font;
		public function get embedFontData():Font { return _embedFontData; }
		public function set embedFontData(value:Font):void {
			_embedFontData = value;
		}

		/**
		 * constructor
		 */
		public function Singleton(observer:SingletonObserver) {
			if (observer == null) {
				throw new ArgumentError("public construction not allowed. use getInstance() method.");
			}
		}
		
		public static function getInstance():Singleton {
			if (_singleton == null) {
				_singleton = new Singleton(new SingletonObserver());
			}
			
			return _singleton;
		}
	}
}

class SingletonObserver {
	public function SingletonObserver() { }
}

・外部フォントを使いたいクラスの一部
var _embedFontData:Font = Singleton.getInstance().embedFontData;
var _tf:TextField = new TextField();
var _format:TextFormat = new TextFormat(_embedFontData.fontName);
_tf.embedFonts = true;
_tf.defaultTextFormat = _format;
_tf.text = "foobar";
addChild(_tf);


参考リンク
http://zapruder.main.jp/blog/?p=75

Singleton

AS3 用の Singleton クラス書いてみた。
変数の受渡しとか置き場所とか困った時はこれで間違いなし。

■Singleton

package {

	/**
	 * Singleton
	 */
	public class Singleton {
		
		private static var _singleton:Singleton;
		private var _foo:String = "foo";
		
		/**
		 * constructor (外から new できないようにする)
		 */
		public function Singleton(observer:SingletonObserver) {
			if (observer == null) {
				throw new ArgumentError("public construction not allowed. use getInstance() method.");
			}
		}

		// こいつから Singleton を取得する
		public static function getInstance():Singleton {
			if (_singleton == null) {
				_singleton = new Singleton(new SingletonObserver());
			}
			
			return _singleton;
		}
		
		public function get foo():String { return _foo; }
		
		public function set foo(value:String):void {
			_foo = value;
		}
	}
}

// Singleton クラスからしかアクセスできないクラス
class SingletonObserver {
	public function SingletonObserver() { }
}

■サンプル
var singleton:Singleton = Singleton.getInstance();
trace(singleton.foo);
trace(singleton.foo = "aaa");

var singleton2:Singleton = Singleton.getInstance();
trace(singleton2.foo);

// 出力結果
foo
aaa
aaa

デザインパターンもっと理解したいなと思う今日この頃。

FizzBuzz 圧縮

以前書いた FizzBuzz 問題 が圧縮されてました(笑)
Wonderfl

128 文字ってすごいなー。
数値でブール値が取れるってのは盲点でした。


【おまけ】
■残像練習

dispatchEvent について

dispatchEvent でむっちゃハマりました。
親クラスで、外部クラスのイベントを発行してくれるメソッド呼び出しても全然反応してくれませんでした。
原因特定できたので備忘録。

package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.text.TextField;
    
    public class FlashTest extends Sprite {
        
        private var _tf:TextField = new TextField();
        private var _foobar:FooBar = new FooBar();
        
        public function FlashTest() {
            
            addChild(_tf);
            
            //イベント登録の前に呼び出すとリスナーが効かない
            //_foobar.hogehoge("hoge");
            
            _foobar.addEventListener("piyo", _piyo);
            _tf.appendText("piyo : " + _foobar.willTrigger("piyo") + "\n");
            
            //イベント登録後に呼び出すと効く
            _foobar.hogehoge("hoge");
            
            _tf.appendText("piyo : " + _foobar.willTrigger("piyo") + "\n");
        }
        private function _piyo(e:Event):void{
            e.target.removeEventListener("piyo", _piyo);
            _tf.appendText("おしまい\n");
        }
    }
}

import flash.events.Event;
import flash.events.EventDispatcher;
class FooBar extends EventDispatcher{
    public function FooBar(){
    }
    
    public function hogehoge(_value:String):void{
        if(_value == "hoge") {
            dispatchEvent(new Event("piyo"));
        }
    }
}

原因はとても単純なことでした。
イベントリスナーに登録する前にイベントが発行されるわけなので、イベント拾ってくれないのは当たり前。
イベントが発行される前にイベントリスナーを登録しとかないといけません。
今まで意識してなかったのが恐ろしい^^;

ハマった時は新たに検証用ファイルを作って、ソースをシンプルにして検証するのが近道ですね。
こういう検証にも wonderfl って使えますね。


※もしドメインが nbhd6119.com と表示されていましたら、お手数ですが http://boondockradio.net/ に変更をお願いします。また、もし RSS をご登録いただいておりましたら、こちらも再登録をお願いします。

FizzBuzz問題

こんなのあったのでやってみる。

[ルール]
1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

では開始!

■まずは1から100までプリント

for(var i:uint = 1; i<=100; i++){
	trace(i);
}

■次は優先順位の高い順に条件式を書いていく。
 今回の場合は、3と5、3、5の倍数の順で。(2番目と3番目はどっちでもいいかな)
% 演算子で余剰を取得して、余りが0ならばその倍数、という条件でやります。
for (var i:uint = 1; i <= 100; i++) {
	if(i % 3 == 0 && i % 5 == 0){    
		trace("FizzBuzz");
	}else if(i % 3 == 0){
		trace("Fizz");
	}else if(i % 5 == 0){
		race("Buzz");
	}else {
		trace(i);
	}
}

■もっと簡略化
for (var i:uint = 1; i <= 100; i++) {
	i % 3== 0 && i % 5 == 0 ? trace("FizzBuzz") :
	i % 3 == 0 ? trace("Fizz") :
	i % 5 == 0 ? trace("Buzz") :
	trace(i);
}

おしまい。wonderfl にも置いておきます。
だれかTextFieldに表示させるようにしてくれればいいじゃない。


【追記】
Fork ありがとうございます!

Wonderfl

Wonderflってみた。





いやー今更ながらの初Wonderflなんですが、なんかはまってきちゃいました(笑)

Google Maps API for Flash CustomInfoWindow

探したけどなかなか見当たらなかったのでメモ。
infoWindowをオリジナルのものにしたいという時の話。

Flashのライブラリに表示させたいinfoWindowのmc作る。
その中に閉じるボタン(今回はclose_btn)を置いておく。
そしてリンケージでCustomInfoWindowとする。

んでマーカーのクリックイベント等に以下を記述。

var ciw:CustomInfoWindow = new CustomInfoWindow();
var options:InfoWindowOptions = new InfoWindowOptions({
	hasShadow: true,
	customContent: ciw,
	customCloseRect: new Rectangle(ciw.close_btn.x, ciw.close_btn.y, ciw.close_btn.width, ciw.close_btn.height)
});

//インフォウィンドウ表示
{マーカー}.openInfoWindow(options);

今回はライブラリに登録するやりかただけど、Spriteをextendsしたクラスでももちろんできる。
なので吹き出しだけライブラリに登録して、要素はasファイルから配置していくってことも可能。

かなりおおざっぱだけどもおしまい!
APIはややこしい・・・。

Google Maps API for Flash

ものすごく今更ですが。

Google様からswcで配布されているわけですが、ダウンロードページのどっから落とせるのかが分かりにくいわけで。
ページ検索で「sdk.zip」をキーワードに。

んでFlashDevelopでswcをどうやって登録するのかなーと探していたらどんぴしゃなのがありました。
こちら

以上

Return top