Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Нахождение нужной ячейки по координатам мыши

Нахождение нужной ячейки по координатам мыши

Страницы: 1 2 3 Следующая »
ArochПостоялецwww29 авг. 20020:21#0
Кто какие способы знает высказывайте
ArochПостоялецwww29 авг. 20020:52#1
Пример из моего движка на Дэлфи.
function TMap.GetCellIndex(mapx, mapy: integer; XY: boolean): Smallint; //mapx и mapy это координаты
//карты
var
X, Y, mx, my: Smallint; // X и Y - результат (индексы ячейки), mx and my координаты в квадрате
Xn, Yn: Smallint; // координаты квадрата
begin
Yn:=(mapy div 16)+1; //координаты квадрата по игрику (прямоугольника если быть точным ;) )
my:=mapy-((Yn-1)*16); //координаты в квадрате по игрику
if mapx>=0then Xn:=(mapx div 32)+1 else Xn:=(mapx div 32)-1; //кординаты квадрата по X
mx:=abs(mapx)-((abs(Xn)-1)*32); //координаты в квадрате по X
//P.S. координаты в квадрате нащинаются с нуля (если кто не додумался)

if Odd(abs(Xn))xor Odd(Yn)
then begin
   if Xn>0 then
   begin
         Y:=(Yn-Xn+1)div 2;
         if mx>((16-my)*2)-1 then X:=(Yn+Xn+1)div 2
         else X:=(Yn+Xn-1)div 2
   end else
   begin
      X:=(Yn+Xn+1)div 2;
      if (32-mx)>((my)*2)-1 then Y:=(Yn-Xn-1)div 2
      else Y:=(Yn-Xn+1)div 2
   end
end else begin
   if Xn<0 then
   begin
      Y:=(Yn-Xn)div 2;
      if (32-mx)>((16-my)*2)-1 then X:=(Yn+Xn+2)div 2
      else X:=(Yn+Xn)div 2
   end else
   begin
      X:=(Yn+Xn)div 2;
      if mx>((my)*2)-1 then Y:=(Yn-Xn)div 2
      else Y:=(Yn-Xn+2)div 2
   end
end;

if XY then Result:=X else Result:=Y;
end;
чтоб все было понятно что из чего я подчитывал - изображение карты:

Изображение

WolfheartПостоялецwww29 авг. 20020:52#2
Cамый лучший из виденных мной способов это делать - Mousemapping.

http://www.gamedev.net/reference/articles/article747.asp

(См. в конце статьи, "Mouse Matters")

ЗЫ: Так делается в Civilization II

extraordinaireПостоялецwww29 авг. 20021:05#3
короче вот:

Function TIsoMap.GetCursorPosition(X,Y,Param:Integer) : Boolean;
var
Dx,Dy:Real;
DeltaX, DeltaY:Integer;
begin
// х, у - коорд мыши
// OfsetX, OfsetY - смешение, попиксельного скролинага, если его нет то след две строки надо убрать
  Inc(X,OfsetX);
  Inc(Y,OfsetY);
// SpriteWidth - это нирина спрайта, у меня 60
  DeltaX:=SpriteWidth div 2;
  DeltaY:=SpriteHeigth div 2;
// ScreenX это номер квадрата по Х, если весь экран разделить на клетки(в которых уже вписывают ромб)
  ScreenX:=1 + (X-ScX0-DeltaX*Param) div SpriteWidth;
  ScreenY:=1 + (Y-ScY0-DeltaY*Param) div SpriteHeigth;
// MapX и MapY это искомые коорд!
  MapX:=ScreenX;
  MapY:=ScreenY;
  dX:=(X-ScX0-DeltaX*Param)-(ScreenX-1)*SpriteWidth;
  dY:=(Y-ScY0-DeltaY*Param)-(ScreenY-1)*SpriteHeigth;
//тут вот наверное косячки с унификацией алгоритма......
  if (dX>=30-2*dy) and (dX<=30+2*dy) and (dx>=2*dy-30) and (dx<=90-2*dy) then
    begin
      MapY:=MapY*2-(1-Param);
      Result:=True;
    end
    else Result:=False;
  Inc(MapX,ScrollX);
  Inc(MapY,ScrollY*2);
