Изометрический рендеринг и сбор?

23

Я искал формулу для построения (мир-> экран) и выбора мыши (мир-> экран) изометрических плиток в ромбовидном мире. Те, которые я пробовал, всегда, кажется, выключены. Какой обычный / правильный способ сделать это?

mpnk121
источник
Точный метод и формула зависит немного от формы ваших плиток и, возможно, немного от того, как вы рисуете карту (0,0 на верхней, нижней или одной из сторон карты). Подробнее о вашей проблеме поможет.
Thedaian
1
Плитка 2: 1 (точнее, 64x32). Система координат не имеет значения, так как я пишу редактор. (0,0 сверху или слева кажется разумным.)
mpnk121
Очень поздно на вопрос, и у меня даже нет полного ответа, но на эту конкретную тему был очень хороший Google Tech Talk. Их настройка включает в себя выбор непрозрачной части произвольных изображений (в javascript, не менее). youtube.com/watch?v=_RRnyChxijA
Сет Бэттин,

Ответы:

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 - это координаты экрана мыши, которые мы объединяем со значениями камеры, чтобы выяснить, где мы находимся в «мировых координатах». Все остальное такое же, как в предыдущем примере кода.

Еще раз, это предполагает плоскую 2-мерную изометрическую карту тайлов. Есть некоторая дополнительная работа, если вы хотите использовать полу-3d вид карты, и все это предполагает, что вы все равно работаете в 2D.

thedaian
источник
1
Спасибо! - это прекрасно работает для плоских карт. Теперь, можете ли вы рассказать мне немного больше о том, как я могу добавить плитки произвольного размера (т.е. с глубиной Z), которые находятся на другом слое? (Например, реквизит, например, колодец или уличный
фонарь
2
Вот когда вы используете значения offsetY и offsetX. Если уличный свет имеет размер 64x64, то при передаче отрицательного значения 32 для значения offsetY оно должно появиться в нужном месте. Надеюсь, этого достаточно, чтобы вы начали.
Thedaian
6
Разве координата "2,1" в вашем примере не должна быть "2,0"?
Крис