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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.01.2011, 11:01
Аватар для EvilRussian
EvilRussian EvilRussian вне форума
Начинающий
 
Регистрация: 21.12.2010
Адрес: Россия, Красноярский край
Сообщения: 177
Репутация: 22
Вопрос Движение компонента

Я взялся за новый проект, поэтому у меня будет туча вопросов, но чуть позже

Вопрос такой: нужно организовать плавное перемещение компонента (12 пикселей/сек) к заданной точке.

Вот пример:
http://files.mail.ru/FRGADK
(Для того чтобы запустить пример, щёлкните любую карточку)
Можно ли сделать что-нибудь подобное на Дельфи?

З.Ы. Пример написан на GMK (Game Maker).
__________________
Если не ты, то кто?
(с) Терри Пратчетт

Не забывайте ставить плюсы и говорить спасибо!
Ответить с цитированием
  #2  
Старый 05.01.2011, 14:58
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Можно ли сделать что-нибудь подобное на Дельфи?
В теории можно написать почти всё на почти всём
Цитата:
Вопрос такой: нужно организовать плавное перемещение компонента (12 пикселей/сек) к заданной точке.
Перемещение делается легко: ставишь таймер с интервалом например 40мс (25 срабатываний в секунду, можно и выше), и по событию таймера двигаешь картинки. Сделать их можно из TImage. И менять координаты Top и Left. Меняешь например на 1 пиксель за срабатывание - будет 25 пикс/сек. Если надо медленнее - то ставишь в таймере например 80мс. тогда будет где-то 12 пикс/сек.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #3  
Старый 05.01.2011, 16:32
Аватар для EvilRussian
EvilRussian EvilRussian вне форума
Начинающий
 
Регистрация: 21.12.2010
Адрес: Россия, Красноярский край
Сообщения: 177
Репутация: 22
По умолчанию

Понимаешь, неизвестна ни стартовая позиция, ни конечная точка.
А движение должно идти по прямой.
Как решить такую задачу?

(Жалко, что я не знаю как работает Step_Towards из GMK...)
__________________
Если не ты, то кто?
(с) Терри Пратчетт

Не забывайте ставить плюсы и говорить спасибо!
Ответить с цитированием
  #4  
Старый 05.01.2011, 16:49
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Стартовая позиция (по крайней мере в примере) известна - начальная координата.
Конечная позиция тоже (например рандом).
Иначе как пойти в магазин если ты не знаешь где магазин и где ты?))
Составляешь уравнение прямой и прибавляешь соответствующие числа:
Код:
var k, b, x, y:extended;
...
//Стартовая инициализация:
x:=x1;
//Y не нужно, он будет все время пересчитываться "с нуля" для повышения точности
...
//уравнения прямой вида y=kx+b:
k:=(Y1-Y2)/(X1-X2); // x1,x2,y1,y2 - координаты первой и второй точек
b:=y1-k*x1;
...
//дальше прибавляем по X например 1, а по Y находим из уравнения:
x:=x+1;
y:=k*x+b;
//можно еще так: если |K|<1 то прибавляем по X и ищем Y, иначе
//прибавляем по Y и ищем X. Тогда будет отрабатываться лучше.
//А еще лучше вычислять скорость  по осям X и Y в зависимости от K, 
//исходя из того, что K - тангенс угла наклона скорости к оси OX:
{
 // Инициализация после подсчета K:
 Vx:=1*cos(arctan(k)); // В данном случае 1 - скорость по прямой в Пикс/срабатываний таймера
 vy := k * vx;
 ...
 x:=x+Vx;
 y:=y+Vy;
}
//и двигаем:
Image1.Left:=round(x);
Image1.Top:=round(y);
В таком случае надо хранить в глобальных переменных начальные и конечные точки, или же один раз посчитать K и B для каждой картинки и хранить их.

Проект - движущаяся картинка: едет в направлении, заданном тыканьем мышки на форме.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 05.01.2011 в 17:56.
Ответить с цитированием
  #5  
Старый 05.01.2011, 18:40
Аватар для EvilRussian
EvilRussian EvilRussian вне форума
Начинающий
 
Регистрация: 21.12.2010
Адрес: Россия, Красноярский край
Сообщения: 177
Репутация: 22
По умолчанию

Bargest
Замечательно! Спасибо большое!

Цитата:
Стартовая позиция (по крайней мере в примере) известна - начальная координата.
Конечная позиция тоже (например рандом).
Я имел в виду ЗАРАНЕЕ неизвестны

Кстати, в примере забыл сделать остановку картинки
Ну это ничего, это я и сам могу сделать

В общем, спасибо и +1.
__________________
Если не ты, то кто?
(с) Терри Пратчетт

Не забывайте ставить плюсы и говорить спасибо!
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter