enchant.js

戦車をドリフトさせてみたかった~enchant.js

投稿日:

 

デバッグしきれず

ゲームは難しい

サンプルをherokuにアップしました
操作方法は、左右のカーソルキーで回転、上下キーで前進後退、スペースキーで弾を撃ちます
fathomless-badlands-1127.herokuapp.com/

スケルトン

物理エンジンは結局あまり使わなかったcenterXっていう中心をとらえる便利なメソッドがあるので、それを使ったくらい

 

クラスを設定して使う

ゲームのように、似てるところがあるけど、ちょっとだけ変えるみたいなのはクラスを使うと便利

enchant.Classを使う

CoffeeScriptでもClassが使えるけどenchant.Classを使う

インスタンス化は簡単

CoffeeScriptでも()なしでよかった

グローバル変数を使う

クラスを使い出すとハマるのが変数のスコープ
必要な変数は一番外側で定義するとグローバル変数になる(参考書)

参考書

回転・移動

参考ページ

shi3z式ゲームプログラミング入門 #8 enchant.jsでプチ物理シミュレースゲームを作ってみた

ゲームの具体的なノウハウは自分で身に付けるのは大変

こういうページがあると助かる

Playerクラスに次のメソッドを加えた

 

マップのスクロール

参考ページ

enchant.jsのサンプルコードを解読する(RPG編その4)

仕組みは参考ページをみることにして簡略化した

 

弾を撃つ

参考書を参考にBulletクラスをつくった

回転する機体から弾を発射するのは意外とめんどくさい

弾の向きはそのときの機体の向きと同じでよいとして

発射の初期位置の計算は大変.特にPlayerクラスが32×32でBulletが16×16だから.

PhyBoxSpriteクラスにはSpriteの中心をset/getするcenterX、centerYっていうメソッド?(プロパティ?)があるからこれを使うと便利だった

ない場合は高校生くらいの数学の知識があれば求められるんじゃないかと思う(またはゲームプログラミングのノウハウというか定跡的な計算があるかも)

弾は線形に進むよりも初速が早くて、後は速度がだんだん落ちていく感じが良かったので擬似的に速度を減らすようにした(きっと物理とかで空気抵抗などから自然な速度の落とし方があると思う)

initializeメソッドにthis.i=20くらいの初速を設定した

そして、最後に速度がなくなると消す(destroyメソッドを使うべきなんだけど機能しない.これがバグになるとは.)

操作系はスペースキーで発射することにした

最初にキーバインドを設定してAボタンにスペースキーを割り当てる

次にPlayerのonenterframeメソッド内でAボタンが押されたかチェックする

連射できてもいいんだけど弾を装填する時間をあらわすために1秒に1度撃てるようにした

(これは正確には前に撃ってから1秒じゃないからたまに2連射することがある)

弾を重くして、敵を適当に表示させて吹っ飛ばすだけでも楽しくなってくる

敵の表示・敵の弾

EnemyクラスとEnemyBulletクラスを作る

あとは適当に動かす

このへんは抽象クラスを作って継承すればもっときれいにできるんだけど

当たり判定

当たり判定は物理エンジンがもっていて、contactメソッドを使える

ここのdestroyメソッドがなぜか機能してない removeChildだけだと何か透明なものがマップ上に残ってしまう

このバグが未だに片付けられない

 

スコア表示用のライブラリ

スコア表示用にはラベルクラスよりもう少しきれいに表示するライブラリがある

参考書だとutil.enchant.jsだけど、ui.enchant.jsに統合された

(ライブラリ内にutil.enchant.jsというファイルがあるけど開いてみるとコメントしか残ってない.紛らわしい.)

あとは参考書のとおり

index.html内でライブラリを読み込んで

グローバル変数として定義したscoreLabelを使う

あとは好きなタイミングでscoreLabel.scoreを増やせばいいだけ

 

スタート画面・終了画面用のライブラリ

スタート画面・終了画面を簡単に設定するライブラリはnineleap.enchant.js

自動でスタートするみたい

あとは任意のタイミングでgame.end()を呼べばゲームは終了する

やってみればわかるけど呼ぶタイミングが悪い

 

ソースはGistにおいた

gist.github.com/4318631

WOTに手を出したら負けとか思ってたらゲームづくりの方が時間がかかったという

バグ

  • destroyで消せない?ゴースト(見えない障害物)が残る
  • 不発弾?になるときがある
  • 突然死ぬことがある?(上のゴーストが原因か?)
  • バグじゃないけどprivate_pubでリアルタイム対戦ができるようにしたい
  • とぼけた感じの軍歌をBGMにしたい

*追記

いろいろ試してみたところdestroyメソッドはGroupにいれたPhySpriteではうまく動かないぽいのでbox2d.enchant.jsのdestroyメソッドを書き換えた

経緯はイシューに登録しておいた

github.com/wise9/enchant.js/issues/146#issuecomment-11513216

-enchant.js
-,

執筆者: