「P は Python の P <実戦編>」
〜やるぞ作るぞRPG!〜
NP-5 GUI化の検討
本来はGUIにまで拡張する予定は無かったのですが、若干問題がでてきたので、
新しいシステムに進む前に、GUI化を考えてみたいと思います。
GUI化には、直感的に操作できるというメリットがありますが、マウスによる
アプリケーションの操作は、慣れてもあまり速くならず、だんだんうざったく
なってくる、というデメリットがついてまわります。
また、プログラミングも複雑になり、それだけプログラム構造もそれを理解
するための知識も必要となりますので、私個人としては(HSPのような、ホント
にお手軽なGUIアプリ作成システム以外)、あまりGUIアプリケーションは作りた
くないと思っていました。
しかし、コンソール表示では、表示画面のクリアさえままならない、という
現状から、あえてGUI化を考えました。
まぁ、発展的に考えれば、グラフィックの表示などの可能性もでてきたわけ
なので、あまり深刻に考えずにとりくんでみたいと思います。
※前回ようやく完成にこぎつけたメニューモジュールについても、基本的な方
針はそのままで、GUI化してみたいと思います。
GUIモジュールは、標準のTkinter(Python/Tk)を使用します(他のものを使う
には、まだ資料と経験が不足しているので)
日本語表示については、どうもあまり面白いことになりそうにないので、ど
うしても、というときは裏技(画像表示)でごまかそうかと思います。
また、Tkの本家、Tclだと、コマンドの拡張によるプログラミングスタイルが
基本ですので、数値処理とか画面処理とかあまり考えないでがんがん書いてい
くのが正統なのでしょうが、折角Pythonを使っているわけですし、RPGという拡
張の可能性が非常に高いゲームをプログラムする以上、今まで同様、オブジェ
クト指向・モジュール化推進の方向で、できるだけやっていきたいと思います。
まず、非常に大まかな形から設計してみましょう。
入 力[Tk]
↓
処 理[Python]
↓
出 力[Tk]
入出力を別モジュールにする必要はありませんが、GUIモジュールの内容はで
きるかぎり見映えと操作性だけに抑え、実際のゲーム進行や内容を扱うモジュー
ルは、分離しておくようにします。
さらに、各々のモジュールが別々にGUIモジュールを呼び出すのはまずいので、
定石どおり代理人を使ってみましょう(無論、素人の私が理解できる代理人モデ
ルの意味なんて、この程度です。勘違いしてたら、誰か訂正して☆)
<基本形1>
GUI(入力)
↓
代理人
↓
各種処理モジュール
↓
代理人
↓
GUI(出力)
これで、実装(GUI)にかかわるのは代理人だけになるので、GUIの変更などが
あっても変更は最小限で済むわけです。
※GUIと書いた部分は、実際はTkinterを使ったPythonによるインターフェイス
をコーディングしてるだけですけどね。
Tkinterのmainloop()が始まると、Tkinterを通してしかプログラムは呼び出
せなくなるので、ゲームの進行状態を管理するスケジューラがどうしても必要
になります。
代理人がどの処理モジュールを呼び出すかについても、基本的にはスケジュー
ラに問い合わせることになります。
<基本形2>
GUI(入力)
↓
代理人←スケジューラ
↓
各種処理モジュール←→スケジューラ
↓
代理人
↓
GUI(出力)
代理人とスケジューラをまとめてしまいたいのは人情ですが、激しい出入り
や、頻繁な仕様変更が予想される代理人の中にスケジューラを内包する危険性
は、とりあえず避けましょう。
PythonはModula-3から受け継いだ強力なモジュール化機能を使えば、モジュー
ル化に必要な労力はほとんど必要無いはずです。
あと、代理人はスケジューラから情報は得ますが、スケジューラ自身の情報
を更新するメッセージは、各種処理モジュールのみから行います。
ホントは、スケジューラにも代理人を立てると良いのかもしれませんが、そ
こまで複雑にする必要はないでしょう(スケジュール情報を管理するクラスのメ
ッセージの出入りチェックをしっかりしておけば十分でしょう)。
さて、これに各種データを管理するデータベースクラスを加えます。
あまりやりすぎると機能分析アンチパターンに陥る(笑)ので、セーブファイ
ルのなどの入出力については、データベースクラスのオプションとします。
<基本形3>
GUI(入力)
↓
代理人←スケジューラ
↓
各種処理モジュール←→スケジューラ
↓ ↑
代理人 ↓
↓ データベース
GUI(出力)
実際のRPGにおいて、スケジューラとデータベースが何をするかと言えば・・・
スケジューラ・・・ゲームの進行(フラグ管理、現在位置管理)
データベース・・・パーティ、キャラクターデータ(可変)
エネミーデータ(可変)
モンスターデータ(不変)
アイテムデータ(不変)
マジックデータ(不変)
NPCデータ(不変)
シナリオ,ダンジョンマップ(不変)
※NPC(Non Player Character)シナリオ内で登場する、主人公以外の固定キャラ。
オブジェクト指向言語を使わずに、ちょっとしっかりしたコンピュータRPGを
作ろうと思うと、かなり詳細な企画書と設計図が必要になると思われます。
※そーいえば昔、ゲーム会社を立ち上げでメンバー募集してたので、プログラ
マとして応募したけど、結局話が流れてしまった。そこで、中心となってた
ゲーム会社に勤めてたという某氏は、RPGのプログラムなんて簡単で、データ
の打ち込みだけが面倒だと言ってたが、それは、本当のRPGを知らなかったか
らだろうと、私は思う。
プログラムのフレームとしてはこんな感じとして、次からはゲームシステム
について再考してみたいと思います。
機械伯爵