きょうはDirectionクラスを改良しました。Directionクラスは方向を表現するクラスです。 いままでは上下左右の四方向しか表現できなかったのを左上・右上・左下・右下を加えて八つの方向を表現できるようにしてみました。また、それにともないCIMAたんにユニットの絵を八方向分、描きなおしてもらいました。
きょうもDirectionクラスの改良。 きょうは座標Aからみて座標Bはどの方向にあるか算出するメソッドを八方向対応に改良しました。 昨日めんどくさかったから、このメソッドだけ放りだしていたけれど、これでDirectionクラスは完全に八方向対応になりました。よかったよかった。
いままでUnitクラスに持たせていたUnitGraphicsEngineオブジェクトをViewerに所有させることにしました。 そしてUnitGraphicsEngineオブジェクトは、ユニットを描画するときだけUnitクラスのshow()メソッドに引数としてViewerから渡すことにしました。
これで描画機構とBoardクラス・Unitクラスが、よりいっそう分離されて、すっきりした構造になりました。 ほんとうならshow()メソッドもUnitクラスから取り除きたかったのだけど、まあ、あとでゆっくり考えよう。。。
とりあえずViewerごとにUnitGraphicsEngineを持たせることにしたので、そのUnitGraphicsEngineにDirectionオブジェクトを持たせれば、ウインドウごとのBoardの回転機能が実装できることでしょう。
デザインパターンの本を買おうと街まで出かけたけど、目的の本は、どこにも売ってなかったよ。。。 とりあえずバックアップ用のCD-RWを五枚買ってきたよ。もう、しょんぼりだよ。。。(=^..^=)みゅぅ
きょうは行軍マップにスクロール機能をつけてみました。 行軍マップの端32ドットほどをクリックすると桝目が一つスクロール。
そのあと調子にのってpaint()メソッドなどにも手を加え行軍マップの回転機能も実装してみました。 いままでの行軍マップは視点が南東から北西に固定されていましたが、これで南東・南西・北西・北東どの方角からも行軍マップを表示できるようになりました。
ただ気がかりなのはUnitGraphicsEngineApplicationQuarterクラスなどのソースコードが、きたなくなったことと、処理が若干複雑になったこと。まあ速度に影響は、まだでていないみたいだけど、あとあとメンテナンスしにくそう。。。そのうち、どうにかしなくちゃね。
デザインパターンの本を買ってきました。 きょうは2章まで読み終わりました。 とりあえず、これから一日、最低、二章づつは読んでいこうとおもいます。
JLabelクラスなどを用いて軍隊ユニットのデータ表示用コンポーネントをつくってみました。 今週中には都市のデータ表示用コンポーネントも作ることができればいいなと思っています。 おそらく、そのコンポーネントにはデータの表示だけではなく都市への命令ボタンなども、つくことでしょう。
お絵かきソフトを使って斜面の絵を落書きしてみました。 平らなスクウェアにも、すこしだけ改良をくわえてみました。 これらをうまく組みあわせればマップが立体的になり、山や川を表現することができることでしょう。
きょうは第6章のPrototypeまで読み終わりました。 あと、さっそくSingletonパターンを使ってみました。 使ってみたのはゲーム世界のスピードを調節するSpeedクラス。
きのう作った斜面の絵をもとにSlopeクラス(坂道クラス)をつくってみました。 SlopeクラスはGroundクラスのサブクラスです。
独立したクラスにする意味は、なかったような気もしますが、 これらを用いて、さっそく立体的なマップを作ってみました。
山がうまく描画できたので、ついでに平地よりも低い川のスクウェアも作って描画させてみました。 あとは、これらの川や斜面の絵を、もうすこしクオリティの高いものと取り替えるだけだな。。。
描画機構をより単純化しようと試みたのですが失敗したので、もとにもどしました。 もとにもどすついでに方向クラスを引数として渡すように改良し描画機構をつかさどるクラスにはSingletonパターンを導入してみました。
今回うまくいかなかった描画エンジンですが、これにUnitクラスの派生クラスを渡しても、そのクラスをスーパークラスのUnitクラスとしてしか認識してくれませんでした。ええ、その原因は私の設計ミスですとも。
この問題はUnitクラスの多態性の仕組みを用いれば解決するのですけれど、これを再度用いると処理が、かえって複雑になるし。。。そのうち、なんとかしよう。。。
きょうは第6章のCompositeパターンまで目を通し終わりました。 全章、読み終わったら、また、くりかえし読み返そう。。。
きょうは、どうも気力がわかないので、23時すぎまでコーディングをせずに、すごしました。 デザインパターンは第16章のMediatorパターンまで読み終わりました。 話は、かわりますが、わたしのプログラムのUnitを描画する機構はVisitorパターンに、なっているみたいです。 もっと、いいパターンはないのかな。。。自分で組み合わせて解決するしかないのかな。
行軍マップを描画するウインドウに新たにパネルをつけくわえてみました。 このパネルは行軍マップ上で現在、選択されているユニットのデータを表示します。 たとえば「X:8 Y:8 平地」といった感じのデータがJLabelクラスを利用して表示されることになります。
そのコーディング自体は二時間ほどで終わったのですが、どうもupdate()とrepaint()が、うまく動いてくれません。 しょうがないのでupdate()から呼び出されるupdateData()メソッドを直接よびだすことで解決してみました。 あとでrepaint()とupdate()についても調べてみます。。。(=^_ _^)うみゅぅ
きょうは第19章のStateパターンの途中まで読み終わりました。 この本も、この章をいれて、あと5章だな。
ハードディスクの残りも少なくなってきたのでCD-RWにバックアップを取ってリカバリ。 きょうも、たいしてコーディングできなかった。。。うみゅ。
Unitクラスにcontains(x,y)メソッドをつけ、QuarterViewerクラスのmouseMoved()メソッドを改良しました。containsメソッドは引数としてあたえられた座標が自分の中か外かを判断するメソッドです。これをQuarterViewerのmouseMovedメソッドと組み合わせることで、QuarterViewerに表示されたユニットにマウスカーソルをあわせると、そのユニットがマウスカーソルで指されているということをプログラムに理解させることが可能になりました。
そんなわけで、さっそくこの機能を使って現在マウスカーソルで指ししめされているユニットの情報を行軍マップの下のパネルに表示するようにしてみました。下のパネルとは11月16日の日記に書いたパネルです。
ふう、この1週間とにかく疲れた。。。 でも、これでQuarterViewerにかかわる最もややこしいところの実装がおわったよ。 ほんとうは簡単に実装できる都市クラスのほうを先に片付けようとおもっていたのだけど、なにはともあれ、めでたしめでたし。
さっそく昨日のメソッドをつかって軍隊ユニットをコントロールできるようにしてみました。 まず軍隊ユニットをクリックして、それから行軍マップの任意の位置をクリック。 すると軍隊ユニットは、その方角をめざして、つきすすみます。
きょうはスピードの調節機能をつけてみました。スレッドのスリープ時間を1000分の1秒から1000分の1000秒まで選べます。
きょうは一日スレッドのお勉強。 これから複数のスレッドを同じタイミングで動かさなければならないので。 にしてもスレッドって難しいですね。あちこちネットの記事よんだけど、なかなか理解できないや。
どうにかスレッドの概念も理解できたので、 複数のスレッドを待ち合わせるためのクラスをつくってみました。
このクラスはTimeクラス。Timeクラスは複数スレッドの待ち合わせだけではなく、 ゲーム上の年月日をも表現します。今回はマルチスレッド化に対応させるため過去につくったRunnableUnitListとBoardクラスを少し書きかえました。
さて時間の概念も実装できたことだし、 つぎはは田畑と都市を実装してみようかな。
さて昨日のお勉強でスレッドのことについての理解も深まったので、 きょうはスレッドを用いて画面のスクロールを実装してみました。
マウスカーソルが画面の端に0.5秒以上とどまると、その方向にむかって、まず1スクウェアだけスクロール。つぎは0.4秒後に、また1スクウェア、スクロール。この0.x秒 後にスクロールさせる機能にスレッドを使ってみました。
画面の端にカーソルがないときは、このスレッドはwait()で眠らせておきます。画面の端にカーソルがくるとnotify()で起きあがり、起きると同時に0.5秒sleepさせられます。そしてsleepから目覚めても、まだ画面の端にカーソルがあったら1スクウェア分スクロールして、はじめにもどる。はじめに戻ったら、こんどは0.4秒sleep。具体的には、そんなかんじです。
プロフィールのページをつくったよ。 好きなもの嫌いなもの、ほかに略歴とハンドルの由来などを書いてみたよ。
たしか、この前後、数日は、都市の情報を表示するためのパネルを書いていたよ。でも、もう忘れちゃった。
きょうはプロフィール用に写真をとってみたよ。
プロフィールのページを更新するために、あれこれ検索をかけてみた知ったのだけど、アダムスたん今年の春に亡くなっていたのね。まだ若かったのに。いや製作日誌とは、なんの関係もないことなのだけども。
かねてからの念願であった都市をクリックすることで表示される都市情報ウインドウをつけた。 モチーフではバグが発生。この原因はインターナルフレーム生成時に名前として渡す引数がnullであることによるものであった。 とりあえず、これで都市情報ウインドウを表示することができたわけだが、この処理は仮のものにすぎない。 いずれ、ユニットの描画にも、ユニットをクリックしたときの動作の違いにも、すべてにVisiterパターンを完全に応用してみたいとおもう。
きょうはチュートリアルのページをみながらJPopupMenuの実験。 いろいろ実験してみた結果、右クリックでも、左クリックでも、あるいはマウスの移動であろうとも、キーボードのキー押下であろうとも、ポップアップメニューを画面の好きな位置に表示できることがわかりました。さっそく、このポップアップメニューを軍隊ユニットに実装してみようとおもいます。
Unitクラスにclicked(UnitController controller)というメソッドをつけくわえてみました。またUnitControllerというクラスとWindowsManagerというクラスを新たにつけくわえました。 これからはインターナルフレームの生成は、すべてWindowsManagerのメソッドを通じて行うようにしてみようとおもいます。
インターナルフレームの生成を一つのインスタンスのみを通じて行うことで、これから先、色々なことが可能となるでしょう。たとえば生成したインターナルフレームのならびかえや、一つの都市の情報ウインドウを複数、開かないようにすることなど。
ちょこっとだけプログラムして、完成間近で、そのままほうりだす。(^・・^=)ノ⌒◇ぽいっ
4日につくりはじめたUnitクラスのclicked()メソッド、 やっと完成しました。 軍隊ユニットをクリックするとポップアップメニューが表示されるようにしてみました。 ポップアップメニューの項目は「移動」と「情報」のふたつ。 「情報」をクリックすると軍隊の情報ウインドウが開きます。「移動」をクリックすると、つぎにクリックした地点をめざして軍隊は移動をはじめます。
きょうは都市の情報ウインドウに、軍隊の生成ボタンをつけてみました。 あしたは徴兵用のスライダーをつけてみようとおもいます。
この二日間JSliderクラスを、いろいろと、いじってみました。
JSliderというのはJavaにおいてスライダーをあつかうためのクラスです。スライダーといのは、早い話スピーカーなどについている音量の調整用つまみなどのことです。このスライダーを用いて都市の市民を、兵士や職人にできるようにしてみようというわけです。
今回いちばん手間取ったのはJSliderクラスのsetMaximum()メソッドとsetValue()メソッドでした。
時間の経過とともに都市の人口は増減するわけですが、都市の人口が増減したら、それに応じて都市情報ウインドウに貼り付けた徴兵用スライダーの現在値、最大値なども変えなければなりません。
しかしスライダーの現在値や最大値を変更すると、その変更によってChangeEventが発生します。ChangeEventが発生すると、それを感知したリスナーが都市の人口・兵士数をスライダーの現在値・最大値にあわせて変更してしまうのです。
もちろんスライダーの現在値と最大値をいっぺんに変更してしまえば、なんの問題もありません。 しかし現実にはsetMaximum()を呼び出したときにChangeEventイベントが発生し、setValue()メソッドを呼び出したときにも、またChangeEventイベントが発生してしまいます。そして最初に発生したChangeEventによって、都市の人口・兵士数は意図しない数値に変えられてしまうのです。(どんな意図しない形かは、ややこしいので省略)
とりあえず今回はJSliderクラスのgetValueIsAdjusting()を用いることで、この問題を解決してみました。 このメソッドは、スライダーのつまみがドラッグされているときだけtrueを返します。setMaximum()メソッドやsetValue()メソッドの呼び出しで、スライダーのつまみが動いても、getValueIsAdjusting()はfalseを返します。ゆえに、このメソッドがtrueを返したときだけ、都市の人口・兵士数を変更するようにしてみました。
ほかの解決策としてはJSliderクラスのsetModel(BoundedRangeModel newModel)を使って、現在値、最大値をいっぺんに変更してしまうというものも考えられます。マウスでのドラッグ以外にキーボードを用いてもスライダーの値を変更できるようにするためには、最終的には後者の方法を選択するべきだとおもいます。
さっそく徴兵と職人雇用のためのスライダーを都市情報ウインドウに実装してみました。これで市民の一部を武具製造職人にしたり兵士にしたりすることが、できるようになりました。
ゲームの流れとしては、まず自国の都市情報ウインドウを開き、市民の一部を武具製造職人にします。武具製造職人は武具を作ります。そして、その製造された武具の数に応じて、市民を兵士にすることができます。
こうして都市に、あるていどの兵士がそろったら、つぎに、その兵士たちをあつめて軍隊をつくります。あとは、その軍隊を行軍させて、敵国の都市を陥落し自国の都市をふやしていくという感じです。
とりあえず軍隊作成ダイアログを作成。つぎに敵国の都市や軍隊には命令をだせないようユニットコントロールクラスを修正。そして時間があったら簡単な自己判断機能を都市に持たせてみようとおもいます。この自己判断機能はコンピュータ君主の治める都市や、プレイヤーがコンピュータに委任した都市において使われることになります。
これで今週中には敵と味方の軍隊を戦わせたり、都市を陥落させあったりが、できるようになることでしょう。
14〜15日の日記にも書いたJSliderクラスですが、けっきょく現在値、最大値をいっぺんに変更してしまうという解決策をとることにしました。そんなわけで軍隊作成用ダイアログ、職人ふりわけダイアログを作るついでに、都市ウインドウの徴兵スライダーや、職人雇用スライダーも書き換えてみました。
ところで先日の日記には、この改良を行うためにはsetModel(BoundedRangeModel newModel)メソッドを使うと書きましたが、この場合つかうべきメソッドはgetModel()メソッドです。いいかげんなことを書いて、ごめんなさい。(=^_ _^)ぺこ
// sliderはJSliderクラス型のインスタンス。
slider.getModel().setRangeProperties(変更後の値, 0, 変更後の最小値, 変更後の最大値, false );
ところで軍隊作成ダイアログと職人ふりわけダイアログをいっぺんに開いてみて気がついたのですが、インターナルフレームでスライダーを使ったときにおきたバグをひとつ記しておきます。スライダーをはりつけてある複数のインターナルフレームが同一レイヤー(層)にある場合、あとから開いたインターナルフレーム上のスライダーが描画されません。まだ、その原因はわかりませんが、これについても、おいおい調べていこうかとおもいます。
都市情報ウインドウや、軍隊作成ダイアログのために、職人や歩兵用武器などのアイコンが必要だとCIMAたんに言ったら、過去に描いていただいた弓や馬などのアイコンも、今回まとめて描きおろしていただきました。
そんなわけで、さっそく、これらのアイコンを実装してみました。軍隊作成ダイアログも職人ふりわけダイアログも、まだなにも機能はしませんが、これで形だけは整ってきました。CIMAたん、いつもありがとうございます。☆⌒ヾ(=^・・^)vThanks!!
軍隊作成ダイアログは、いろいろややこしいことが多いので、とりあえず今日は職人ふりわけダイアログのほうを完成させてみました。
昨日つくった職人ふりわけダイアログの中身を記述し、さらにCityクラスにもコードを書きたして、武器の製造をはじめさせました。
まだ暫定的なものなので、職人たちはゲームバランスも考慮せず、すさまじい勢いで「歩兵用武器」と「弓矢」を製造し続けますが、この二種類の武器の製造比率は、ちゃんと職人ふりわけダイアログで指定できます。
ちなみに歩兵用武器は市民を徴集して兵士にするのに必要で、弓矢は兵士を弓兵にするのに必要です。さらに蛇足ですが、弓兵は移動しにくい地形(沼地・城砦など)で威力を発揮し、騎兵は移動しやすい地形(平地・街道など)で威力を発揮する予定です。
きょうは夜も明けぬうちからCIMAたんに歩兵ユニットの絵を描いていただきました。でも私は、そのまま深夜におでかけ。翌日の昼過ぎまで帰りませんでした。やっぱり外出時も作業できるようにノートパソコン買おう。。。
CIMAたんに描いていただいた歩兵ユニットの絵が八方向分そろったので、さっそく軍隊の絵を武田騎馬軍団から歩兵に差し替えてみました。これで、いっそう三国志らしくなりました。
とりあえず歩兵、武田騎馬軍団と、二種類の絵がそろったので、つぎは、このふたつのユニットを敵同士ということにして戦いあわせてみようとおもいます。
きょうは、ゲームと何の関係もないのですが「親指ひゅんQ」なるソフトをインストールしてみました。このソフトは、ふつうのキーボードでのカナ入力をNICOLA配列風に変換してくれるエミュレートソフトです。
NICOLA配列というのは、いまから20年前に富士通が、その原型を開発したキー配列で、かつての「親指シフト」のことです。
おもえば、これまで、JISキーボードによるローマ字入力、JISキーボードによるカナ入力、新JISキーボードによるカナ入力、親指シフトキーボードによるカナ入力を一通りためし、そのいずれでも1分あたり最低120文字強くらいでなら楽にタイピングができますが、それでも親指シフトが、いちばん高速で負担も感じません。
これまでタイプライターやワープロで日本語を入力するために、さまざまなキーボードが開発されてきました。
たとえば大正年間に、その原型が作られた、いわゆるJISキーボード。現在、日本で発売されているたいがいのパソコンでは、このJISキーボードが、つかわれています。
しかしJISキーボードは「あ〜ん」の文字ひとつひとつを、ひとつのキーに割りふりました。そのため英語圏で用いられているキーボードとくらべるとキーの数がふえて横長になり、リターンキーなど右側のキーが押しにくくなったという欠点があります。
また、このキーボードは、あ〜んまでの文字がキーボードの縦4段に配置されているため「カナ入力」で日本語を入力するには手のひらをうかせていないと最上段のキーが打ちにくく長時間のタイピングで疲れやすいという最大の欠点があります。
そのため現在ではカナ入力によるタイピングは、ほとんど教えられることはありません。またこのJISキーボードをもちいた「ローマ字入力」にしても、前述の理由によって右側に配置されたリターンキーなどが押しにくく、またローマ字入力自体にもキーを2回押さないと、ほとんどの文字を入力できないという欠点があります。
これに対して親指シフトキーボードは複数の文字をひとつのキーに割りふることで「あ〜ん」の文字をキーボードの縦3段に配置することに成功しました。この割りふられた複数の文字を打ちわけるにはキーボード下部(スペースキーのあたり)にある「親指シフトキー」をつかいます。親指シフトキーという名前からもわかるように、このキーを押すのには親指を使います。
つまりローマ字入力と同じく、ふたつのキーの組み合わせによって、ひとつの文字を入力するわけですが、親指シフトの優れている点は、ふたつのキーを同時に押下する所です。この特色によってローマ字入力の2倍の速度で文字を入力できます。
同時押下というと、ややこしくて、むずかしくて手にも負担がかかりそうだと思うかもしれません。
しかし、もともと人間の手は、ひとさし指〜小指の四本のどれかと親指を同時に動かすのに適した構造になっています。これは木の枝など、ものをつかむために進化した猿の時代からの人間の手の特色です。
ゆえに親指シフトは、ややこしくもなければ、むずかしくもないし、手に負担もかからず、初めてでもスムーズに習得できるのです。
なお親指シフトにおける英数字キーの配列は国際的にスタンダードな、いわゆる「QWERTY配列」と寸分たがわないのでアルファベットの入力に難渋することもありません。
NICOLA日本語入力コンソーシアム NICOLA配列などの規格をさだめた団体です。
親指シフト・キーボードを普及させる会 親指シフトの普及を呼びかける親指シフトユーザーの会です。
NICOLA・キーボードフォーラム 親指ひゅんQなどのソフトがダウンロードできます。
きょうは、JDKのバージョンを1.3.1_02に更新してみました。またJava Web StartのJREも1.3.0_03のままだったので、これも今回ダウンロードしてきた1.3.1_02に設定しなおしてみました。
きょうは異国の軍隊ユニットどうしが戦いあえるようにしてみました。といっても過去につくったSoldierクラスの戦闘にかかわるメソッドをマウスで、まとめてコピーしてペーストしただけですけれど。実作業時間は10分〜20分ちょっと。
でも過去に作ったプログラムは、あちこち、いいかげんなままだから、いずれまとめて修正しなくちゃね。
たとえば戦闘に敗れて消滅したユニットへの参照をずっと保持したままになりかねないところとか。