jgforceでenchant.jsを実験的にサポート

プロダクトがマイナーすぎて毎回説明しないといけないのが大変だぁ。
jgforceっていう、ゲームプラットフォームを作ろうとしていて、えーい詳しいことは過去記事を見てくれ。


jgame.jsというフレームワークは、まあそれはそれでいいんだけど、本当の当初予定はどんなフレームワークでも対応できるよって話にしたかった。
そこで、jgame.js以外のエンジンを再生可能にすることが可能か、というのの検証をかねて、enchant.jsをサポートしてみた。

再生側のデモ

とりあえずこれでゲームが遊べる。
http://jgforce.com/play/10
ゲームになってないけど、ソースコードはenchant.jsサンプルの中の、expert/actionを拝借したものなので、ゲーム性が無いのはオラのせいじゃねぇだよって事で。
素材のライセンスは確か9leapでの利用だけOKだったと思ったので、絵は非常にしょぼいので置き換えてある。

リプレーがこっち。
http://jgforce.com/view/tsugehara/10/478

製作について

ログインして、マイゲーム→新規ゲーム作成→エンジンにenchant.jsを指定して後適当にやってれば作れる。
普通のenchant.jsプログラミングと違うところがあるので、少し解説。以下がサンプル。

//これは初期用のサンプルデータです
enchant();
window.addEventListener("load", function() {
    var g = new Core(480, 480); 

    var label = new Label('Hello, enchant.js!');
    g.rootScene.addChild(label);

    game.enchant(g);
    label.tl.moveBy(100, 100, 20).moveBy(-100, -100, 20).loop();
});

注意点は下記3点ですな。

  • game.startを実行してはいけない*1
  • game.startの代わりに、game.enchantというものでenchant.jsの登録をする必要がある
  • Game(Core)クラスの生成時に、gameという変数名は使ってはいけない

そのうちfork機能をサポートしたら、サンプルゲームのソースも見れるようになるはずだけど、それまでは下記からどうぞ。
http://jgforce.com/data/tsugehara/10/1/game.js
素材のパスに注意。

注意事項

  1. マルチタッチはサポートしてない。
  2. ゲーム内でpauseやresumeをすると壊れる。
  3. プレースピードより再生スピードが大分遅い
  4. あんまりテストしてない
  5. 乱数はjgame.jsの乱数を使う必要あり。game.random(min, max)
  6. ベースとなっているenchant.jsはenchant.js v0.7

個人的に対enchant.jsで考えると、マルチタッチが致命的。
ポインティングデバイス操作時には、そのポインティングイベントのIDを保存しないといけない。でもこのIDの仕様って多分ブラウザに任せられてて統一されてない。フレームワーク側でidを数値変換してリプレーデータ用に保存してあげるとかが必要そう。


まあ、jgame.jsでマルチタッチ関連のサポートがちゃんと出来てないし、その理由が俺にタッチデバイスのテスト環境が無いって事なので、現状はお手上げ。
環境が出来たらやろうかな、どうしようかなってとこだな。

その他補足

作るのは正直結構大変だった。
元の構造がjgame.jsに完全依存してた上、enchant.jsのCoreがあんまりいじりやすい形になっていなかったので、jgame.jsとenchant.jsのブリッジを作るってのが一つと、enchant.jsのCore改造が必要の2点で時間とられた。


あと既存ゲームを持ってきて、多少いじる程度だと動作率は多分50%くらいだろうなと予想したので、昨日は一度実装を諦めたんだよね。やる意味ねーかなと思って。
プラグイン組み込んで動くのかとか、正直検証しきれないし、検証した結果動かないって可能性のが高いし。
でも途中まで手をつけちゃったし、投げるのもなんだなということで、一応形にするだけしようぜと思ってここまではやった。


今はこれを作ったからどうしようという予定も無い。
まあ、参考程度に。


次は、ライセンスとforkだな。これは設計がめんどいんだよなぁ・・。

*1:jgforce側が管理するので