前の記事:オートバトラー系ゲーム開発日誌 #2
作業日:2019/09/05
ベンチの作成
この日はベンチを作成して、メインボード間で入れ替えをできるようにしました。
メインボード(青赤のタイル)の内部実装は純粋な一次元配列で、
- 座標値(0,0)のタイルが配列の0番目
- (0,1)が7番目
という形になっています。
この配列にベンチを一列分追加して一つの配列で処理しても良かったのですが、
メインボード上のコマだけを一括で処理したいケースなどが今後ありそうだったので、
別々の配列で管理することにしました。
ただしタッチによる駒の選択などは基本的に、
スクリーン座標
↓
ワールド座標
↓
グリッド座標(実装システム上の座標)
↓
駒を管理する配列のインデックス
と座標値から変換が行われます。
その際にグリッド座標を駒を管理する配列のインデックスを求める処理は、
public int GridPosToArrayIndex(int x, int y)
{
return x + (boardSize.x * y);
}
というシンプルな形で求めるようになっているため、
このまま座標値(0, -1)のベンチ座標をタッチから呼び出した場合、
上記メソッドで求められる配列インデックスは -7 となり、
配列の範囲外エラーが出てしまいます。
そこで、今回は上記のメソッドはそのまま残しつつ、
システムが管理しているタイルや駒にアクセスする際、配列のインデックスを見て、
処理の振り分けを行うことにしました。
GetGamePieceはクラスではなくメソッドですが、
GameBoardと駒管理配列の間にメソッドを挟み、
駒が欲しいときはかならずこのメソッドを通して取得することで、マイナスの
座標値が来ても、プラスの座標値が来てもエラーなく駒を取得できるようにしました。
逆に駒を各タイルに配置する際も同様の処理を行っています。
もっと自然な方法があるのではないか
(そもそもグリッド座標値からオブジェクトの取得を行わないとか)
という気もしますが、自分の脳みそではこれくらいしか思い浮かびませんでした。
でもこうして図にして表してみると、駒管理配列をクラスにして
カプセル化できるのではないかとか、色々次なる一手が浮かんできますね。
日誌をつけるのは良いかもしれません。