Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.05.2014, 13:54
Аватар для hsMapk
hsMapk hsMapk вне форума
Новичок
 
Регистрация: 17.04.2014
Сообщения: 60
Версия Delphi: Delphi 7
Репутация: 5
Восклицание Прорисовка вижения к координатам клика

Вопрос как при нажатиии на форму, сделать чтоб объект плавно перемещался к месту клика. Знаю как получить координаты клика и положения курсора, знаю что это нужно делать через таймер,но как??выходит только движения объекта вместе с курсором.и как сделать чтоб при зажатии правой клавиши и движении мыши можно было как бы листать карту.ПОМОГИТЕ ПОЖАЛУЙСТО
желательно куски кода с пояснениями.буду очень благодарен
Ответить с цитированием
  #2  
Старый 17.05.2014, 12:35
Sphynx55 Sphynx55 вне форума
Прохожий
 
Регистрация: 15.05.2014
Сообщения: 13
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Если двигать объект по форме, то:
1. создайте переменные - текущие координаты объекта, координаты клика;
2. при клике по форме сохраняйте координаты клика.
3. на таймер вешайте процедуру уменьшающую разность между координатами клика и координатами объекта, на 1 квант движения (например 1 пиксель);
4. перерисуйте форму.
Ответить с цитированием
  #3  
Старый 17.05.2014, 12:57
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Код:
3. на таймер вешайте процедуру уменьшающую разность между координатами клика и координатами объекта, на 1 квант движения (например 1 пиксель);
Уточню, что вам для начала надо просто получить все координаты вектора от стартовой точки, до конечной. Это не всегда будет пиксель. После этого уже можно будет думать о перемещении чего либо на форме. Таймер кстати не самое удобное решение, лучше сделать это в отдельном потоке.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #4  
Старый 17.05.2014, 13:30
Sphynx55 Sphynx55 вне форума
Прохожий
 
Регистрация: 15.05.2014
Сообщения: 13
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Простите за оффтоп, а чем Таймер плох ? И зачем получать все координаты вектора от стартовой точки, до конечной ?
Ответить с цитированием
  #5  
Старый 17.05.2014, 17:16
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Таймер плох тем, что у него квант времени достаточно большой и для плавного движения его может и не хватить. А координаты нужны опять же для того, что-бы иметь возможность создавать разнообразные эффекты типа замедление/ускорение и т.д. Да и вообще там много чего можно полезного наворотить имея этот массив.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 17.05.2014, 22:58
Аватар для hsMapk
hsMapk hsMapk вне форума
Новичок
 
Регистрация: 17.04.2014
Сообщения: 60
Версия Delphi: Delphi 7
Репутация: 5
Вопрос

да я и так это понимаю.и всё это есть кроме процедуры на уменьшение разности.напишите пожалуйсто
Ответить с цитированием
  #7  
Старый 18.05.2014, 07:39
Sphynx55 Sphynx55 вне форума
Прохожий
 
Регистрация: 15.05.2014
Сообщения: 13
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Самый простой способ уменьшить разность:
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  
Старый 18.05.2014, 11:36
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Вот вам процедурка возвращающая массив координат вектора:
Код:
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  
Старый 18.05.2014, 13:59
Аватар для hsMapk
hsMapk hsMapk вне форума
Новичок
 
Регистрация: 17.04.2014
Сообщения: 60
Версия Delphi: Delphi 7
Репутация: 5
По умолчанию

спасибо)сделал.
Ответить с цитированием
  #10  
Старый 18.05.2014, 14:20
Аватар для hsMapk
hsMapk hsMapk вне форума
Новичок
 
Регистрация: 17.04.2014
Сообщения: 60
Версия Delphi: Delphi 7
Репутация: 5
По умолчанию

хотя нет,не то
вот что на таймер сделал
Код:
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;
но не работает правильно.он постоянно двигается по одно диагонали (вниз-вправо) и чтоб он прошёл 5 пикселей нужно нажимать каждый раз.то есть кликать и кликать,а он всё равно в одном направлении идёт!
Ответить с цитированием
  #11  
Старый 18.05.2014, 14:33
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Ну возьмите мой вариант с массивом координат и по нему отправляйте контрол в путь.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #12  
Старый 18.05.2014, 16:27
Sphynx55 Sphynx55 вне форума
Прохожий
 
Регистрация: 15.05.2014
Сообщения: 13
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Ты сделал все с точность до наоборот
По форм клик только сохраняем координаты:
Код:
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  
Старый 18.05.2014, 16:58
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

С таким кодом герой будет ползать только по диагонали и влево/вправо. А произвольное движение не выйдет.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #14  
Старый 18.05.2014, 17:06
Sphynx55 Sphynx55 вне форума
Прохожий
 
Регистрация: 15.05.2014
Сообщения: 13
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Не совсем так. Вначале, если возможно, по диагонали, затем по прямой к цели. Траекторию можно приблизить к прямолинейной применяя небольшие хитрости с рандомом.
Ответить с цитированием
  #15  
Старый 18.05.2014, 17:10
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Траекторию можно приблизить к прямолинейной применяя небольшие хитрости с рандомом.
С помощью рандома траектория скорее приблизится к синусоиде или дуге. Брезенхем тут значительно лучше.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:24.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter