むかしのファミコンゲーム、ナポレオン戦記の戦闘シーンだけを取り出したようなゲームの製作をおもいつく。 じっさいには過去にもAI搭載の似たようなゲームを作ろうと思ったけど、 おおざっぱな設計をしてC++でクラスを定義したところでほうりだしちゃった。えへへ。
今回はJavaをもちいて人間対人間のオンラインゲームにしてみようとおもう。 というより今回の主目的はソケットクラスやTCP/IPのおべんきょう。 Sunのサイトや参考書と、にらめっこしているよりも、そのほうが楽しめそうだしね。
あとあと人間対人間のゲームだと兵士のアルゴリズムを考える必要ないし。
なんだかんだで、けっきょくアプレット版も、つくってみることにした。 というか、この日のちょっと前に、そうきめた。 んで、あらためて新ディレクトリtacticsAppを、この日つくった。うふふふふ。
あと、どうやらこの日に操作性を改善したのかも。 兵士の向きは、いままでは、たんにマウスクリックで時計まわりにターンするだけだったんだけど、 この日にキーボード上のカーソルキーでコントロールできるようにしたみたい。 とりあえず、コントロール用の矢印画像は、この日つくった。(ファイルやフォルダのプロパティより)
とりあえず完成したのでGeocitiesにスペースを借りてきてアップ。
でも、ぜんぜん、うごいてくれないよ。(××)
やっぱりメディアトラッカーつけなきゃ、だめみたいね。。。。
過去につくったアプレットを参考にメディアトラッカーをつけてみる。 無事コンパイルできことだしテレホタイムをまたずに、さっそくアップ。 とりあえず、うごいた。うれしいな。。。。 これを「アプレットα.1.0」と名づけよう。
この製作日誌を書き始める。 いっそCGIと組み合わせてアプレット版の対戦ゲームもつくってみようかな。。。でも、めんどくさそう。 とりあえず地形データをつくって、兵士たちに停止命令をあたえられるようにして飛来する矢を描画して、あと戦闘ルーチンも書きかえよう。。。
とりあえずサイトの構成を作り変える。あとあとソースファイルも公開。でもソースむちゃくちゃ。はずかしいな。。。 あとは過去のバージョンもアップしなくちゃね。。。
兵士に歩行停止機能をつけた。shiftキーを押せば画面上の(矢印)が(停止用の矢印)に変化。 この状態で兵士をクリックすると兵士は歩行を停止。矢印をもとにもどすには、もういちどshiftキーを。
王様たんの画像が完成。でも、ぶさいく。
いっそ馬を白馬にして、ついでに鞍覆いをかけてみようかな。青軍の王様は青い鞍覆い。赤軍の王様は赤い鞍覆い。
アプリケーション版のために通信機能をつけようと考えていたけど、いっそアプレット版のために兵士に自己判断機能をつけてみようかな。 これをつけて敵軍の兵士が自分で動くようになれば、とりあえずゲームとしての体裁は整うし。。。
でも、それ以前に二度三度とアプレットを起動したときにおこる不具合も解決しなくちゃね。 たぶんスレッドをきちんと終了させてないのが原因なんだろうけど。めんどくさそう。。。
とりあえず、せっかく王様の画像ファイルを作ったのだから王様クラスも作って、王様をゲームに登場させてみた。 やっぱり防御力を5に設定したから王様かたいね。
あとは王様クラスにメソッドを追加しよう。 ヒットポイントがゼロになったらボードクラスに対してメッセージを送るメソッド。 「討死にしたからゲームを終了させてね」というメッセージ。
アプレットの終了とともに、すべてのスレッドをきちんと終了するようにした。 これで17日以前からの懸案だった不具合は解決。 また、これとともにユニットクラスのメソッドcheckExistence()も修正。 マップ上に配置されていないユニットは存在しないものとしてfalseを返すようにした。 これによってマップ上に配置されていない兵士ユニットのスレッドはアプレットの終了を待つことなく終了されることとなった。 とりあえず、これを「アプレットα.1.1」と名づけようか。
(ここでいうマップ上に配置されていないユニットには、 実際にはマップ上に配置されているが、 ユニットオブジェクト自身の持つロケーションデータと 実際に配置されているマップオブジェクトのロケーションが、くいちがうものをふくむ。 このあたりはバグの温床となりかねないので、いずれ改善の要がある。 手軽にできる対策としてはマップクラスのパブリックなメソッド内部の動作を改変することにより、 マップオブジェクトと各ユニットオブジェクトのロケーションデータが齟齬をきたさないようにすることであろうか。)
兵士たちに加速度データをつけてみた。歩兵・弓兵は1。騎兵・王様は2。 いままでは、どの兵科も1歩すすむごとに速度が1だけ、あがっていたけど、 これからは騎兵・王様は1歩ごとに速度が2あがるようになった。 やっぱり加速度つけると騎兵系ユニット、とたんに強くなるね。 あとあと騎兵系ユニットに「突撃」機能をつけてみようかな。敵の兵士に突撃をしかけると、その兵士の向こうがわのマスにジャンプ。
|
→ |
|
||||||
突撃前 | 突撃後 |
---|
きょうは兵士クラスのスレッドやboardクラスを改良。 これでゲーム速度が調整できるようになった。 また、これとともに盤上の兵士全員をまとめて停止させたり、 ふたたび動かしたりも、できるようにしてみた。
そんなわけで、さっそく、この新機能を用いてポーズ機能をつけてみた。 リターンキーを押すとゲームが停止。もういちど押すとゲームが再開。 ついでにアプレットの読み込み当初は停止状態にしてみた。 これからはゲームをスタートするときは、まずリターンキーを押してね。 あとあと敵・味方どちらかの王様が討死したらゲームが停止するようにもしてみた。
ついでにプレイヤーが操作できるのは青軍の兵士だけにしてみた。 これで、あとは赤軍兵士のアルゴリズムを設定すれば、いちおゲームとしての体裁は整うかな。 それにしても、きょうは製作がはかどっちゃった。v(=∩_∩=)ぃぇぃ
めんどくさそうだと思っていたコンピュータ兵士の思考ルーチンだけど、 よく考えてみたら既存のメソッドをつかえば、いっしゅんで実装できることが判明。 つまり与えられた兵士が自分からみてどの方向にいるかを求めるメソッドgetDestDirection(soldier destSoldier)を使うのね。
具体的には、まずコンピュータ兵士に攻撃目標を覚えさせるために、兵士クラスにメンバを追加。(soldier target) そして、このtargetを既存のメソッドgetDestDirection(target)にぶちこむ。 で求められた値を兵士の進行方向を決定するメンバdirectionに代入。そんだけ。v(=∩_∩=)ぶいぶい
でも、ほんとは遠隔攻撃ができる弓兵たんとかのために、もう少し緻密にコーディングしてあげなくちゃね。 たとえば攻撃範囲に敵ユニットがいるかを算出するルーチンsearchEnemy()と組み合わせてターゲットが攻撃範囲にはいったら即時に停止とか。 あとは、ほかにもターゲットの進行方向を算出して、その方向に先回りさせたりとかね。
そんなわけで、さっそく赤軍の兵士全員のターゲットとして青軍の王様を設定してみた。 単純なアルゴリズムだから戦術も、へったくれもないけど、 とりあえず、これでゲームとしての体裁は整った。これを「アプレットβ.1.0」と名づけよう。
さてアルファからベータへバージョンアップしたわけだけど、これからどうしよう。 とりあえず飛来する矢を描画して、できれば兵士をアニメーションさせて、ついでに効果音をつけて戦闘ルーチンを改善して、 そうそう青軍の兵士にも自己判断機能をつけてみようかな…。
そんなわけで、さっそく青軍の兵士も自動化できるようにしてみた。 やりかたは自動化したい味方のユニットをマウスでクリック。 でクリックしたまま指をはなさずに攻撃目標(あるい護衛目標)ユニットのとこまでマウスをドラッグ。 その目標ユニットのところにきたらマウスボタンから指を離す。これで、その味方ユニットは与えられた目標をめざして進軍します。 ふたたび手動コントロールに戻したいときは、その自動化されたユニットをふつうにクリック。
おやすみまえに兵士たちの歩行ルーチンをちょこっと改善してみた。 これまでは前方に、ほかの兵士がいたときは現在速度を0にしていたけど、 これからは、もし前方のユニットの進行方向が自分とおなじ場合は、そのユニットとおなじ速度に減速するだけにしてみた。 もちろん前方のユニットが自分よりも速い場合は、自分の現在速度を維持。 これで騎兵による、ほかのユニットの追撃が、やりやすくなったことと、おもわれる。