やっとクラスの再設計が、ひととおり終わる。 新たに地形クラス・建築物クラス・生き物クラスの三つが加わった。 またThread系統にも、おおきく改変を加えてみた。 ほかに今まで適当につけていたクラス名や変数名などをJavaの規約にしたがったものに修正した。 「Java Code 規定 index」
これでナポレオン戦記の行軍画面や、三国志の戦略画面をつくることができる。 とりあえず前記の3クラスを用いて地図を書いてみた。 モデルはナポレオン戦記っぽい架空の戦場。 用いた地形クラスは深い川(-4)、浅い川(-3)、沼沢地(-2)、低地(-1)、平地(0)、高地(1)、丘陵地(2)、山地(3)、高山(4)。 建築物クラスは首都、都市、道路。生き物クラスは赤軍・青軍の軍隊。「ナポレオン戦記みたいなやつ」の行軍画面
あとあと、この日は、もうひとつ、とっても嬉しいことがあった。
これでチープなグラフィックが大きく改善されるかも。v(=∩_∩=)いぇい
なにがあったかは、まだひみつ。とりあえず、あとでメールかこっと♪
おとといUPした「ナポレオン戦記みたいなやつ」の行軍画面。 Unitクラスのメソッドに一箇所不備があったため軍事ユニットが、うまく動いてくれなかった。 きょうは、その原因を調べあてて問題を修正。
これで後は戦闘画面と組み合わせれば 「ナポレオン戦記みたいなやつ」は、いちおう完成ということにしてしまおう。 もちろん、ほんとはCreatureユニットの自動操縦のときのアルゴリズムをもっと練ったり、 効果音をつけたり画像や操作性をよくしたりなどの作業が必要なんだけど。…ま、いいや。
17日にメールもらったCIMAたんから、まず騎兵たんの画像がとどく。めちゃくちゃかっこいい…。 いったい、どうやったら、こんなかっこいい画像が描けるんだろう。 ちなみにCIMAたんのサイトは、こちら。ゴルラァン堂
そんなわけで、さっそくCIMAたんからいただいた画像をもとに、 「ナポレオン戦記みたいなやつ」の下にクォータービュー画面をつけてみた。 ゆくゆくは、クォータービューだけでユニットをコントロールできるようにしたいな。
また、この日、行軍画面と戦闘画面が、ついに組み合わさった。 行軍画面上の青軍のユニットと赤軍のユニットが衝突すると戦闘画面となる。
菱形の桝目を表示してみると桝目が重なる。。。 どうやらY座標の計算をまちがえていたらしい。 あらためて計算しなおすとY座標の間隔が半分になっていたことが判明。 どうりでY座標だけ、へんに過密だったわけだ。さっそく、それを修正。
あとあと、この日の夕方。CIMAたんから弓兵たんと王様たんの画像もとどく。しばし見とれて、うっとりする。
きのうまではクォータービュー画面は全ユニットを騎兵として表示していたので、あまりオブジェクト指向的ではなかったが、 CIMAたんから、あたらしく王様たんたちのグラフィックも届いたので、さっそくクォータービュー用の描画クラスをつくってみた。 いちお4月ごろの、さいしょの設計段階で2Dにもクォータービューにも、あるいは3Dにも対応できるようグラフィックエンジンはつくっていたけど、 じっさいに改造するとなると、これが、なかなかたいへん。でもどうにかお昼ごろには完成。 UnitGraphicsEngineAppQuarter.java
午前0時すぎ、歩兵たんの画像がとどく。 これでユニットの画像はぜんぶそろった。 CIMAたん、ほんとうにありがとう。☆⌒(*^-°)v Thanks!!
クォータービュー画面だけでユニットをコントロールする方法を考え付く。 つまり描画するときは奥のスクウェアから手前のスクウェアの順で読み出して、奥のスクウェアから描画していたのを逆にする。 そしてユニットに高さのデータをもたせる。 マウスが現在、指してるx座標のスクウェア列のいちばん手前のスクウェアをまず読み出す。 そこにユニットがあれば、そのユニットの高さデータをよみだす。 そしてマウスの指すy座標が、そのユニットの範囲内なら、そのユニットの「クリックされたメソッド」をよびだす。 マウスのy座標外なら、さらにひとつ奥のスクウェアデータを読み出す。そこにユニットがあれば、そのユニットの高さデータを読み出し というふうに、いちばん奥のスクウェアまで、順々によみだしていく。
Archerクラス、Infantryクラスをつくる。画像の加工も終えて、 31日の未明には歩兵・騎兵・弓兵・指揮官の全ユニットを描画させることができた。 だが2D画面において、うまく矢が描画されない。。。原因はなんなんだろう。 それに、あとクォータービュー画面で矢を描画する方法もかんがえなきゃね。。。
この数週間でクォータービュー画面がついたり行軍画面と戦闘画面がくみあわさったりアプレット自身も、おおきくさまがわりしたので、 それにあわせて操作方法などを記したHTMLファイルも、まとめてつくりなおす。 また7月17日に、ひととおり再設計がおわっていたソースコードも3日の早朝に、先のHTMLファイルといっしょにアップロード。 これを「アプレットβ.2.0」と名づけよう。
いままでのバージョンにおいては、どんなに保有兵士数の少ない軍隊も、またあるいは多い軍隊も、 戦闘モードでは一律に歩兵1600人、騎兵1600人、弓兵1600人、指揮官(指揮官親衛隊?)100人を配置していたが、 ちゃんと軍隊の保有兵士数、保有馬数、保有弓数におうじて、各兵士を生成して配置するように改良。
しかし、まだ戦闘後の処理をおこなっていない。 ゆえに戦闘で、どれだけの兵士がへっても指揮官さえ倒されなければ軍隊の保有兵士数は戦闘前のまま。 こんどは、これを改良してみようかな。
Appβ.1.2(2001年6月27日)では、 ちゃんと背後から攻撃された場合、側面から攻撃された場合、前方から攻撃された場合で、 それぞれ与えられるダメージや、受けるダメージを変えていたが、 7月17日にクラスの再設計をおこなったとき、それを一時的にソースから削除していた。きょう、それを復活させる。
2D画面削除にむけて、クォータービュー画面の強化をはかる。 まず、その第一弾として、スペースキーの押下で クォータービュー画面においても体力バーを表示できるように改良。
7月30〜31日の時点で矢が描画できなかった原因が判明する。 その原因は、じつに単純なミスでArcherクラスの攻撃メソッドを上書きし忘れていたこと。
そのため、せっかく作ったshotメソッドが呼び出されず、 さらにはshotメソッドが生成する矢オブジェクトも生成されなかったために、 当然、存在しない矢も描画されなかったということであった。。
あとあとクォータービュー版の矢は、けっきょく兵士たちの頭上に描画することにした。 いつか、ひまなときにでもz座標をもたせてアーチを描いて飛んでゆくように改造しよっと♪
弓兵クラス、飛来物クラスなどについて、いろいろな改良をくわえた。 まず弓兵の索敵アルゴリズムを改良した。 これによって攻撃範囲内に目標ユニットがいた場合は、その目標ユニットを優先的に攻撃するようになった。
弓兵の攻撃メソッドにも改良を加えた。 いままでは弓兵が敵に対して直接、攻撃していたが、 このたびの改良によって(弓兵が作成する)矢オブジェクトを介して敵ユニットを攻撃するようにしてみた。
このたびの改良によって味方の放った、ながれ矢で味方が負傷したり、 放たれた矢が到着したときには、すでにそのスクウェアに敵ユニットがいないということを表現できるようになった。 ただし、いまはまだ矢オブジェクトの攻撃力算出ルーチンをいいかげんにしているので、 今回の改良で弓兵の攻撃力が、おおきく減少した。
この数日間、いや正確には1週間くらいまえからだけどネットワークゲームをつくりたくてしょうがない。 で、16日に弓兵クラスの改良を終えたあと、その下準備としてクォータービュー部分を分離させて独立したクラスにしてみることにした。
つまりユニットの表示部分をCanvasから派生した独立クラスとする。 そして、このクラスをコンテナクラスから派生したサブクラスに所有させることにする。 いまはまだ、このCanvasクラスを所有するのはアプレットクラスなわけだが、 そのうち別のクラスが、このCanvasクラスを所有することとなるだろう。
で、今日どうにかQuarterViewerという名前のクラスを作成しおわったわけだけど、つかれた。 まず、いちばん手間取ったのはオフスクリーンを作成するcreateImage(int width, int height)の部分。
createImageは、コンストラクタメソッドのなかで呼び出しちゃいけないのね。 あるていど時間をおいて、つまり、なんらかの準備が整ってからでないとnullしか返さないみたい。 とりあえず、あしたは、このクラスにスクロールメソッドをつけてみよう。。。
きのう、つくったクォータービュー表示クラスには、スクロール機能をつけていなかったので、 それを画面のはしをクリックすることでスクロールするように改良した。
1クリックで1ドットのスクロールは使いづらいので、 クリックしつづければ、そのクリック時間に応じて大きくスクロールするようにしてみた。(最大10ドット) マシンのスペックに応じた細かな操作性への対応が、むずかしいな。。。
いままで、ひとつのページに表示してきた日記をいくつかのページに分割させた。
この日、ちょっと時間があったので 2Dグラフィックの表示部分もCanvas化してみることとした。 この2D部分はクォータービューCanvasが完成すれば削除する予定ではあるが。
きのう、いいかげんに作った2D版のCanvasクラスを完成させる。 しかし途中、朝食をつくったり部屋のかたづけをしながらのコーディングだったのに、 たった二時間で完成しちゃったよ。実作業時間は30分ちょっと。これもオブジェクト指向や構造化の恩恵なのかなあ。 ありがたや、ありがたや。。。