下準備中

=準備=

今日は、地形の壁などの表示まわりの作業をした。


ツクール系にあるような「壁を敷いて、床を置くと、自動的に壁が変形」というのをやるために、「状況からグラフィックを特定するためのマッピング」を作ってみたものの、その初期化に時間がかかりすぎて使えないので、別の方法を試すつもり。
あるいは、計算は別でやっておいて、できたマッピングをコードにしてimportすべきか。「4^12=16777216」のマッピングがわるわけで、それはそれでイヤだなぁ。汎用性を落とせば「2^12」とか「2^9」くらいにできはするけど、それだとただの他のゲームのコピーになるので、やっぱり別の方法を考える。

マッピング(没案)のメモ=

没にはするけど、一応メモしておく。


グラフィックの自動対応は、基本的に「そのマスと、周囲の8マス」(合計9マス)が「床か壁か」(2通り)で決まるので、「2^9」通りのパターンからグラフィックへのマッピングを用意しておけば、対応グラフィックが高速で求まる。実際には「そのマスと、周囲の8マスと、さらにその下の3マス」(合計12マス)が実用上は必要で、汎用性を高めるために「床か壁か穴か(+おまけ)」(4通り)とすると、「4^12」通りのパターンが必要になる。



コード的には、

public static const W:int = 0;//壁
public static const P:int = 1;//床
public static const H:int = 2;//穴
public static const X:int = 3;//未定

public static const A:int = -1;//全ての要素
public static const M:int = -2;//壁以外

と言う風に用意しておいて、

//壁
{
    IterX = 16;
    IterY = 1;

    Assign([A, A, A,
            A, W, A,
            A, A, A,
            A, A, A], IterX, IterY);
}

と言う風に設定していく形式にしていた。


実際の対応付けの部分は、

public static function Assign(i_Arr:Array, i_X:int, i_Y:int):void
{
	Assign_Inner(i_Arr, i_X, i_Y, 0);
}

public static function Assign_Inner(i_Arr:Array, i_X:int, i_Y:int, i_Iter:int):void
{
	var i:int;

	//再帰のためのディープコピー
	var Arr:Array = new Array();
	{
		for(i = 0; i < i_Arr.length; ++i){
			Arr.push(i_Arr[i]);
		}
	}

	//複数指定の場合、分解して再帰
	for(var iter:int = i_Iter; iter < 12; iter+=1){
		switch(i_Arr[iter]){
		case A:
			{
				Arr[iter] = W;
				Assign_Inner(Arr, i_X, i_Y, iter+1);
			}
			{
				Arr[iter] = P;
				Assign_Inner(Arr, i_X, i_Y, iter+1);
			}
			{
				Arr[iter] = H;
				Assign_Inner(Arr, i_X, i_Y, iter+1);
			}
			{
				Arr[iter] = X;
				Assign_Inner(Arr, i_X, i_Y, iter+1);
			}
			return;
		case M:
			{
				Arr[iter] = P;
				Assign_Inner(Arr, i_X, i_Y, iter+1);
			}
			{
				Arr[iter] = H;
				Assign_Inner(Arr, i_X, i_Y, iter+1);
			}
			{
				Arr[iter] = X;
				Assign_Inner(Arr, i_X, i_Y, iter+1);
			}
			return;
		}
	}

	//一つのみの指定の場合、アサインする
	{
		var index:int = 0;
		for(i = 0; i < 12; i+=1){
			index += i_Arr[i] << (i*2);
		}

		m_Map[index] = {FileName:"doukutu.png", IterX:i_X, IterY:i_Y};
	}
}

と言う感じで、「A:全てのパネル」とかの指定があれば、「P, W, H, X」に分解して再帰的に呼び出して設定する感じ。この再帰の多さと設定数の多さのため、初期化でこけた。
m_Mapさえ求まっていれば良いので、あらかじめ計算しておくことも可能ではある、という状況。