kr_ryo 徒然日誌 <2005年8月7日分>

三國志製作記109〜三度UI変更、そしてクラス〜

暑い8月がやってまいりました(^^;;8月といえば、我が〔日曜プログラマーの部屋〕kr_ryo's HomePageの誕生月じゃあないですか(^O^)そう思って去年おととしの日誌を振り返れば、なんと毎年8月を境に、前半はルールで悩み、後半はプログラムで悩みしています(^^;;;どうも8月はひとつの山場のようですなあ〜そしてこれまた同じように、8月頃にUI、ユーザーインターフェースを再編成しています。暑い夏はもしかすると、私を先へ先へ進めようとしてくれているのかもしれません(@_@)

UIの再編成。そうです、三度、HSP時代から数えて4代目のレイアウト変更と操作性変更です(T-T)UIがへぼかったら、いかに中身がいけてても、幻滅します。いかに中身はやさしくて…いや、みなまで言いますまい(^^;;;

2年前の日誌にあるとおり、思えば開発言語をHSPからDelphiに移したのは、リストを簡単に使ってみたかったことの他、SWGのコマンドボタンをメニューバー(ファイル、とか編集とかある、青いバーの下にあるやつ)に変えてみたかったからでした。ところがメニューバーに変えてみて、実際に動かしてみると、なんというか、邪魔臭かったんですよね(~_~;)今回作り替えるためにその古いプログラムを走らせてみると、地図といいレイアウトといい、見た目は新版とあんまり変わっていないんですが、やっぱり操作がやぼったいんです。コマンドがすべてメニューバー経由なんですけど、まず、予定コマンドの量がやたらと種類が多いのです。しかも開墾だとか官位申請だとか、まるで市販ソフトをそのまま焼き移したかのような(^^;;ものもあれば、なんとか独自性を出そうと頭をひねったものも含め、様々あって、ちょっと、多い、って感じですね(~_~;)

だいたい、メニューバーはほとんどのソフトについてますけど、ツールバーのボタンよりも使われる頻度は低いんじゃあないでしょうか?手近に一発で動くツールバーのボタンがあるのに、わざわざ一回押して、動かして、また押して、ってするメニューバーを使う人はあんまりいないでしょう。私もメニューバーなんてほとんど使わないのに、なぜか最初に三國志を作るときは、メニューバーをつけるんだ!と思い込んでいました(^^;;やっぱりSWGのUIが割とWindows風でない、昔のPC-9801とかの時代のゲームを思わせ、ちょっと近代風にしてみたかったのかもしれません(^^;;;

結局メニューバーは作るのが邪魔臭いのにそれ程便利じゃなく、ボタンの方が作るのも操作するのも楽だ、ということが判明して、去年の日誌にもあるとおり、全面作り替えの羽目に陥りました(T-T)この作り替え版は、最近まで最新の現役開発版とされていながら、残念ながらお披露目もされないまま消滅するわけです(ToT)振り返ればどうやってボタンを配置するのか、ボタンの中身はどうするのかなど、なかなかいろいろ悩んだりしてますし、メニューバーよりはるかに便利な操作性(^^;;を持つ、なかなかいいできのものだったりします、しかし、時間がたちました。ここは心機一転したいところです。もっと便利な、もっと作りやすい、もっと操作しやすいUIはどんなのか?

まずもってこれまでの設計仕様では、かなりユーザーコマンドは減らされます。昔シミュレーションゲームに対して言われた(今も、か?)コマンドが多すぎて何をやっていいのかわからない、ということは、結局やめにしようということにしました。シミュレーションゲームの本質はユニットの移動にあり、コマンドの連打にあらず、ということがこれまでの検討で判明しています。

ところがなぜかそれがコンピュータシミュレーションゲームでは、ユニットの移動でなくコマンドを連打することが中心になり、同じコマンドを連打するのはつまらないから複雑なコマンドをもってきたり、コマンドの種類を増やしたりします。しかし結局目的は数値上げであり、しばらくすれば飽きてきかねません。残念ながらフリーゲームでも同じ傾向にあり、その上コマンド数が少ないため、ほんとの意味でコマンド連打でしかなく、つまらないと感じるものが少なくありません。ダイナミックでないのです。やっぱり移動こそシミュレーションゲームのメインでしょう。そう考えると、コマンド数が少なくなるので、別段UIに複雑な要素を押し込む必要もなくなります。つまりシンプルなUIでも十分対応できるのです。

ところで私が好きな操作は、本当のところ、メニューバーよりもツールバーよりも、右クリックなのです。こないだマイクロソフトマウスのボタンが動かなくなったので新しいマウスに切り換えました。なんとはじめて右ボタンがいかれたのです。白いマウスでしたが、指あか(^^;;がはっきり黒く残っていたのは右です。左ではないのです。いかに私が右クリックをよく使っていたか、ということであり、最近のプログラムは右クリックが重視されている、ということでしょう。

たとえば今の三國志のUIも、リストから武将を選択して、ボタン集積地までカーソルを移動して選択したボタンを押す、という動きをとっています。これでは左クリックしか使いませんね。自分が多用しているUIこそ便利なはずです。ここは単純に、リストから武将を選択して右クリックしてコマンドを実行するようにすれば、カーソルの移動も減り、操作しやすくなります。これで決まりです。なんと、新しいUIはボタンもメニューバーもありません。武将リストだけです。これぞ使いやすいUI…と思う(^^;;

これはかなりオブジェクト指向に影響されているといえば影響されていますね。オブジェクトたる武将を選択してはじめて何ができるか、どんなコマンドかがわかるのです。これまでのメニューバー式なら当然、ボタンであっても、まずコマンドありきです。コマンド、手続きですね。この発想の転換ですでに自分の中では旧世代となってしまった直前のボタン式も、リストから武将を選んではじめて命令できるコマンドボタンになるので、もう十分オブジェクト指向的ですけども、右クリック型でより洗練されることになります…多分(^^;;

あっさり方針は決まりましたが、実装はなかなか大変です。これまで右クリック型プログラムなんて作ったことがないので、あれこれあれこれテストしてみます。従来のプログラムでは、一連の操作を順番に作っていったたため、たとえば武将の右クリックの前には、まずスタート画面を出し、武将を作り、リストに並べ、並べ替えを作り…という感じでした。それが発想がオブジェクト指向になってからは、ボタンとリストを適当に並べ、ボタンを押したらリストにテスト武将が作られてリストされ、リストの右クリックでちゃんと右クリックメニューが出るかどうか、選択した内容が実行できるかどうか、いきなり試してみるようにできるようになりました(^O^)手続き、順番なんてどうでもいいのです。いきなりダイレクトにオブジェクトたるボタンやリストや右クリックメニューに命じてみて、ちゃんと動くかどうか試すことができました。おかげでこれまで、実際に実装のテストができるまで延々順番に土台を作っていたのが、単なるテストの切り貼りで済みます。なるほど、これがオブジェクト指向の、開発が楽になる所以ですね(^O^)

とはいえ、やっぱりできあいのボタンやリストなどは、それなりに癖があります。やっぱり最初は、この右クリックメニューはなかなか思ったようにうまく登場しない!といらついていたものです。予定していたようには出てこないんですね。関羽に命じることができることと張飛に命じることができることとを違わせようと思ったら、武将オブジェクトごとに右クリックメニュー内容を変えないといけません。また、リストの武将以外のところを右クリックしたら、武将オブジェクトに出すようなメニューが出てはいけません。

そうそう、いくら武将をクリックすればメニューを出せるとしても、じゃあファイル操作、セーブやロードなんかのときにはどうすればいいのか、ということも問題でした。専用ボタンを作るとしても、なんだか浮いてしまいます。かといってもうすっかり右クリック型メニュー好きになっている私が、今さらセーブ用にメニューバーを作って貴重なスペースを使うわけにもいきません。それであれこれ考えて思ったのが、武将でないところを右クリックすれば出てくるようにすればいい、ということでした。

これは要するに、エクスプローラの操作なんですよね。エクスプローラ、つまりWindowsの普通のファイル操作です。一応メニューバーとかツールバーもついていますけど、普通あんまり使いませんよね。ファイルやフォルダを直接左クリックして開くか、右クリックでメニューを選択しますよね。で、ファイルなど以外のところを右クリックすれば、並べ替えだとかのメニューが出てきますよね。目指しているのはあんな感じです。

DelphiはまったくWindowsと同じ操作ができる、というか、WindowsのWin32APIを使っているんですから、エクスプローラそのものと同じような操作性を持つプログラムを作ることが可能です。エクスプローラをモデルに、できるかどうか、どうやればいいかテストを続けます……とりあえずできましたね(^O^)

ところでWin32APIといえば、新しいWindowsロングホーン、いよいよ来年Windowsビスタとして発売されるらしいですね。ビスタというと車を思い浮かべてしまいますが、いよいよWindows2000の通常保守期間も切れ、来年にはXPの通常保守期間も切れることですし、新しいWindowsへの期待が…それ程高まりませんね(~_~;)我が頑丈なVAIOとWindows2000とDelphi7で十分なんですけど…で、どうやら最新の64ビットCPUはイマイチ人気もなく普及もしていないことですし、今度のWindowsビスタも32ビットと64ビットの混合型OSとなりそうですね。さすがにビスタにあわせてマシンも一斉に64ビットCPUに置き換わるわけもなく、ビスタ側も32ビットプログラムを受け付けない、とするわけにもいかず、徐々にマシンもプログラムも64ビットに置き換わりそうです。ということは、来年以降はまだWin32APIはかつての16ビットDOSプログラムのように生き残り、2009年頃以降くらいになるとさすがに古い、と言われるようになるでしょう……それまでに我が三國志が完成しているかどうか(^^;;Aいや、この三國志をプレイするために、かつてMS-DOSを残していたのと同様、古い32ビットパソコンを残している、と言われるようなゲームを作らねば(^^;;;

閑話休題、エクスプローラ風プログラムは、できることはわかっていながらなっかなかできませんでしたが、なんとか0.7日くらいで決着しました(^^;;つまり、右クリックメニュー側に問題があるんではなく、リストの方に問題、というより複雑性があったのです。このリストもエクスプローラのリストそのものですから、大きいアイコン、小さいアイコン、一覧、詳細、という4つのモードを持っている、そもそも複雑な機構なのです。反応が複雑で直感的でないため、以前えらい苦労しました(~_~;)とはいえこれのおかげで簡単にリストが作れるため、これはこれで使わないとどうしようもありません。今回も当時と同じような原因でうまくいかなかったため、前回の経験を活かして(^^;なんとか右クリックメニューUI、できそうです(^O^)

UIは以前から苦労していたのに対し、今回は予想より早くUIがつかめる目処がたってしまったので、さっそく次の課題、オブジェクトの原型たるクラス作成です。Delphiでは割と小さいプロシージャという形でプログラムの固まりを分けたり、ユニット(ここではゲームのコマ、という意味ではありません)という単位でプログラムを分割したりします。手続指向でプログラムを作っていくと、なんでこんな邪魔臭いことするんだろう、とも思えたのですが、オブジェクト指向を学べばよくわかります。つまりこれはオブジェクト指向プログラムを作りやすい仕組みなんです。ユニットごとにクラスを作ればいいのです。クラス同士は、相手を知っていて、こうやって、とメッセージを送るだけです。相手の中身がどうあろうとわかりませんし関係ありません。このメッセージに対して、こういう答えを期待している、という程度です。ですので、クラス同士を分けてプログラムをすると、ひとつのプログラムが短くなって見通しがよくなります。それがユニットだったのです。

前版含め、これまで作ってきたユニットは制御内容ごとに、表示用だのマップ用だのコマンド用だのに分かれていましたが、今ではこれが城オブジェクト、武将オブジェクト、制御オブジェクトなどに分けるべき、ということがよくわかります。そしてそういう目で意識してはじめてテストクラスを自分で作り、そういう思いでメッセージを送ってみるテストをして、確かにオブジェクトが予想どおり反応している、と確かめられました(^O^)単なるテストなのに、なんだか、命を生み出した感じがします(ToT)自分で作った機械が動くよりも、より一層、自分の思いが形になって外に飛び出した感じです。おおげさですね(^^;;しかしこいつは、自分の中に外からは変えられない属性数値を持ち、自分で動く操作を持っています。外と隔離されて自ら動く、いわば簡単な微生物のような生命です。オブジェクト指向プログラマの第一歩、ようやく踏み出しました(ToT)

ただ、その初めてのテストクラス、本チャン用の城クラスなんですよね(^^;;城はいくらなんでも微どころか生物じゃあありません(^^;;Aこの辺が、オブジェクト指向は、本やカレンダーなどのモノがお互いにメッセージを送りあうことを想定する、奇妙な世界である、と言われるところなんですよね〜

index

〔TopPage〕

このページへのリンクはフリーです。
このページについてのご意見、ご質問などは、kr_ryo_green@yahoo.co.jpまでお願いします。
Copyright 2005© kr_ryo All rights reserved.
訪問件数