Просмотр полной версии : формула расчёта местоположения по координатам игровым и координатам карты мира
kyzdarovaky
07.01.2012, 20:37
Вобщем кто писал бота наверняка сталкивался с этим, как расчитать положение на графической карте относительно игровых координат?
supernewbie
08.01.2012, 00:28
вот наверное всё что нужно знать:
regionSize=32768;
GEO_X_FIRST = 11;
GEO_Y_FIRST = 10;
MAP_MIN_X = (GEO_X_FIRST - 20) shl 15;
MAP_MIN_Y = (GEO_Y_FIRST - 18) shl 15;
x:=(x - MAP_MIN_X);
y:=(y - MAP_MIN_Y);
GX:=x div regionSize + GEO_X_FIRST; //получаем х региона
GY:=y div regionSize + GEO_Y_FIRST; //получаем у региона
mx:=(x-(x mod regionSize)) div (regionSize div regionPixelSize); //получаем координаты на карте
my:=(y-(y mod regionSize)) div (regionSize div regionPixelSize); //в зависимости от размера региона в пикселях
// тут ещё надо вычитать координаты первого рисуемого региона и всё, можно рисовать
PS писал на коленке, скорее всего где-то накосячил
kyzdarovaky
08.01.2012, 00:51
Спасибо большое, только я забыл добавить чтоб функция была арифметическая т.е. чтобы её можно было решить без использования компилятора или хотябы чтобы функцию можно было реализовать на php :) Смысл кода я понял, div это деление?? а как тогда арифметически решается операнд shl?
supernewbie
08.01.2012, 01:08
div это деление?? а как тогда арифметически решается операнд shl?
да
сдвиг битов числа влево
kyzdarovaky
08.01.2012, 01:10
сдвиг битов числа влево
Блин, я прочитал уже что сдвиг, а как на php такое написать? :D
supernewbie
08.01.2012, 01:13
http://php.su/learnphp/operators/?bool
<<
alexteam
08.01.2012, 01:31
x shl 15 == floor(x/(2^15))
alexteam,
shl разве эквивалент деления а не умножения?
alexteam
08.01.2012, 06:42
вот бля )
ньюби тож опозорился )
если чего в оригинале:
blockSize = 32768;
xbn:=(x div blockSize - x shr 31) + 20;
ybn:=(y div blockSize - y shr 31) + 18;
ну или если флором то
xbn:=floor(x / blockSize) + 20;
ybn:=floor(y / blockSize) + 18;
kyzdarovaky
08.01.2012, 12:38
Где я накосячил? Запутался совсем, проучаю $mx = 16308 $my = 20960 что обозначают эти значения? Положение точки на графической карте тут рядом не стояло :)
<?
$regionPixelXSize = 1812;
$regionPixelYSize = 2620;
$x = 0;
$y = 0;
$regionSize = 32768;
$GEO_X_FIRST = 11;
$GEO_Y_FIRST = 10;
$MAP_MIN_X = ($GEO_X_FIRST - 20) << 15;
$MAP_MIN_Y = ($GEO_Y_FIRST - 18) << 15;
$x = ($x - $MAP_MIN_X);
$y = ($y - $MAP_MIN_Y);
$GX = $x / $regionSize + $GEO_X_FIRST;
$GY = $y / $regionSize + $GEO_Y_FIRST;
$mx = ($x-($x % $regionSize)) / ($regionSize / $regionPixelXSize);
$my = ($y-($y % $regionSize)) / ($regionSize / $regionPixelYSize);
?>
supernewbie
08.01.2012, 15:14
x:=(x - MAP_MIN_X);
y:=(y - MAP_MIN_Y);
GX:=x div regionSize + GEO_X_FIRST; //получаем х региона
GY:=y div regionSize + GEO_Y_FIRST; //получаем у региона
mx:=x div (regionSize / psx)); //получаем координаты на карте
my:=y div (regionSize / psy)); //в зависимости от размера региона в пикселях
mx:=mx-((первыйОтображаемыйРегионGX-GEO_X_FIRST)*psx);
my:=my-((первыйОтображаемыйРегионGY-GEO_Y_FIRST)*psy);
во, вот так полюбому
kyzdarovaky
08.01.2012, 17:04
Спасибо, первыйОтображаемыйРегионG откуда взять? :)
Это размеры графической карты я понял?
psx
psy
supernewbie
08.01.2012, 17:10
первыйОтображаемыйРегион это первый отображаемый регион, например если отображаешь только один то первыйОтображаемыйРегионGX = GX
kyzdarovaky
08.01.2012, 17:37
mx:=x div (regionSize / psx)); //получаем координаты на карте
my:=y div (regionSize / psy)); //в зависимости от размера региона в пикселях
тут ошибка в скобках я так понял, лишняя скобка? если убрать то результат получается по нулям
Вот мой переделаный под php код может в нём что то не так???
<?
$psx = 1812;
$psy = 2620;
$x = 0;
$y = 0;
$regionSize = 32768;
$GEO_X_FIRST = 11;
$GEO_Y_FIRST = 10;
$MAP_MIN_X = ($GEO_X_FIRST - 20) << 15;
$MAP_MIN_Y = ($GEO_Y_FIRST - 18) << 15;
$x = ($x - $MAP_MIN_X);
$y = ($y - $MAP_MIN_Y);
$GX = $x / $regionSize + $GEO_X_FIRST; //получаем х региона
$GY = $y / $regionSize + $GEO_Y_FIRST; //получаем у региона
$mx = $x / ($regionSize / $psx); //получаем координаты на карте
$my = $y / ($regionSize / $psy); //в зависимости от размера региона в пикселях
$mx = $mx - (($GX - $GEO_X_FIRST)*$psx);
$my = $my - (($GY - $GEO_Y_FIRST)*$psy);
echo $mx."<br />";
echo $my."<br />";
?>
Вот нашёл формулу которая выводит (может она поможет) нормальные координаты только там карта с заданым размером и переменная data_red которая подходит для это карты и непонятно как она расчитывается
$data_red=1300; //переменная для карты 1812/2620
$map['aden_x']=$imgsize['aden'][0] / 100; //1% von der karte aden x
$map['aden_y']=$imgsize['aden'][1] / 100; //1% von der karte aden y
$data['x']=($x + 130000) / 3600;
$data['y']=($y + 0) / 5250;
$data['x']=$map['aden_x'] * $data['x'];
$data['y']=$map['aden_y'] * $data['y'] + $data_red;
supernewbie
08.01.2012, 17:48
kyzdarovaky, x y - игровые координаты
kyzdarovaky
08.01.2012, 18:01
дак я указал игровые
http://s018.radikal.ru/i528/1201/7f/bd3702d82b07.jpg
supernewbie
08.01.2012, 18:06
да, всё верно, рисуешь перса в 0 0 у себя на карте
kyzdarovaky
08.01.2012, 18:13
блин мы похоже на разных волнах или друг друга не поняли или я не правильно сформулировал вопрос скорее всего, это скрин из игры и показано где должна находится точка с координатами 0 0. Мне же нужно узнать сколько нужно отступить сверху и слева по координатам на графической карте например на такой http://s018.radikal.ru/i507/1201/a5/0c11b2a7bdb6.jpg чтобы точка указывала точно в этом же месте
supernewbie
08.01.2012, 18:31
я про те карты регионов говорил, в валкере ещё такие
kyzdarovaky
08.01.2012, 18:36
Блин, сколько времяни зря потратили :) а относительно моего вопроса ничего не можешь подсказать? откуда берётся значение переменной data_red ?
supernewbie
08.01.2012, 20:02
ну тада так:
MAP_MIN_X = -294912;
MAP_MIN_Y = -262144;
MAPX = 1812;
MAPY = 2620;
WX=524287;
WY=557055;
x:=(x-MAP_MIN_X)/(WX/MAPX);
y:=(y-MAP_MIN_Y)/(WY/MAPY);
kyzdarovaky
08.01.2012, 21:17
Спасибо, лёд тронулся. Показывает почти корректно. Касяки похоже из-за того что у меня карта имеет не правильные соотношения сторон. Для системы координат серверов HF какая карта подойдёт???
И чисто из интереса, что значат переменные? WX и WY ? размер мира по X и Y?
supernewbie
08.01.2012, 21:29
kyzdarovaky, да
kyzdarovaky
08.01.2012, 21:46
а эти данные для какой версии сервера? просто с появлением континента грации размер по X координате должен быть больше чем по Y а тут по Y больше
supernewbie
08.01.2012, 22:40
вроде с учетом нового континента
kyzdarovaky
08.01.2012, 23:36
Блин, в чём же тогда запара,посмотрел сорцы хф сервера координаты и размер верные хотя очень странно почему по Х размер меньше...
скачал карту http://www.aden-territory.com/index.php?newsid=322
6000х6400
всё настроил, всёравно выводит с ошибкой, пробовал в ручную корректировать, но не прокатывает такое
http://s018.radikal.ru/i505/1201/ff/0aa73e318929.jpg
MyGarant.net
08.01.2012, 23:39
О, карта сокровищ. Я знаю, где находится это место.
kyzdarovaky
09.01.2012, 19:38
О, карта сокровищ. Я знаю, где находится это место.
Это сарказм?) синий маркер это положение которое задаётся формулой красный крестик место где должен стоять
Добавлено через 14 часов 29 минут
Может всётаки где то косяк в фоурмуле?
Добавлено через 5 часов 14 минут
Подсказали формулу, кому нужна в лс. Спасибо кто откликнулся. Тему можно закрыть
n1ghtmare
12.01.2012, 23:56
Задам тут вопрос пожалуй: а как учитывать Z? Карты катакомб и т.д. там где к блоку еще идет _0, _1, _2 и т.д.
ЗЫ: Это для волкеровских карт
supernewbie
13.01.2012, 00:03
знать у какой карты какой z рейндж, и по нему выбирать нужную карту
n1ghtmare
13.01.2012, 03:57
Омг, этож так... не хорошо) А там определенных слоев нету чтоли?
vBulletin® v3.6.11, Copyright ©2000-2024, Jelsoft Enterprises Ltd. Перевод: zCarot