第4章 システムの実装
4.1 アーキテクチャ
4.1.1 マップマネージャークラス
本研究において最も多くデータを保持している、そしてメインとなるクラスであ る。マップマネージャークラスはマップを表すクラスと、本ソフトを制御するため の関数を保持している。マップ構造体は以下のデータを保持している:
1. そのマスに存在しているオブジェクトのタイプ 2. そのオブジェクトのポインタ
3. マップの地形データ
ソフトが起動するとき、マップ上のマスの数だけマップクラスを生成し、二次元 配列のベクタークラスに格納し管理する。その後オブジェクトやキャラクターの生 成/移動/削除などの状況変更する際マップクラスを変更することによって、マッ プ上の全てのマス情報を管理する。
後述するセルクラス、スプライトクラスなどがユーザーの操作によって状況変更 するときも、このクラスのデータを参照して行う。
他に、サーバーモードやローカルで使用するときの全ての操作を管理しており、
マップのサイズが変更した時などはこのクラス経由でウインドウサイズの変更を行 う。また、スプライト、セル、を種類別に数個のリストに分けて保存して必要に応 じて追加・削除などの操作を行う。
画面を描画する際、まず一枚の画面分の大きさを持っているビットマップクラス を用意する。そして、セットしたタイマーがタイマーイベントを送ってきた時に、
保持している全てのセルクラスとスプライトクラスに描画命令を出し、それぞれが 自分自身を表示用のビッドマップに合成する。スプライトクラスは操作によって登 録されたアニメーションをタイマーに合わせて発動するので、マップ上でアニメー ションをしているように見せることができる。
4.1.2 クライアントクラス
他人と接続する時に使うクラスである。ユーザーが他人の部屋に入るとき(クラ イアントモード)はこのクラスが表示/データの管理をする。機能的にはマップマ ネージャークラスとそれほど変わらないが、マップクラスを持たないのが最大な特 徴である。複数のユーザーがサーバーにログインしている時に、個々のユーザーが 各自のマップデータを持っていると、通信のタイムラグなどによってお互い重ねあ ったり、サーバー側のデータと矛盾して移動しようと思ってもサーバー側が許可し ないことが考えられる。それに解消法として、全てのデータ管理はサーバー側に任 せて、自分を表すキャラクター含めて全てがサーバー側からのメッセージで稼動す るようにした。このクラスは、サーバーに居る人数分だけのスプライトクラスのリ ストと、操作や表示に必要なメソッドしか持たない。
図 4-1接続の様式図
4.1.3 セルクラス
マップ上に配置されるオブジェクト(ショートカット、フォルダ、壁、家具など)
を現すクラスである。数種類のオブジェクトを収納できるため、それらの必要なア トリビュートと種類を識別するための変数を持っている
ショートカットとフォルダはそれのフルパスであらわす文字列を保持して、呼び 出されるときそれで実行できる。フォルダかショートカットかは登録した時点で判
別して、判別するための変数に格納する。またアイコンをそのまま表示できるよう に、登録された段階でそのファイルに関連付けされたアイコンを抽出して保持する。
壁、家具など特に動作が用意されてないオブジェクトはただの障害物や飾りなので それらの要素をもたない。
そしてそれらが共通に持っている要素は、セルを配置した位置、アイコンや家具、
壁などの絵柄を保持するビットマップクラスである。ユーザーが頻繁に登録・削除 や内容の変更を行うことも考えられるので、そのインスタンスはマップクラス内に リスト構造で保持する。図4−1は家具や壁などの絵を表しているビットマップフ ァイルの一例である。たくさんの種類の障害物や家具などを用意して、ユーザーはそ の中から自由に選択して部屋を飾ることができる。ユーザーが家具や壁などを登録 した時、その中から32×32の分だけ切り取って、セルクラス内にコピーする。
図 4-2セルクラス用ビットマップの一例
4.1.4 スプライトクラス
ユーザーを表すキャラクターと、それと関連するデータを保持するクラスである。
このクラスは以下の要素を保持する:
1、ユーザーの名前
2、ユーザーが使用しているキャラクターのビッドマップ 3、現在位置
4、動作中であるかどうかを示すフラグ
5、メッセージを保持・表示する機能を持っているメッセージクラス 6、アニメーションを記憶するアニメーションクラス
キャラクターを表示するビッドマップは、同じキャラクターを4つの方向から見た 画像を、方向ごとに3枚の画像(右足前に出す、左足を前に出す、普通に立ってい る)を持たせることによって、ユーザーの操作に応じて全方向のアニメーションを 実現することができる。
図 4-3キャラクターを表すビットマップ
アニメーションする時はマスをまたがることがあるので、現在位置はマップの位置 ではなく、画面の座標である。後述する画面に表示するメソッドなどはこの値を参 照して、座標に合わせて表示する。
また、スプライトクラスは以下のメソッドを実装してある:
1、現在位置に合わせて画像を表示するメソッド
2、必要に応じて移動アニメーションを登録するメソッド 3、移動のアニメーションがない時、その場で動くメソッド
4、タイマーによって登録されたアニメーションを使用して、表示位置を変更する メソッド
アニメーションクラスは、単に方向と、移動する距離と移動の際に表示されるアニ メーションしか保持していない単純なクラスである。操作に応じて、例えば 右に 移動する という命令を受けた時、あらかじめ目的地までの4枚のアニメーション
(左足だす、両足そろう、右足出す、目的地に立っている)を登録する。そして、
事前にセットしたタイマーのタイマーイベントによってそれが発動していく仕組み である。