12121 Можно поправлю: сначала надо узнать длину линии, разделить её на длину шага и получить кол-во шагов, а уж потом с каждым шагом к х добавляем х2/у2, а к у у2/х2. и лучше х и у присваивать только сами округления, а вычисления проводить на других переменных.
Но так как
IvanNes просил как в fallout я и буду делать как в fallout. Ведь если использовать 6-ти угольник, а не квадрат переход плавнее будет.
На рисунке показанно как должны считаться координаты. Хотя там немного неправильно намалявил я. Координата (x,y) это середина 6-ти угольника. Если брать одну клетку за 10 px, то выше упомянутый шаг будет 20(проверил опытным путём). Если найдёшь способ вычислить координату выбранной точки с ачалом координат в середине стартовой ячейки, то я смогу сделать процедуру получше.
Вот процедура:
procedure way(
kx1,ky1 : integer; // координаты стартовой ячейки, не в пикселях
kx2,ky2 : integer; // координаты конечной ячейки
);
var
px1,px2,py1,py2 : integer // кооординаты середин ячеек, ценрт равен px1-20 и py1-10
linlen,steps_count : integer; // длина мнимой линии и количество шагов
i : integer;
rx,ry : real // ну промежуточные переменные. Не смей их удалять, иначе пойдёт град ошибок и несовпадений >>:(
begin
px1:=20;
py1:=10;
px2:=(kx2-kx1)*30;
py2:=(ky2-ky1)*10;
linlen:=sqrt(sqr(py2-py1)+sqr(px2-px1)); // вычисляем длину мнимой линии между серединами двух ячеек в пропорции дл.яч./шир.яч.=40/20. Ничего менять тут не надо.
steps_count:=trunc(linlen/20);
// я не помню после того как процедура заканчивается переменные обнуляются?
{*rx:=0;
ry:=0;*}
repeat
rx:=rx+(px2-px1)/steps_count;
ry:=ry+(py2-py1)/steps_count;
kx1:=trunc(rx);
ky1:=trunc(ry);
gotoxy(kx1,ky1); // это процедура анимации твоего перса, т.е. сдвиг на одну ячейку.
until (kx1=kx2) and (ky1=ky2);
end;
Писал здесь. Не проверял(да и не на чем). Дерзай. Жду ответов.
Примеры ии тебе дали.