Archive : 2008 年 10 月

10 月 20 2008

FlashDevelopでAstro開発できるようにセットアップ

Posted by tanjo at 6:43 AM

先日 Flash Player 10 が正式リリースされたこともあり、そろそろバージョン10(Astro)向けの開発ができるようにと Flex SDK と FlashDevelop をセットアップしておきました。

Flex SDK の入手

私が今まで使ってたのはAstro未対応のバージョンでした。まずは Flex SDK を更新します。
Adobe Open Source のページからいろいろなリビジョンの Flex 3 SDK が入手できます。
» Download Flex 3 - Flex SDK - Confluence

最新マイルストーン・リリースの 3.1.0 build 2710 を使うことにしました。Adobe 製品ページから入手できる Flex 3 SDK も現在はこのリビジョンみたいです。

が!なぜだか build 2710 の Adobe Flex SDK リリースには Astro 向けコンパイルに必要な playerglobal.swc が含まれていません!Open Source Flex SDK の方には含まれていたので、オープンソース版の frameworks/libs/player/10 フォルダをそのままコピーして追加しました。

frameworks/libs/player/10/playerglobal.swc がちゃんと含まれているリビジョンでは、もちろんこの作業は不要です。ちなみに公式のFAQによると、[Adobe版] = [オープンソース版] + [非オープンソースのコンポーネント] という構成らしいので、中身に違いはないはずなのに…。

Flex SDK の設定

