PDA

Просмотр полной версии : формула расчёта местоположения по координатам игровым и координатам карты мира


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))

Yegor
08.01.2012, 06:07
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
Омг, этож так... не хорошо) А там определенных слоев нету чтоли?