Ізометричне надання та збирання?


23

Я шукав формулу для побудови ізометричної плитки (світ-> екран) та вибору миші (світ-> екран) у ромбоподібному світі. Те, що я намагався завжди, здається, добре. Який звичайний / правильний спосіб це зробити?


Точний використаний метод та формула трохи залежать від форми вашої плитки та, можливо, трохи від того, як ви малюєте карту (0,0 вгорі, внизу чи на одній із сторін карти) Детальніше про вашу проблему допоможе.
Тедай

1
Плитка - 2: 1 (точніше, 64х32). Система координат не має значення, оскільки я пишу редактор. (0,0 вгорі або зліва здається розумним.)
mpnk121

Дуже пізно на запитання, і я навіть не маю повної відповіді, але в цій точній темі була дуже хороша технологічна розмова Google. Їх налаштування включає вибір непрозорої частини довільних зображень (у JavaScript не менше). youtube.com/watch?v=_RRnyChxijA
Seth Battin

Відповіді:


21

На підставі вашого коментаря, ось код, який я використовую для перетворення значень плитки 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 все одно.


1
Дякую! - це чудово підходить для плоских карт. Тепер, чи можете ви розповісти трохи більше про те, як я можу додати довільно розміщені (тобто з глибиною Z) плитки, які знаходяться на іншому шарі? (На кшталт реквізиту, як колодязь або вуличне
світло

2
Це коли ви використовуєте значення offsetY та offsetX. Якщо ваш вуличний простір розміром 64x64, то показник мінус 32 за значенням зміщення Y повинен відображати його в потрібному місці. Сподіваємось, цього достатньо для початку.
Тедей

6
Чи не повинна координата "2,1" у вашому прикладі бути "2,0"?
Кріс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.