ほとんど設定する必要ないみたいです(^^
以前は Flash Player 10 に対応するために frameworks/flex-config.xml を編集する必要があったようですが(» 解説ページ)、3.1.0.2710 ではセットアップ済みでした。
そういうわけで、追加クラス(Papervision3Dとか)を再設定してやるだけで、他はやることなし!

スタンドアロン版 Flash Player 10 の入手

Flex 3 SDK にもスタンドアロン・プレーヤーは含まれています。(runtimes/player 以下のフォルダ)
だけどせっかく Flash Player 10 の正式版がリリースされたことだし、そっちをインストールしておきます。
» Adobe Flash Player - Downloads

上記ページの Get older versions 項のリンク先から Flash Player 10 (debugger versions) (26 MB) をダウンロードしました。Windows では flashplayer10r12_36_win_sa_debug.exe というのがスタンドアロン・プレーヤーの実行ファイルです。

FlashDevelop の設定

FlashDevelop最新版は公式サイトから入手できます。以前インストールしたときのメモはこちら
» FlashDevelop.org

グローバル設定は変更する必要ありません。Flash Player 10 をターゲットにするプロジェクトの設定だけでOK。ちなみに FlashDevelop のバージョンは 3.0.0 Beta9 を使っています。
こんなふうに設定しました。

  • Project > Propaties の Output タブにて、Platform を「Flash Player 10」に設定。
  • 同じく Propaties の Compiler Options タブにて、Advanced > External Libraries の[...]をクリックして Astro 用 SWC ライブラリのパスを入力。

2つ目は、Astro で追加された新プロパティなどの入力補完をするための設定です。これで rotationX とかを補完してくれるようになります。設定しなくても、コンパイルはできるみたいですが。
ライブラリパスは、私の環境では C:\flex_sdk_3\frameworks\libs\player\10\playerglobal.swc でした。さっきオープンソース版から追加したファイルのことですね。

なお、入力補完用のクラス定義ファイルを作ってくれたかたがいるようです。お好みでこちらもどうぞ。
» FlashDevelop3 beta9 で Shader クラスのコードヒントを表示する - blog.seyself.com

10 月 19 2008

Flash Player 10 正式リリース!

Posted by tanjo at 5:33 PM

10月15日に、Flash Player 10(Astro)が正式にリリースされました。
現在、最新版のバージョンは 10.0.12.36 です。

ブラウザ用プラグインの入手はこちら。
» Adobe Flash Playerダウンロードセンター

アップデート、デバッガ版、スタンドアロン版、古いバージョン、…とかはこちら。
» Adobe Flash Player - Downloads
*スタンドアロン版は、Get older versions のリンク先から入手できました。

10 月 09 2008

Flash Gear Solid - PV3DでVRミッション

Posted by tanjo at 4:09 PM

Papervision3Dを使って、メタルギアソリッドのVRミッション風ゲームを作ったかたがいるようです。Papervision3Dの公式ブログでも紹介されていました。

fgs

» Flash Gear Solid VR: The NIKITA Missions

完成度、難易度ともに高し!リモコンミサイルを操り、パズル感覚でターゲットを破壊してくゲームです。オリジナルのごとく、はじめのうちはチュートリアル的な内容だけど、ステージレベルが上がるにつれどんどん難しくなっていきます。主人公が段ボール箱というのも、いいセンスだ…!

残念ながらソース等は公開されていないようですが、動作はかなりサクサクしています。良くできてる…。
ムダに重くなる3Dインターフェイスなんかより、こういう単純に楽しめるコンテンツの方がFlash 3Dと相性いいのかもしれませんね。今のところは。Flash Player 10が何かを劇的に変えてくれることを密かに期待はしてますが。

10 月 08 2008

PV3Dでレースゲーム制作 20 - リプレイモード搭載

Posted by tanjo at 3:24 AM

ドライビングに関わるキー入力を記録→それを再生して車を走らせる、という流れでリプレイを作ります。キー入力だけなら1つのint値に収めることができ、座標やら回転やら荷重やらを記録するよりもだいぶコンパクトに処理できます。

キーの組み合わせを整数値に変換

たとえば、記録用の変数を用意したとして [左]が押されたら +1、[右]が押されたら +2、[アクセル]なら +4、[ブレーキ]は +8、のように設定しておけば、13 = [左] + [アクセル] + [ブレーキ] のように、0~15までの整数でどの組み合わせだったかを判断できます。

…と言うと一見すごそう?に思えるけど、2進数で書くと、[左]は +1、[右]は +10、[アクセル]は +100、[ブレーキ]は +1000 だから、1101 = [左] + [アクセル] + [ブレーキ] と、0~1111までで表現できるのは当たり前でした。(そんなことに3年も気づかなかった自分orz)

これをコードにするとこんな風になります。
まずは記録のしかた。keyPress○○ は Boolean です。

var drivingHistory:Array = new Array();
//--------------------------
//以下、メインループから呼び出し
drivingHistory.push(
	int(keyPressLeft)
	+ (int(keyPressRight) << 1)
	+ (int(keyPressSpace) << 2)
	+ (int(keyPressB) << 3)
	+ (int(keyPressDown) << 4)
);

一方再生は…

//メインループから
var input:int = drivingHistory.shift()
keyPressLeft = Boolean(input & 1);
keyPressRight = Boolean((input >> 1) & 1);
keyPressSpace = Boolean((input >> 2) & 1);
keyPressB = Boolean((input >> 3) & 1);
keyPressDown = Boolean((input >> 4) & 1);

RGB抽出のときと似ていますね。ビットシフトと論理積。
記録するときは2進数の各桁に false=0 か true=1 を代入し、再生時は逆に各桁が 1=true かどうかをチェックしてフラグを立てています。

リプレイモードへ

あとは、1周したとか、適当なタイミングで記録モードと再生モードを切り替えてあげればOK。切り替えるときに車の座標などいろいろな変数をリセットし、前回作ったリプレイ用カメラへ移行します。これでついにリプレイモードの完成です!

デモ

レースゲームデモ画面

» ゲームをプレイする (要:Flash Player 9.0.115.0以降)

このゲームのソースファイル Main.as はこちらから参照できます。

1周走るとリプレイが再生されます。
でもごめんなさい、1周するには1分もかかります。

10 月 06 2008

PV3Dでレースゲーム制作 19 - リプレイ用カメラの設置

Posted by tanjo at 4:31 PM

今度の目標はリプレイモードの搭載。
まずは、TV中継のように車を追ってくれる固定カメラを設置していきます。

この辺は、私と同じく Papervision3D でレースゲームを作っているかたの記事がとても参考になりました。ほとんど同じやり方で実装してみます。
» CgInstitute Flash コミュニティー belcro - blog | d5 さんのブログ

処理の流れはこんな感じです。しかも2Dです。

  1. 配列に各カメラの座標を登録。
  2. 車の位置から最も近い座標を割り出す。
  3. その座標にカメラを移動し、車の方を向かせる。

これで車がどんな走り方をしようが、それなりに上手く追っかけてくれます。もちろんカメラの設置場所は結構吟味しましたけど。

カメラ座標の登録

配列の中に座標を示した連想配列を入れていきます。

cameraList = new Array();
cameraList[0] = new Object();
cameraList[0] = {
	x:1200,
	y:300
};

ま、手作業だと面倒くさいので、実際は例のごとく配列作成用画像を使って自動化させます。赤がFFの点を調べて push() で配列を作っていきました。

dt_course01
*赤い点が見えない。。。クリックすると拡大表示します。

最も近い点を割り出す

車の位置から1番近いカメラ座標を求めます。
候補が20個程度なら総当たりで調べてもそんなに問題なかろう…というわけで、1つずつ距離を調べて最短を割り出しています。2点間の距離(というかその2乗)を求めるために簡単な関数を作りました。

private function targetDistance2(x1:Number = 0, y1:Number = 0, x2:Number = 0, y2:Number = 0):Number
{
	var distance:Number;
	var dx:Number = x2 - x1;
	var dy:Number = y2 - y1;
	distance = dx * dx + dy * dy;
	return distance;
}

カメラをセット

リプレイ用カメラと言っても、普段使っているドライバーズ・ビューのカメラを移動させて使い回しているだけです。上で求めた座標にカメラを移動させ、そこから車が中心になるようにカメラを回転させます。今度は2点から向きを計算する関数が必要ですね。

private function targetDirection(x1:Number = 0, y1:Number = 0, x2:Number = 0, y2:Number = 0):Number
{
	var direction:Number;		//RADIAN
	var dx:Number = x2 - x1;
	var dy:Number = y2 - y1;
	direction = Math.atan2(dy, dx);			// -π ~ π
	if (direction < 0) direction += 2 * Math.PI;	// 0 ~ 2π
	return direction;
}

角度を求めるには、タンジェントの逆関数アークタンジェントを使います。
アークタンジェント?Δy=0だったときとか、対角象限の場合分けが面倒くさ~と思いきや、ActionScript 3 には Math.atan(val) のほかに、Math.atan2(y,x) ってのがあるんですね…!atan2 なら座標がどんな値でも一発で360度しっかり求めてくれます。これは便利。

ちなみに、このゲームでは疑似3Dや2Dを多用しているせいで、カメラは水平にしか振ることができません。でも意外とそれっぽい見え方にはなってくれている、はず!

デモ

レースゲームデモ画面

» ゲームをプレイする (要:Flash Player 9.0.115.0以降)

このゲームのソースファイル Main.as はこちらから参照できます。

プレイ中に [C] キーを押すとカメラモードが切り替わります。
(今までこんな直方体の車に乗っていたと!?)

10 月 04 2008

PV3Dでレースゲーム制作 18 - PV3D 2.0 Beta 1へ移行

Posted by tanjo at 7:36 PM

先日(…といっても1ヶ月以上前ですが)、Google Codeのダウンロードページにて「Papervision3D 2.0 Beta 1」のソースコードが配布開始されました。マイナーリビジョンよりは正式公開版使った方が情報共有しやすいかな、と思い rev.585 から移行します。

ちなみに最新リビジョンが公開されているリポジトリはこちら。
http://papervision3d.googlecode.com/svn/trunk/

カメラの仕様変更

シェーダはじめPV3Dの大半の機能は「使ってません」ので、移植でつまずいたのはカメラまわりくらいでした。2.0α GreatWhite(前期)から 2.0β1 のカメラ仕様変更点とかを私なりにまとめておきます。
» 以前のカメラについてはこちらのエントリ

まず大きな変更は、Camera3D, FreeCamera3D, FrustumCamera3D の3つが統合されて(新)Camera3D になったこと。
基本的には以前の FrustumCamera3D をベースにしたような感じでしょうか。コンストラクタは以下。

Camera3D(
	fov:Number = 60,
	near:Number = 10,
	far:Number = 5000,
	useCulling:Boolean = false,
	useProjection:Boolean = false
);
  • fov(Field of View)は視野角。デフォルトは60度。
  • near, far はクリッピング平面までの距離。ただし useCulling か useProjection を設定しないと描画には反映はされません。
  • near は focus と同期を取るような仕様になっています。near を変更すると投影が変わってしまうので要注意です。

useCulling, useProjection はどちらも投影空間(視錐台)の外を間引く効果があるっぽいけど、まだ具体的な処理は確認していません。どう使い分けるのやら。

ソースを見ると useCulling は FrustumCuller クラス、useProjection は Matrix3D クラスを使っているようですが。。ベンチマークしてみても負荷の違いはほとんどありませんでした。
しかも、私の環境だと useCulling が機能しないことがあったので、とりあえず useCulling = false, useProjection = true で作業しています。

そんでもって、移植にあたって気づいた点とか。

  • 以前の FrustumCamera3D にあった Rotation系プロパティが代入しても反映されないバグは解消されています。
  • 一方、コンストラクタで fov が受け渡せないバグがあるようなので、Camera3D.as(org.papervision3d.cameras.Camera3D)のソース、コンストラクタ部分に以下のような行を追加しておきました。(参考:note.x | [PV3D2.0] Updated to beta 1
    this.fov = fov;
    
  • near が focus のエイリアスになってしまった…ということは、レンダリング分けの回で使った「遠くの方だけ描画する」という妙なテクが使えなくなってしまいました。
    しかたなく near と focus を切り分けたクラスを作って対処しています。
    即席ソース » FrustumCamera3D.as