Просмотр полной версии : карта и координаты
есть ли какая инфа о том как перевести игровые координаты карты те что мы получаем по /loc в пиксельные (изображение из текстуры)? либо все поделено на секторы либо какая то хитрая формула
Формул как таковых я не знаю, но посмотрите это.
_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
зы: автор данного объяснения мне не известен.
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
координаты клика в координаты внутри блока я перевёл.
как теперь их перевести в мировые?
Умножить номер блока на количество точек в блоке и прибавить координату внутри блока.
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 - у меня есть - моё собственное положение на карте, а координату клика можно вычислить относительно собственного местоположения. Впринципе все вычесления так и делал т.к. карта центрируется по своему положению.
Только надо теперь это всё "вживую" проверять т.к. тесты делал на одной карте и с постоянным местоположением.
Да немного неправильно написал. Отсчет координат идет от нуля. но если нужно высчитать номера блоков в формате л2 то нужно добавить эти смещения.
В другом коде нашел смешения 16 для x и 10 для y
cvillian
28.12.2015, 16:07
Мдя, теперь надо как-то расчитывать движение....
Добавлено через 18 часов 35 минут
В другом коде нашел смешения 16 для x и 10 для y
А что за код? может он будет мне полезным? :)
Вот исходники почти готового бота бери, дорабатывай и пользуй http://coderx.ru/showthread.php?t=9575&highlight=xBot2010
cvillian
08.02.2016, 13:28
интересно, а как сделать подключение карт катакомб.. ?
а впринципе понял, по определённым координатам подсовывать
vBulletin® v3.6.11, Copyright ©2000-2024, Jelsoft Enterprises Ltd. Перевод: zCarot