end;

вот теперь в OnMouseMove пишем:
if not Map.GetCursorPosition(X,Y,1) then Map.GetCursorPosition(X,Y,0);

это я так его оптимизировал типа, вообщем иногда процедура запускается два раза, это по мутке!

В общем таков мой алгоритм, выведенный на бумашке уже давно. Не пинайте за убогость, зато работает чётко и быстро!

Если чё будет не понятно, то пишите, постараюсь ответить, хотя уже и не помню как он работает! :-)

А вообще этот алгоритм реально используется в разрабатываемом мной движке, который каждый может скачать и заценить (а коментария поделится со мной и другими) с этой страницы Мой сайт

Предупреждение: у меня система координат совсем другая. Можете посмотреть пример применения этого алгоритма на моём сайте.

WolfheartПостоялецwww29 авг. 200214:53#4
А мне MouseMap больше нравится...Cоздаем справочную таблицу направлений для прямоугольной области, описывающей тайлик, и все просто летает!

ЗЫ: На вкус и цвет фломастеры разные :-)

extraordinaireПостоялецwww29 авг. 200216:19#5
Wolfheart

да это был первый и самый простой алгоритм реализованный мной, но что то мне в нём ужасно непонравилось(не подошло), хотя щас даже и вспомнить не могу что могло непонравится!

Удалёнwww18 дек. 200215:49#6
ИМХО это вариант самый рРУЛИТ:

if(p.x < OFFSET_X || (p.x > OFFSET_X + GRID_W)){ r.x = r.y = -1; return; }
if(p.y < OFFSET_Y || (p.y > OFFSET_Y + GRID_H)){ r.x = r.y = -1; return; }

r.y = (p.x - OFFSET_X) / CELL_W;
r.x = (p.y - OFFSET_Y) / CELL_H;

Тута и смещение и размер ячейки. И все що надо батьке.

ArochПостоялецwww19 дек. 20020:56#7
terror
Что-то я не понял %) ты поясни хотя бы что мы получаем на входе функции? p.x & p.y? тогда вроде бы дошло :)но тогда он определит именно в конкретной одной ячейки а не для все карты в целом.
Удалёнwww19 дек. 20027:14#8
Ну така вопрос бы "Нахождение нужной ячейки по координатам мыши", или как? Если есть на экране такая штука, то прога найдет, с учетом любых возможных параметров.
Ну можа и прадва с дуру че-то не то написал. На плоскости вроде усе работает.
ArochПостоялецwww19 дек. 200213:50#9
terror
То в том то и дело НУЖНОЙ (из множества). В твоем же примере как я понял для этого нужно сначала OFFSET_X и OFFSET_Y. %)
LazyНовичокwww9 янв. 200310:10#10
Народ с одним уровнем, как-бы все в порядке и достаточно просто. но как отследить, елс у меня карта многоуровневая с двум и больше?
Заранее благодарен!!!
ИннокентийПостоялецwww9 янв. 200310:41#11
Lazy
а z те зачем?
ИннокентийПостоялецwww9 янв. 200310:42#12
Aroch
та ты у нас изометрик.:)
p.s.
А когда раздел посвященный изометрии откроется?
ArochПостоялецwww10 янв. 20030:36#13
Иннокентий
не знаю, пока еще не планировалм. Если наберем достаточно инфы то wat не откажется.
Изометрик включительно :).
Lazy
если камера не привязана к какому нибудь юниту и не известно на каком ты сейчас уровне то то можно брать тот который видно(кроме крыши, хотя если по крыше лазают то пожалуйста), после этого когда ты знаешь какой тебе нужен этаж ты должен прибавить/отнять (в зависимости от направления оси y) к координате y опредленное кол-во (как правило = высоте стен) и находишь индексы уже с новой координатой y.
LazyНовичокwww17 янв. 20039:40#14
А тогда как определить, на какой картинке мышка? Если я правильн понял
Страницы: 1 2 3 Следующая »

/ Форум / Программирование игр / 2D графика и изометрия

Тема в архиве.

2001—2018 © GameDev.ru — Разработка игр