ここで私が物事をする順序....
1)文字の現在のX、Yを保存
2)X方向に移動します
3)タイルデータを取得して文字のすべてのコーナーを確認し、次の操作を行ってそれが固体かどうかを確認します(XとYは文字の位置です)
- 左上:floor(X / tileWidth)、floor(Y / tileHeight);
- 右上の場合:floor((X + characterWidth)/ tileWidth)、floor(Y / tileHeight);
- 左下の場合:floor(X + / tileWidth)、floor((Y + characterHeight)/ tileHeight);
- 右下の場合:floor((X + characterWidth)/ tileWidth)、floor((Y + characterHeight)/ tileHeight);
...マップデータから正しいタイルデータを取得する
4)タイルのいずれかが無地の場合、保存したXを復元して、Xを可能な限り最適な位置に強制し、...
- 左に移動する場合:X = floor(X / tileWidth)* tileWidth;
- 右へ移動する場合:X =((floor((X + characterWidth)/ tileWidth)+ 1)* tileWidth)-characterWidth;
5)Yを使用して2〜4を繰り返す
キャラクターがタイルよりも高い場合は、さらにタイルを確認する必要があります。これを行うには、ループしてtileHeightをcharacterY位置に追加してタイルを取得する必要があります
int characterBlockHeight = 3;
// check all tiles and intermediate tiles down the character body
for (int y = 0; y < characterBlockHeight - 1; y++) {
tile = getTile(floor(characterX / tileWidth), floor((characterY + (y * tileHeight)) / tileHeight));
... check tile OK....
}
// finally check bottom
tile = getTile(floor(characterX / tileWidth), floor((characterY + characterHeight) / tileHeight);
... check tile OK....
文字が1ブロックより広い場合は、同じようにしますが、characterY、characterHeight、tileHeightなどをcharacterX、characterWidthなどに置き換えます。