Мышь в изометрии

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

Bazilius
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 87
Зарегистрирован: 14.11.2003 (Пт) 16:07
Откуда: Пермь

Мышь в изометрии

Сообщение Bazilius » 23.03.2004 (Вт) 22:58

Подскажите пожалуйста, как определить координаты тайла с помощью мыши в изометрии...

В виде "сверху" все просто: если тайл размером 32х32 то я делаю так:
Код: Выделить всё
tileX = INT ( X / 32 ) ; tileY = INT (Y/32)


А как это сделать в изометрии??? :cry:

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 24.03.2004 (Ср) 10:02

Поможет школьная геометрия за 9 класс. Поверь, если сейчас за тебя это сделать, потом вопросы будут возникать и возникать. Геометрию лучше изучить.
А решается просто. Есть координаты верхнего левого и нижнего правого углов для мыши и для карты. Дальше простая пропорция. Если рельеф с высотами - несколько сложнее.

mad_Max
Бывалый
Бывалый
 
Сообщения: 203
Зарегистрирован: 15.09.2002 (Вс) 21:17
Откуда: Russia, Cherepovets

Сообщение mad_Max » 24.03.2004 (Ср) 15:36

Я делал таким образом:
Поскольку вся карта в изометрии превращается в ромб, то представим верхнюю правую и левую границы карты как функции (прямые y=kx и y=-kx, k - зависит от твоих спрайтов). Тогда возьмем 2 прямые, параллельные этим, но проходящие через координаты мыши (взятые относительно верхнего угла карты) - y=kx-b, y=-kx-b (b - y-координата мыши). Найдем точки пересечения этих прямых с осью y=0 (нужны только x-координаты). Теперь разделим нацело полученные x-координаты на ширину спрайта и получим изометрические (x,y) координаты точки.
Если карта многоуровневая (есть разные высоты), то делаем точно также как и в случае с плоской картой, но проходим от полученных координат "змейкой" вниз, проверяя попадание координат в конкретную клетку (например, смотрим, не является ли цвет в этой точке = цвет прозрачности), и как только попадем - получим координаты.

Bazilius
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 87
Зарегистрирован: 14.11.2003 (Пт) 16:07
Откуда: Пермь

Сообщение Bazilius » 24.03.2004 (Ср) 18:04

2 Mikle:

К сожалению, учебника за 9 класс под рукой нет, может быть посоветуешь какие-то ресурсы по геометрии :?: Чтоб не очень сложно и доходчиво. (Учебники в нете искал - результата не было (правда, давно искал...))

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 24.03.2004 (Ср) 18:28

9 класс - это на вскидку, так вроде было, когда учился. И-нет ресурсов таких не знаю.
Если хочешь, чтобы помогли по конкретной задаче - опиши ее по-конкретнее. Какая конкретно проекция, есть ли, все-таки, высоты. Или сделай скриншот, напиши на нем реальные (не экранные) координаты и выложи сюда.

Bazilius
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 87
Зарегистрирован: 14.11.2003 (Пт) 16:07
Откуда: Пермь

Сообщение Bazilius » 25.03.2004 (Чт) 22:44

Насколько я понял, mad_Max предлагает определять координаты тайлов относительно мыши когда на экран выводится только ограниченный прямоугольник (рис. A, серое это типа экран), а вокруг него получается черная пустота (имхо не симпатично), мне же нужно, чтоб на экран заполнялся полностью (рис. B) – а-ля Diablo и Fallout (собственно, вывести на экран заданный массив в изометрии и передвигать его (в смысле скроллинг) я могу). Но, в любом случае у меня возникают затруднения с расчетом координат. Вот не лезет в голову ничего, хоть убей. А с геометрией и математикой у меня всегда в школе проблемы были…
Изображение Изображение

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 26.03.2004 (Пт) 13:58

Вставь этот код в форму и запусти:
Код: Выделить всё
Option Explicit

'Экранный размер тайла
Const SizeX = 100
Const SizeY = 50

Private Sub Form_Load()
Dim dx As Integer, dy As Integer
  Me.ScaleMode = vbTwips
  dx = Me.Width - Me.ScaleWidth
  dy = Me.Height - Me.ScaleHeight
  Me.ScaleMode = vbPixels
  Me.AutoRedraw = True
  Me.Width = 400 * Screen.TwipsPerPixelX + dx
  Me.Height = 300 * Screen.TwipsPerPixelY + dy
  Me.Show
  For dy = -300 To 300 Step 50
    Line (0, dy + 200)-(400, dy), &HFF0000
    Line (0, dy)-(400, dy + 200), &HFF0000
  Next dy
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim LandX As Integer, LandY As Integer
  LandX = Int(X / SizeX + Y / SizeY)
  LandY = Int(X / SizeX - Y / SizeY)
  Me.Caption = "LandY=" & LandY & ", LandX=" & LandX
End Sub


Bazilius
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 87
Зарегистрирован: 14.11.2003 (Пт) 16:07
Откуда: Пермь

Сообщение Bazilius » 30.03.2004 (Вт) 22:13

ОГРОМНОЕ СПАСИБО ТОВ. MIKLE :D :D :D


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

    TopList