見出し画像

2D,疑似3Dゲームの基盤:グリッドマップ

1次元配列を利用して位置情報を作成する。

var map = {
  size : 10,
  grid :[ ]
}

var player = {
  position : 10 ,
  orientation : 0
}

function xy2n(x,y){
  return y * map.size + x;
}

function n2xy(n){
  return [ n%map.size, ~~(n/map.size) ];
}

マップサイズ:縦横のサイズは同じで正方形とする。

マップグリッド:1次元配列で表現する。

プレイヤーポジション:マップグリッドの位置情報。

プレイヤーオリエンテーション:0~3で表現される4方向。

(0:x方向、1:y方向、2:ーy方向、3:ーx方向)

xy2n:xy座標をマップグリッド位置に変換する。

n2xy:マップグリッド位置をxy座標に変換する。


プレイヤー方向を逆転させる。

player.orientation = player.orientation ^ 3;


プレイヤー方向を回転させる。

var r = [1, 3, 0, 2];
player.orientation = turn_right ? r[ player.orientation ] : r[ player.orientation ^ 3];

右回転の配列を作成し、右回転なら次の方向を参照する。

左回転の場合は方向を反転して参照すると左回転となる。


壁の有無を確認して移動させる。

var k;
var d=[1, map.size, -map.size, -1];
var n=player.position + d[ k ];
var l=map.size * map.size;
( -1 < n && n < l)
 ? !map.grid[ n ] ? (player.position=n) : ()
 : ();

k:キー入力による移動方向(0~3)

d:移動方向の一次元の位置差分

(x方向=+1、y方向=+マップサイズ、ーy方向=ーマップサイズ、ーx方向=ー1)

l:マップの上限=マップサイズの2乗

移動後のマップグリッド位置が0なら移動、マップグリッド位置が0でなければ壁、オブジェクト、キャラクタなどがあり移動できない。


プレイヤー位置からの差分でマップグリッド位置を参照したい。

var xy=n2xy(player.position);
map.grid[ xy2n(xy[0]+dx,xy[1]+dy) ];

プレイヤー位置をXYに変換して差分dx、dyを加えた値をxy2n()でグリッド位置に変換する。


位置、移動、回転が実装されるので、これに描画系を合わせれば2D、疑似3Dのゲームを簡単に作ることが出来る。

マップの移動で問題点として残るのはマップの左右の端から更に外側に移動しようとすると逆の端に移動してしまうこと。しかしこれは端を1列壁にすることで解決するのでマップ作成のルールで端を壁にすることで解決する。

この記事が気に入ったらサポートをしてみませんか?