2007-03-20
CUI での apollo 開発
だいたい apollo の開発方法解ってきた。環境は Linux で開発、コンパイル、パッケージング、windows でデバッグ。
まずコンパイルで楽するために fcwrap で -a オプション追加した(rev17)のでアポロケーションの場合は fcsh の mxmlc のオプションで自動でアレコレするのと、アプリ名-app.xml が無かったら自動でテンプレからそれっぽいのを作成してくれる。のでそれを adl に食わせれば普通に動くように。
apollo での debug は普通に trace() で flash player と同じ mm.cfg の flash_log にはかれるのでそれを tail。console.log にはきたーい…。flash_log ってファイル切り詰めるからいまいち綺麗に tail されないんだよなー。
次に .mxml を使わない開発だけど、いままでの swf だと メインとなる DisplayObjectContainer の子クラスの Foo.as 一つあればできたけど、最低基本三つ用意する。名前はお好きに。
- メインとなるクラス
- FooMain.as
- NativeWindow を継承するクラス
- FooWindow.as
- window 上で描画してあれこれするクラス(Sprite 継承らへんが無難)
- Foo.as
で、FooMain.as で Shell.shell の INVOKE イベントにイベント登録して処理開始。サンプル見ると大抵そこで NativeWindow を継承したクラスを new してコンストラクタでアレコレ処理してる。んで NativeWindow が close で閉じられたら終了する。
追記
nitoyon 『Apollo 開発ですが、DisplayObjectContainer の子クラス Foo.as 1つでいけました。ContextMenu も問題く使えます。
サンプルで回りくどいことして NativeWindow を使ってるのは、リサイズイベントをハンドルするためなんだと思います。』
とのことで、別に NativeWindow 使わなくても良いそうです。
追記おわり
というわけで以前作った HidamariCircle.swf を apollo に移植してみる。
- HidamariCircleMain.as
- HidamariCircleWindow.as
- HidamariCircle.as (以前のファイル)
まず問題点
HidamariCircle.as はコンストラクタで ENTER_FRAME 処理を始めてしまってる。んで内部で stage を参照しているため、HidamariCircleWindow でインスタンスを作ったとたんに stage アクセス→null なためエラーで死ぬ。なのでコンストラクタを start 関数へと移動。これで
var hidamariCircle:HidamariCircle = new HidamariCircle(); // 死なない
stage.addChild(hidamariCircle);
hidamariCircle.start();
とすることで回避。他はほぼコードまんまで動いた。Apollo でも一行も変更無く動くような設計で作るのはすぐできそう。あとクライアントの環境は flash.system.Capabilities で、ってこれは普通に flash player の API か。なので全画面アプリなんかは NativeWindow の継承クラスで
this.x = 0;
this.y = 0;
this.width = Capabilities.screenResolutionX;
this.height = Capabilities.screenResolutionY;
とかとか。ただこれはプライマリディスプレイの環境なのでデュアルとかのディスプレイの場合はどうすればいいのかは不明。
adl.exe の起動がめんどい。
C:\Documents and Settings\gorou\デスクトップ\apollo_sdk_alpha1_031907\bin>adl.ex
e z:\public_html\flex2\Test\apollo\HidamariCircle\HidamariCircleMain-app.xml z:\
public_html\flex2\Test\apollo\HidamariCircle
しかも cmd.exe だとイラっとくるので代替シェルつかうかなー。windows で全部開発してれば fcwrap 拡張するけど…。ruby で xml 見張って swf が更新されたらプロセス起動し直すスクリプト書いた方が早そう。
最後に .air 化して終了。adl.exe の起動以外はぜんぶ Linux でできるんだよなー。
http://rails2u.com/misc/swf/HidamariCircle.air (環境によっては超重いというウワサ)
以下ソース
他のファイルは http://lab.rails2u.com/swf/hidamari_circle の zip にだいたい。
HidamariCircleMain.as
package
{
import flash.display.Sprite;
import flash.system.Shell;
import flash.events.InvokeEvent;
public class HidamariCircleMain extends Sprite
{
public function HidamariCircleMain()
{
Shell.shell.addEventListener(InvokeEvent.INVOKE, onInvoke);
}
private function onInvoke(e:InvokeEvent):void
{
new HidamariCircleWindow();
stage.window.close();
}
}
}
HidamariCircleWindow.as
import が適当だ
package {
import flash.events.MouseEvent;
import flash.display.StageAlign;
import flash.display.NativeWindow;
import flash.display.StageScaleMode;
import flash.display.StageAlign;
import flash.display.*;
import flash.system.Capabilities;
import rails2u.debug.PerformanceViewer;
import flash.ui.ContextMenu;
import flash.ui.ContextMenuItem;
import flash.events.ContextMenuEvent;
public class HidamariCircleWindow extends NativeWindow {
private var pv:PerformanceViewer;
function HidamariCircleWindow()
{
var winArgs:NativeWindowInitOptions = new NativeWindowInitOptions();
winArgs.systemChrome = NativeWindowSystemChrome.NONE;
// 背景透過
winArgs.transparent = true;
super(false, winArgs);
this.x = 0;
this.y = 0;
this.width = Capabilities.screenResolutionX;
this.height = Capabilities.screenResolutionY;
var hidamariCircle:HidamariCircle = new HidamariCircle();
// 薄いレイヤーを重ねてる
hidamariCircle.graphics.clear();
hidamariCircle.graphics.beginFill(0xCEF7FE, 0.2);
hidamariCircle.graphics.drawRect(0, 0, this.width, this.height);
hidamariCircle.graphics.endFill();
stage.addChild(hidamariCircle);
// コンテキストメニュー
stage.showDefaultContextMenu = true;
var cm:ContextMenu = new ContextMenu();
var closeWindowMenu:ContextMenuItem = new ContextMenuItem("close");
closeWindowMenu.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, onCloseMenu);
var showPerformanceMenu:ContextMenuItem = new ContextMenuItem("show performance");
showPerformanceMenu.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, onShowPerformance);
cm.customItems.push(closeWindowMenu);
cm.customItems.push(showPerformanceMenu);
hidamariCircle.contextMenu = cm;
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
pv = new PerformanceViewer(this.stage);
visible = true;
hidamariCircle.start(); // アニメーション開始
}
private function onCloseMenu(e:ContextMenuEvent):void {
this.close(); // NativeWindow を閉じる
}
private function onShowPerformance(e:ContextMenuEvent):void {
pv.toggle();
}
}
}
HidamariCircleMain-app.xml
適当
Hidamari Circle
Hidamari Sketch ED like circle animation.
Yuichi Tateno
2007
HidamariCircleMain.swf
apollo.chm
でけた。一度ミスって作って作り直し。html パースして index 作るのに必要情報抜き出すだけで20分ぐらいかかって、その後 chm のコンパイルに10分弱ぐらいかかるのに><…。
例によって配布したらまずそうなのでアレ。んー、大元のFile.html とか JS エラーになるな。
またミスってた、トホホ。asdoc2chm をもっとまともに作った方がよさそう。。
Embed 埋め込み ttf フォントでアンチエイリアスをオフりたい
できねー。CSMSetting でカットオフ値絞っても適用されないし。うーん。
public final dynamic class Date
なんで final 宣言してるの><><。プリミティブぽいデータを内部でもつ組み込みオブジェクトは final 制限してるのかなー。
ActiveSupport の拡張 Time オブジェクト
誰か as3 にいしょくしt。もしくは一緒にペアプロでTDDしながら作ってくれる人募集(一人だとモチベーションわかない)。
f部
サムネイル要る子はいねがぁ?
要るいる!といっても常用しているわけではないので、メンテナンスコストかかるとかコードリファクタリング必要で面倒とか、ちょっとでも大変そうならいいです!
flash.display.NativeWindow
の visible プロパティがデフォルトだと false なのはハマるだろ!この先もハマりそう。
ちげーよ、自分で rootContent で明示的に visible 指定してるからだろ!
By default, visible is set to true. To create a window in an invisible state, set the visible parameter passed to the window constructor to false.
rails-1.2.3.chm
http://rails2u.com/htmlhelp/rails/
児玉さんに作れモルァーと云われたので作った。すべて自動生成したい。いまは svn co してスクリプト走らせて scp してとかやっててちょっとめんどい。
apollo docs
http://www.adobe.com/go/apollo_p1_docs
memomemo. thx typoster!
fcwrap -c '+configname=apollo'
ふつうにいけるな。んー。adl で自動起動と、*-app.xml が無かったら最小なコンフィグを自動生成してするオプションでもつけるかな。afcwrap。
ピニャータ
一つだけ大きな不満があるとしたら、なんでフォントが DFPPOP 体なんだよ!!!あのフォントは許せない…。おっさん的イメージ。
u
nk