オリゲーフェスタ68でのネタ

毎年ネタ合戦やってるので、今年も。ただし、前日の夕方から作成開始ということでおいらはネタ度がいまいちでした。

えふおうさんはジャンプアクションものを作っているところでした。前日寝ていないどころか行きの新幹線内で音楽作っていたとかがんばりすぎでしょ。

mkeiさんはN88BASICもどきを作っていました。今回はfilesとか動いているようでしたが、この先Win32APIとか呼べるように拡張するべきかどうかという仕様策定のほうで悩んでいるようでした。たしかに参照とか面倒なことはありますし、そもそもメモリを意識しないのがBASICなので相性はすこぶる悪そうですがすげぇ。


んで、おいらは時間が無かったのでPureWindをそのまま移植してみました。

ええ、NetBeansプラグインにです。

…!?

なんかメニューにへんなのが追加されてますね。しかも一番上に堂々と。


もちろん、起動します。通常のJavaアプリ版とゲームの内容は違いません。1ドットでも違っていたら腹を切ってもよいと断言できます。


mkeiさんからボスが来た機能を追加したらいいんじゃないの?といわれましたが、実はそれはすでに考えていて、PureWindのウインドウを閉じると一応一時停止(まっとうな方法じゃないやっつけなので不具合はもちろんあります)されています。ですが、ウインドウを閉じるということは例の問題が発生します。

ええ、テクスチャが綺麗にはげましたよ。テクスチャ復元の処理を入れるまでにはさすがに時間が無かったのでこのまま放置、というわけです。

ほかにはひそかにキーボードのイベントの拾い方がなっていない(たぶんNetBeansプラットフォームの流儀にそっていない)のでキーボードで操作をする場合特殊な方法が必要になります。まずプロジェクトツリーのウインドウをクリックし、続いてPureWindの灰色の部分をクリックし、その後PureWindのゲーム画面をクリックします。これでやっとキーボードでゲームが出来るようになります。ダメダメですね。

ですから、お見せするときにはジョイスティックで操作しました。NetBeansプラグインでは超レアなモジュールではないでしょうか。ジョイスティック使うってみたことありません。Javaは標準APIではジョイスティック対応していないダメさ加減が10年以上放置されていますので、ここはJNIで実装しました。


コード的には難しいところは無かったのですが、外部ライブラリの設定方法が分からずずっと試行錯誤していました。英文ドキュメントが読めればすんなりいくという典型ですね。この辺別にソースが転がっているわけでも無いですから、ロジックそのものよりはるかに難しい。それだけにnbmファイルをプラグインの画面からインストール、アンインストールできるようになったのをみたときはうれしかったですね。依存関係とかこうなってるんだぁとか。

ここまできたら、プラグインの更新やると自動的に最新の状態になってゲームにパッチあてなくてもよいとか考えましたが、それはすでにネタの領域を超えていますね。


あと、どうやらJavaは遅いという昔のインタプリタ時代のイメージが抜けてない人がいるようです。

いまだとマシンスペックも上がってますし、VMもすさまじい成長をしています。例えば、分かりやすいところではVMそのものの大幅な高速化はJ2SE1.3、J2SE 1.4、J2SE 1.4.1、JavaSE 6、JavaSE 6 update10というタイミングで導入されています。

スーパーファミコン程度の2DゲーならばPentiumM/1GHzクラスのマシン(もはや超がつくほど古いマシンですよね)で60fpsで垂直同期フリッピングとかは標準APIのみで普通に出来ます。マルチウインドウも対応可能です。これらは5年以上前にです。音楽や効果音もPCMデータを自由にぶっこめるようになっています。DirectSoundのようにです。これは8年以上前ですかね。

比較的最近パワーアップしたupdate10ではJava2DというJavaの基本描画APIが大幅に高速化されています。通常の矩形のキャラクタ描画等は問題は無かったのですが、アルファブレンディングや拡大縮小回転をするとアクセラレーションが聞かなくなってしまい、1.5GHz推奨とか大幅にスペックを要求してしまいました。ここが標準で高速化されました。例えばWindowsだとDirect3Dレンダリングしやがるのです。

この辺は以下で書きました。

それと、本格的な描画をしたいのならば2年ほど前に正式版が出たJOGLを使うのが良いでしょう。これはJavaからOpenGLを呼べるようにするライブラリです。PureWindでも使用しています。また、BGM再生用にOggVorbisのSPIも使用しています。

というわけで、Javaの標準APIのみではスーパーファミコンX68000FM-TOWNSレベル、JOGLを使えば最新のゲーム機並みのものもJavaだけで作れるようになると覚えておきましょう。Java自体の性能ですが、確かにごくごくまれにC言語から吐き出されたバイナリより早いことはありますが、それは本当にまれです。おおむねネイティブなバイナリコードの8割程度の速度が出ると考えておくと良いようです。

ポインタがないので意味不明なバグに悩まされることも無いでしょうし、Windows以外にもLinuxMacなどに移植が容易になります(おそらく99%コードの変更は必要ないでしょう)。Windows以外ではゲームが本当に少ないのでニッチを狙うのも良いかもしれません。非リアルタイムならばさらに何の問題も無いでしょう。

Javaの特徴としてApache等膨大なライブラリの恩恵に与れるのはかなり大きいことです。例えばゲームに必要なオブジェクトを作り出す場合でもXMLや設定ファイルを書かずに、JPA等のO/Rマッピングを利用したほうがいいかもしれません。そして、データベースは組み込みデータベースを使うのです。JavaDBならばJDKに付属していますし、HSQLDBやH2といったものもあります。これらはインストールも必要ないですし、ポートあけてで待機ということもありません(やろうと思えば出来る)。データベースならば表形式でパラメータのチューニング等がものすごく楽になります。


フェスタ当日は晴れてよかったですね。

[追記]

PureWindの移植はさらっと書いてるけど、実際はJPanleに貼り付けて動くようなのはまったく考慮されて無いので、セットアップ関係は修正しまくってます。ゲーム本体のコードはいじっていませんが。将来的にはウインドウ作成まで面倒を見る、ではなくて一部分に描画させるというのもありかもしれないですね。たとえば、こういうのを作ると、ツクールみたいなのが作れるわけでして、そのプレビュー画面として使えますし。敵キャラの動きだけを見るとかはコードを書いてすぐに確認とかありですよね。

あーやっぱり先にSTGフレームワークでも作るか。シンプルに当たり判定等を全部やっていて、面の切り替えとか画像やサウンドのロードあたりだけを面倒見てくれればそれでいいようなやつ。STGはオブザーバパターンとテンプレートメソッドパターンだけで作れるので楽なんですけどね。