Я искал формулу для построения (мир-> экран) и выбора мыши (мир-> экран) изометрических плиток в ромбовидном мире. Те, которые я пробовал, всегда, кажется, выключены. Какой обычный / правильный способ сделать это?
Точный метод и формула зависит немного от формы ваших плиток и, возможно, немного от того, как вы рисуете карту (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,00,11,00,21,12,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.
Спасибо! - это прекрасно работает для плоских карт. Теперь, можете ли вы рассказать мне немного больше о том, как я могу добавить плитки произвольного размера (т.е. с глубиной Z), которые находятся на другом слое? (Например, реквизит, например, колодец или уличный
фонарь
2
Вот когда вы используете значения offsetY и offsetX. Если уличный свет имеет размер 64x64, то при передаче отрицательного значения 32 для значения offsetY оно должно появиться в нужном месте. Надеюсь, этого достаточно, чтобы вы начали.
Thedaian
6
Разве координата "2,1" в вашем примере не должна быть "2,0"?
Ответы:
Исходя из вашего комментария, вот код, который я использую для преобразования значений тайла x, y в экранные координаты. Теперь он не учитывает «3d плитки», все считается находящимся в одной плоскости, поэтому, если вы пишете игру, где это важно, этот код не будет работать.
point - это просто структура, содержащая x и y ints, TILE_WIDTH в вашем случае будет 64, а TILE_DEPTH имеет неправильное имя (на самом деле это высота мозаичного изображения), но в вашем случае это будет 32. Смещения, если вы хотите, чтобы ваша карта тайлов «начиналась» в другом месте x, y (например, если вы хотите, чтобы плитки были выше другого набора плиток). Обычно смещение может быть 0,0.
Это сгенерирует карту с 0,0 сверху, посередине, вот так:
Что касается нахождения плитки x, y курсора:
В этом фрагменте кода mX и mY - это координаты экрана мыши, которые мы объединяем со значениями камеры, чтобы выяснить, где мы находимся в «мировых координатах». Все остальное такое же, как в предыдущем примере кода.
Еще раз, это предполагает плоскую 2-мерную изометрическую карту тайлов. Есть некоторая дополнительная работа, если вы хотите использовать полу-3d вид карты, и все это предполагает, что вы все равно работаете в 2D.
источник