Я шукав формулу для побудови ізометричної плитки (світ-> екран) та вибору миші (світ-> екран) у ромбоподібному світі. Те, що я намагався завжди, здається, добре. Який звичайний / правильний спосіб це зробити?
Я шукав формулу для побудови ізометричної плитки (світ-> екран) та вибору миші (світ-> екран) у ромбоподібному світі. Те, що я намагався завжди, здається, добре. Який звичайний / правильний спосіб це зробити?
Відповіді:
На підставі вашого коментаря, ось код, який я використовую для перетворення значень плитки x, y в екранні координати. Тепер він не враховує "3d плитки", все вважається на одній площині, тому якщо ви пишете гру, де це має значення, цей код не працюватиме.
//this converts a map x/y coordinate into screen coordinates
//public, static method, so can be called outside the Tile object
point Tile::convertToScreen(int x, int y, int offsetX, int offsetY)
{
point screen;
//calculate the screen coordinates
//note: these will then be modified by the camera
screen.x = offsetX - (y * TILE_WIDTH/2) + (x * TILE_WIDTH/2) - (TILE_WIDTH/2);
screen.y = offsetY + (y * TILE_DEPTH/2) + (x * TILE_DEPTH/2);
return screen;
}
point просто структура, що містить x і y ints, TILE_WIDTH було б 64 у вашому випадку, TILE_DEPTH начебто погано названий (це насправді висота графіки плитки), але це буде 32 у вашому випадку. Зсуви - це якщо ви хочете, щоб ваша карта плитки "починалася" в іншому місці x, y (наприклад, якщо ви хочете, щоб плитка була вище іншого набору плиток). Зазвичай зміщення може становити 0,0.
Це створить карту з 0,0 вгорі, посередині, як це:
0,0
0,1 1,0
0,2 1,1 2,1
Щодо знаходження плитки x, y курсору:
point selectedTile;
int x = mX - camera.x;
int y = mY - camera.y;
selectedTile.x = (y + x/2)/TILE_DEPTH;
selectedTile.y = (y - x/2)/TILE_DEPTH;
У цьому біті коду mX і mY - координати екрану миші, які ми поєднуємо зі значеннями камери, щоб дізнатися, де ми знаходимося у «світових координатах». Все інше те саме, що і в попередньому прикладі коду.
Знову ж таки, це передбачає плоску 2d ізометричну плитку. Існує деяка додаткова робота, якщо ви хочете використовувати напів 3d зображення карти, і все це передбачає, що ви працюєте в 2d все одно.