Page 1 of 1

ошибка в getdistance

Posted: 20.12.2014 22:41
by Roman
когда чар находиться по диагонали от объекта, то на расстоянии в 2 тайла, дистанция высвечивается 3 а не 2. ну и дальше отходя по диагонали, функция не правильно считает дистанцию.

Re: ошибка в getdistance

Posted: 20.12.2014 23:36
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).
Вот она-то определяет так как надо.

Re: ошибка в getdistance

Posted: 21.12.2014 11:45
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;

Re: ошибка в getdistance

Posted: 21.12.2014 23:06
by CFA
Используя Dist можно сделать еще проще:

Code: Select all

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