|
|
Регистрация | << Правила форума >> | 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
|
||||
|
||||
Цитата:
jmp $ ; Happy End! The Cake Is A Lie. |