Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

ошибка в getdistance

Only for requests.
Post Reply
Roman
Neophyte
Neophyte
Posts: 37
Joined: 03.11.2014 21:48

ошибка в getdistance

Post by Roman »

когда чар находиться по диагонали от объекта, то на расстоянии в 2 тайла, дистанция высвечивается 3 а не 2. ну и дальше отходя по диагонали, функция не правильно считает дистанцию.
Gauhar
Novice
Novice
Posts: 87
Joined: 08.07.2008 17:40

Re: ошибка в getdistance

Post by Gauhar »

Описание функции:

Code: Select all

function GetDistance(ObjID: Cardinal): Integer; 
гипотенуза от двух катетов. 0 - обьект под вами. -1 - Обьект не существует. (При определении игнорирует координату Z)
Вообще-то, если исходить из описания функция, то она считает все правильно, только возвращаемый результат должен быть Double, а не Integer. Это во-первых, а во-вторых, как замечает автор топика, растояния в ultime таким способом (гипотенуза от двух катетов) мало на каких шардах используется (я такого не встерчал), обычно растояние между соседними тайлами равно 1, будь то по горизонтали, вертикали или диагонали. Но, к счастью, в Stealth'е есть еще одна функция для определения растояния:

Code: Select all

function Dist(X1, Y1, X2, Y2: Word): Word
Возвращает расстояние между точками (X1, Y1) и (X2, Y2).
Вот она-то определяет так как надо.
Roman
Neophyte
Neophyte
Posts: 37
Joined: 03.11.2014 21:48

Re: ошибка в getdistance

Post by Roman »

я так решил вопрос:

Code: Select all

function get_distance(objectid : cardinal) : integer;
var 
    distx,disty : integer;
begin
    distx := (getx(objectid) - getx(self));  
    if distx < 0 then distx := (distx * -1);
    disty := (gety(objectid) - gety(self)); 
    if disty < 0 then disty := (disty * -1);
    if distx > disty then
        result := distx
    else
        result := disty; 
    if result > 30 then result := -1;
end;
CFA
Developer
Developer
Posts: 492
Joined: 20.04.2006 6:03
Contact:

Re: ошибка в getdistance

Post by CFA »

Используя Dist можно сделать еще проще:

Code: Select all

function get_distance(objectid : cardinal) : integer;
begin
    result := Dist(GetX(self), GetY(self), GetX(objectid), GetY(objectid));
end;
Post Reply