2010年5月27日木曜日

Windows Live Writerによるbloggerへの投稿

スクリーンショットが取りやすそうだったのでWindows Live Writerでblogを書くことにしました。

GIGAZINEの記事

Windows Live Writer Beta 日本語版登場、実際に使ってみました

DL:http://download.live.com/writer

Bloggerの追加

image

image

image

image

image

image

超簡単でした。

ちなみにこの記事も10分で書きました。

シンタックスハイライトはソースの編集で記載すればOK。

function onClick():void
{
alert("Hello World");

}


と思ったらプラグインがありました。感謝です。



SyntaxHighlighter for Windows Live Writer



function onClick():void
{
alert("Hello Windows Live Writer");
}


一瞬ぬるぽが出ましたが、問題なく挿入できました。

2010年5月2日日曜日

Progression4でSWF埋め込み

仕事でFlash作るならフレームワーク必須やも


Flashは描画処理の部分がかなり複雑化することが多いので、

フレームワーク無しでパフォーマンスを出せる自信がありません。

progression4は、ライブラリもフルフラッシュ向けに充実していてすごく使い易いので、

単純に生産性が上がるのも嬉しいです。

http://progression.jp/ja/
http://www.gaiaflashframework.com/



フレームワーク導入でビルド時間が気になる年頃に


ビルドを気にするなんてJavaとかCのプログラマだけだろうと思ってました。

初めてProgressionを使ったときは、

Flash DevelopのFlash IDE Projectで作業していたんですが

CS4だとやはりそれなりに時間がかかります。

またパブリッシュ中に大抵「応答なし」になるのも地味にストレスだったりします。



Flex SDKのコンパイラ(fcsh)が高速だということなので、

今後はこちらを使うことにしました。



作業




Flash IDEでシンボル作成→ActionScriptに書き出し



SWFをパブリッシュ(例:assets.swf)

ソースファイルから参照しやすいパスに置く私はsrcフォルダに入れています。


Embedタグを記入


ドキュメントクラス等に、


[Embed(source='assets.swf', mimeType='application/octet-stream')]




埋め込んだswfのクラスを作成して初期化処理を書く


Progressionでこの方法を使うとすると、

Index.asのテンプレートで、初期化メソッドatReady()に書いてある、


// 開発者用に Progression の動作状況を出力します。
Debugger.addTarget( manager );
// 外部同期機能を有効化します。
manager.sync = true;
// 最初のシーンに移動します。
manager.goto( manager.syncedSceneId );

このあたりの処理が気になりました。

埋め込みSWFの初期化処理の後に行った方がよい気がするので、



[Embed(source='assets.swf', mimeType='application/octet-stream')]
private var Assets:Class;
private var _appDomain:ApplicationDomain;

override protected function atReady():void
{
initAssets();
}

//embedしたSWFの初期化
private function initAssets():void
{
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,
function(event:Event):void { _appDomain = event.target.applicationDomain; });
loader.loadBytes(new Assets());
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onAssetsLoad)
}

//assets初期化完了時
private function onAssetsLoad(e:Event):void
{
e.target.removeEventListener(Event.COMPLETE,onAssetsLoad);

// 開発者用に Progression の動作状況を出力します。
Debugger.addTarget( manager );

// 外部同期機能を有効化します。
manager.sync = true;

// 最初のシーンに移動します。
manager.goto( manager.syncedSceneId );

var asset:DisplayObject=createInstance("Asset")
//確認用にstageに表示してみる。
stage.addChild(asset);
}

public function createInstance(name:String):DisplayObject
{
return new (_appDomain.getDefinition(name) as Class);
}





こんな感じにしてみました。

こちらの記事と、seyselfさんのコメントが非常に役立ちました。ありがとうございます。

(一部改変利用。問題があれば書きなおします。)


まだFlashが行う各種初期化のタイミングがつかめていないので、もっといい方法があると思います。

(埋め込みSWFを管理するオブジェクトを定義してコンポジションするとか?冗長すぎる?)



または、リンケージしたシンボルに対して直接、


[Embed(source='assets.swf', symbol='Asset')]
public var Asset;

とすることで読み込めます。


ちなみにMovieClipをリンケージしても、

MovieClipのタイムラインに1フレームしかないとシンボルのクラスはSpriteになり、

フレームが複数あるとMovieClipになるようです。

(基本クラスがMovieClipでも同様。)


ついでにapplicationDomainについても調べてみた


SWFごとにクラス定義を分離して競合を防げる(使用形態A)

ランタイム共有ライブラリを作れる(使用形態B)

RIA等の大規模開発用のクラス整理などに使える(使用形態C)

などの利便性があるようです。


クラス定義のガベージコレクションとか想像がつきません。

実行時のクラスの挙動まで考えるとなると、本格的にOOPのノウハウが必要な気がします。


Runtime Shared LibruaryとRemote Shared LibruaryがどっちもRSLでわかりづらい。。


akihiro kamijoさんが解説しています。

livedocsはこちら

Blogger Syntax Highliter

フォロワー

自己紹介

フリーランスのエンジニアとして、ソフトウェア開発、人材育成を行っています。ITに関する技術顧問、企業研修などに興味のある方はご相談ください。