![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Вопрос как при нажатиии на форму, сделать чтоб объект плавно перемещался к месту клика. Знаю как получить координаты клика и положения курсора, знаю что это нужно делать через таймер,но как??выходит только движения объекта вместе с курсором.и как сделать чтоб при зажатии правой клавиши и движении мыши можно было как бы листать карту.ПОМОГИТЕ ПОЖАЛУЙСТО
желательно куски кода с пояснениями.буду очень благодарен |
|
#2
|
|||
|
|||
|
Если двигать объект по форме, то:
1. создайте переменные - текущие координаты объекта, координаты клика; 2. при клике по форме сохраняйте координаты клика. 3. на таймер вешайте процедуру уменьшающую разность между координатами клика и координатами объекта, на 1 квант движения (например 1 пиксель); 4. перерисуйте форму. |
|
#3
|
||||
|
||||
|
Код:
3. на таймер вешайте процедуру уменьшающую разность между координатами клика и координатами объекта, на 1 квант движения (например 1 пиксель); |
|
#4
|
|||
|
|||
|
Простите за оффтоп, а чем Таймер плох ? И зачем получать все координаты вектора от стартовой точки, до конечной ?
|
|
#5
|
||||
|
||||
|
Таймер плох тем, что у него квант времени достаточно большой и для плавного движения его может и не хватить. А координаты нужны опять же для того, что-бы иметь возможность создавать разнообразные эффекты типа замедление/ускорение и т.д. Да и вообще там много чего можно полезного наворотить имея этот массив.
|
|
#6
|
||||
|
||||
|
да я и так это понимаю.и всё это есть кроме процедуры на уменьшение разности.напишите пожалуйсто
|
|
#7
|
|||
|
|||
|
Самый простой способ уменьшить разность:
cx,cy - координаты клика; x,y - координаты объекта; dx,dy -искомый вектор; Код:
dx:=0;if cx>x then dx:=1;if cx<x then dx:=-1; dy:=0;if cy>y then dy:=1;if cy<y then dy:=-1; ru.wikipedia.org/wiki/Алгоритм_Брезенхэма |
| Этот пользователь сказал Спасибо Sphynx55 за это полезное сообщение: | ||
hsMapk (18.05.2014)
| ||
|
#8
|
||||
|
||||
|
Вот вам процедурка возвращающая массив координат вектора:
Код:
type
TCoords = Array of TPoint;
...
procedure GetLineCoords(var Points: TCoords; x1, y1, x2, y2: Integer);
procedure Swap(var X, Y: Integer);
var T: Integer;
begin
T := X; X := Y; Y := T;
end;
function Sign(Value: Real): Integer;
begin
Result := 0;
if Value > 0 then Result := 1;
if Value < 0 then Result := -1;
end;
var
dx,dy,i,sx,sy,Check,e,x,y: Integer;
begin
dx := Abs(x1 - x2);
dy := Abs(y1 - y2);
sx := Sign(x2 - x1);
sy := Sign(y2 - y1);
x := x1;
y := y1;
Check := 0;
if dy > dx
then begin
Swap(dx, dy);
Check := 1;
end;
e := 2*dy - dx;
SetLength(Points, dx + 1);
for i := 0 to dx
do begin
Points[i] := Point(x, y);
if e >= 0
then begin
if Check = 1
then Inc(x, sx)
else Inc(y, sy);
Dec(e, 2*dx);
end;
if Check = 1
then Inc(y, sy)
else Inc(x, sx);
Inc(e, 2*dy);
end;
end; |
|
#9
|
||||
|
||||
|
спасибо)сделал.
|
|
#10
|
||||
|
||||
|
хотя нет,не то
вот что на таймер сделал Код:
procedure TForm1.Timer2Timer(Sender: TObject);
begin
click_x:=Mouse.CursorPos.X;
click_y:=Mouse.CursorPos.Y;
if click_x>x then
dx:=5;
if click_x<x then
dx:=-5;
if click_y>y then
dy:=5;
if click_y<y then
dy:=-5;
end;Код:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin hero.Left:=hero.Left+dx; hero.Top:=hero.Top+dy; end; |
|
#11
|
||||
|
||||
|
Ну возьмите мой вариант с массивом координат и по нему отправляйте контрол в путь.
|
|
#12
|
|||
|
|||
|
Ты сделал все с точность до наоборот
По форм клик только сохраняем координаты: Код:
click_x:=Mouse.CursorPos.X; click_y:=Mouse.CursorPos.Y; Код:
dx:=0;if cx>x then dx:=1;if cx<x then dx:=-1; dy:=0;if cy>y then dy:=1;if cy<y then dy:=-1; Код:
hero.Left:=hero.Left+dx; hero.Top:=hero.Top+dy; |
|
#13
|
||||
|
||||
|
С таким кодом герой будет ползать только по диагонали и влево/вправо. А произвольное движение не выйдет.
|
|
#14
|
|||
|
|||
|
Не совсем так. Вначале, если возможно, по диагонали, затем по прямой к цели. Траекторию можно приблизить к прямолинейной применяя небольшие хитрости с рандомом.
|
|
#15
|
||||
|
||||
|
Цитата:
Брезенхем тут значительно лучше. |