PDA

Просмотр полной версии : карта и координаты


kodav
10.08.2010, 21:05
есть ли какая инфа о том как перевести игровые координаты карты те что мы получаем по /loc в пиксельные (изображение из текстуры)? либо все поделено на секторы либо какая то хитрая формула

J-Fobos
10.08.2010, 21:43
Формул как таковых я не знаю, но посмотрите это.
_http://s47.radikal.ru/i118/0904/75/2bde6464cd70.jpg

Весь Мир подразделен на 32х32 области. Вы можете увидеть это на рисунке. Представление чисел Области от - 0 до 31.Как вы обратили внимание на карте выше,что левый верхний угол не в области - 0_0, а в области 16_10. Это означает что на левой стороне карты - 16 областей и выше -10. Но где они? Они не присутствуют в С6, но в теории они будут еще созданы.

Каждая область поделена на 256x256 блоков. Каждый блок подразделен на 8x8 ячейки. Есть 3 типа блоков:
Типы блоков:
1 - такой блок не имеет separeted ячейки B, он - одно твердое устройство.Так как имя сообщает свою 'квартиру', оно означает, что на целом блоке есть просто в Z величине. Вы можете также пройти мимо ПЛОСКОГО блока без любых проблем (не может быть любыми стенами или другими вещами).
2 -такой блок имеет 8x8 ячейки и каждая ячейка может иметь другую Z величину (высота)
3 - многоуровневый. Этот блок является таким же как и второй, но ячейки, которые он содержит, может иметь слои.

Ячейка - минимальная часть геоданных.Каждая ячейка - 16 устройств высоких и широких - в мире coords.Ячейка может быть многослойной. Это означает, что это быть определенное для многих Z величин. Хороший пример - Башня Insolence, где у вас есть много перекрытий и одна ячейка идет throu он все Описанный дело в том, что назвавшее слой.

Слой - это - deined для специфической ячейки. Мы считаем слоями из L0, L1, L2,.... Где L0 - наиболее верхний слой.Каждый слой ячейки определил z величину (высота) и NSWE. Z величина ячеек (что принадлежит МНОГОУРОВНЕВЫМ или СЛОЖНЫМ блокам), многочисленные 8.

http://c.foto.radikal.ru/0610/8a8b87c8027a.jpg
зы: автор данного объяснения мне не известен.

xkor
17.08.2010, 03:02
const
// размер одного блока карты:
blockSize=32768; // что равно сдвигу в лево на 15 бит

var
xbn,ybn,x,y,bx,by,xb,yb: integer;

begin
// зависимость номера блока от координат:
xbn:=(x div blockSize - x shr 31) + 20;
ybn:=(y div blockSize - y shr 31) + 18;

// расчет координат блока:
bx:=(x div blockSize - x shr 31) * blockSize;
by:=(y div blockSize - y shr 31) * blockSize;

// расчет координат внутри блока:
xb:=x - bx;
yb:=y - by;
end;

cvillian
05.04.2015, 00:30
const
// размер одного блока карты:
blockSize=32768; // что равно сдвигу в лево на 15 бит

var
xbn,ybn,x,y,bx,by,xb,yb: integer;

begin
// зависимость номера блока от координат:
xbn:=(x div blockSize - x shr 31) + 20;
ybn:=(y div blockSize - y shr 31) + 18;

// расчет координат блока:
bx:=(x div blockSize - x shr 31) * blockSize;
by:=(y div blockSize - y shr 31) * blockSize;

// расчет координат внутри блока:
xb:=x - bx;
yb:=y - by;
end;


Координаты блока - это координата его верхнего левого угла относительно всей карты?

А координатами внутри блока можно воспользоваться чтобы отмечать своё местоположение как это например в волкере?

cvillian
24.07.2015, 15:04
Подскажите кто-нибуть плиз, как сделать обратный перерасчёт, т.е. как координаты внутри блока снова перевести в мировые?

ScythLab
24.07.2015, 22:51
На такие вопросы даже отвечать не интересно, это обычная математика средней школы

cvillian
25.07.2015, 04:18
ну при расчёте координат блока используется оператор shr,
а я побитовые оперции не очень понимаю, чтобы сделать обратный расчёт

ScythLab
27.07.2015, 19:39
Это оптимизация, конструкция "x shr 31" при отрицательном X будет принимать 1, в противном случае 0.
Можно написать что-то типа

if (x < 0) then
Dec(x, blockSize);
xbn := (x div blockSize) + 20;
...

Смысл без картинки сложно объяснить, в общем когда преобразуешь координаты к номеру блока, то номера блоков "+0" и "-0" должны отличаться.

cvillian
22.12.2015, 18:22
млин, никак не получается первести координаты клика в игровые координаты :(
помогите плиз.

cvillian
25.12.2015, 18:14
координаты клика в координаты внутри блока я перевёл.
как теперь их перевести в мировые?

Yegor
25.12.2015, 19:28
Умножить номер блока на количество точек в блоке и прибавить координату внутри блока.

worldX = 20*32768 + (номер блока X)*32768 + (координата внутри блока X);

worldY = 18*32768 + (номер блока Y)*32768 + (координата внутри блока Y);


20 и 18 это начальные смещения так как блоки в игре нумеруются не от нуля.

cvillian
25.12.2015, 23:09
20*32768 = 655360, что уже не может быть моей координатой

до меня внезапно дошло, что в формуле
bx:=(x div blockSize - x shr 31) * blockSize;
x - у меня есть - моё собственное положение на карте, а координату клика можно вычислить относительно собственного местоположения. Впринципе все вычесления так и делал т.к. карта центрируется по своему положению.

Только надо теперь это всё "вживую" проверять т.к. тесты делал на одной карте и с постоянным местоположением.

Yegor
26.12.2015, 05:17
Да немного неправильно написал. Отсчет координат идет от нуля. но если нужно высчитать номера блоков в формате л2 то нужно добавить эти смещения.
В другом коде нашел смешения 16 для x и 10 для y

cvillian
28.12.2015, 16:07
Мдя, теперь надо как-то расчитывать движение....

Добавлено через 18 часов 35 минут
В другом коде нашел смешения 16 для x и 10 для y
А что за код? может он будет мне полезным? :)

Yegor
28.12.2015, 20:21
Вот исходники почти готового бота бери, дорабатывай и пользуй http://coderx.ru/showthread.php?t=9575&highlight=xBot2010

cvillian
08.02.2016, 13:28
интересно, а как сделать подключение карт катакомб.. ?

а впринципе понял, по определённым координатам подсовывать