08/02/03 11:41:33 e342ETXV
2Dの、プレイヤーキャラをリアルタイムで操作できるゲームをC#で作っているのですが、
プレイヤーキャラが壁等を通過できないようにする移動矯正アルゴリズムがうまくいかず困っています。
プレイヤーキャラは画面中心固定で、マップの方を相対的に動かします。
マップは32*32のチップをタイルのように配置します。それぞれのタイルの座標は左上のみ
2次元配列に持っておき、*32してタイルの範囲を計算します。
タイルはプレイヤー通過可・不可の属性を持っています。そこで以下のように移動矯正処理を
書いてみたのですが、例えば通過不可タイルの右側からタイルにめり込んだときに、
X軸の移動を矯正後、Y軸の移動を矯正するため、タイルの右下、もしくは右上に位置が矯正されてしまいます。
おそらく典型的な処理で、うまい方法があると思うのですが、探しても見つかりませんでした。
どういう風に処理するのが良い方法でしょうか。よろしくお願いします。
getPlayerTileIndex( プレイヤーの座標, out w, out h ); //プレイヤーがいるタイルのインデックスを求める
if ( tiles[ w, h ] == TileType.Wall ) { //タイルが壁なら移動矯正する(壁にめり込んでいる状態)
float newx = プレイヤーの現在のX座標;
float newy = プレイヤーの現在のY座標;
if ( プレイヤーの現在のX座標 < ( ( float ) w + 0.5 ) * タイルサイズ ) {
newx = w * タイルサイズ; //壁タイルの左側から進入した場合はタイルの左端に矯正
}
else {
newx = ( w + 1 ) * タイルサイズ; //壁タイルの右側から進入した場合はタイルの右端に矯正
}
if ( プレイヤーの現在のY座標 < ( ( float ) h + 0.5 ) * タイルサイズ ) {
newy = h * タイルサイズ; //壁タイルの上側から進入した場合はタイルの上端に矯正
}
else {
newy = ( h + 1 ) * タイルサイズ; //壁タイルの下側から進入した場合はタイルの下端に矯正
}
プレイヤーの座標 = 座標( newx, newy );
}