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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.06.2009, 11:37
iFynk iFynk вне форума
Прохожий
 
Регистрация: 10.06.2009
Сообщения: 36
Репутация: 10
По умолчанию Эффект "волны на воде". Можно как-то применить для формы?

Всем привет. Видел приложение в котором, при клике мышкой по изображению, проявлялся еффект волн. Мне вот интерестно, как можно сделать такой же еффект, но чтоб он применялся не к конкретному изображению, а, например, к форме и находящимся на ней компонентам?
Ответить с цитированием
  #2  
Старый 11.06.2009, 08:24
DungeonLords DungeonLords вне форума
Активный
 
Регистрация: 21.07.2008
Сообщения: 257
Репутация: 14
По умолчанию

Цитата:
Сообщение от iFynk
Всем привет. Видел приложение в котором, при клике мышкой по изображению, проявлялся еффект волн. Мне вот интерестно, как можно сделать такой же еффект, но чтоб он применялся не к конкретному изображению, а, например, к форме и находящимся на ней компонентам?
Конечно можно сделать как ты хочешь. В примитивном случае тебе просто нужно отрендить изображение формы (только не делай это через GDI). Далее, средствами любого быстрого графического API (опять же только не через GDI) примени некие фильтры, которые можно поискать в интернете. Он будет изменять исходное изображение таким образом, чтобы это было похоже на эффект волн. Ну и при применении фильтра каждый раз выводи получившееся изображение на всю форму. В OpenGL вывод "получившегося" изображение называют выводом в буфер кадра. Но тут есть сложность в том, что при выводе конечного изображения я так понимаю компоненты формы должны функционировать. Т.е. например, заданое событие "OnClic" должно работать и т.д. С этим будут большие проблемы, но сначало опиши подробнее что тебе нужно.
__________________
Делаем'c разные игры. Искать на glscene.ru

Последний раз редактировалось DungeonLords, 11.06.2009 в 08:30.
Ответить с цитированием
  #3  
Старый 11.06.2009, 08:52
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Цитата:
Но тут есть сложность в том, что при выводе конечного изображения я так понимаю компоненты формы должны функционировать. Т.е. например, заданое событие "OnClic" должно работать и т.д.
Тут как-раз сложностей нет, повесить на OnTimer и будет обновляться немешая другим процессам.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #4  
Старый 11.06.2009, 10:21
iFynk iFynk вне форума
Прохожий
 
Регистрация: 10.06.2009
Сообщения: 36
Репутация: 10
По умолчанию

Пишу некоторую программу, которая управляется с помощь touchscreen'а. Вот и захотелось применить вот такой еффектик.

Спасибо за ответы, но можно поподробнее. Я так понял, что мне нужно:

1. Сделать снимок формы со всем содержимым
2. вывести этот снимок и применить к нему еффект.

Верно? Вот не понятно, как при этом оставить доступ ко всем контролам на форме?

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

Компонентик такой полезный есть TTimer позволяет выполнять через заданый интервал времени некие действия. Выполняется паралельно общей нити процесса приложения и немешает ему заниматься своими делами. Вот у него есть событие OnTimer про которое я и говорил.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 11.06.2009, 11:52
iFynk iFynk вне форума
Прохожий
 
Регистрация: 10.06.2009
Сообщения: 36
Репутация: 10
По умолчанию

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

С чего вдруг? Предполагается, что у вас есть некий битмап скажем на TImage, вы его выводите на форму. Поверх него выводите остальные компоненты. Т.е. картинка оказывается снизу. Далее задействуете на событии OnTimer фильтр к битмапу от TImage. При этом естественно ничего не должно портится.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #8  
Старый 11.06.2009, 15:07
iFynk iFynk вне форума
Прохожий
 
Регистрация: 10.06.2009
Сообщения: 36
Репутация: 10
По умолчанию

Дело в том, что я хочу, чтоб когда, например, нажимаешь на кнопку, волны пошли над ней, тоесть, чтоб еффект применился и к ней тоже.
Ответить с цитированием
  #9  
Старый 11.06.2009, 18:59
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Можно и так, только это лучше делать не ко всей форме а именно к кликнутому элементу и близлежайшим окрестностям, во избежании артефактов. Здесь почти тоже самое, в момент клика, запомнить область в битмап несколько больше занимаемой контролом, тут надо подобрать оптимальный размер. Далее опять-же по таймеру начинаете последовательно применять фильтр к полученному битмапу и выводить его обратно откуда взяли и так до тех пор пока ваш эффект волн не затухнет. Тут надо подобрать соотношение длительности этого эффекта с комфортным откликом на нажатие, т.к. согласитесь, что если я нажимая на кнопку ожидаю получить результат, а вместо результата получаю полуминутный ролик, то впору пристрелить автора такого сервиса.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #10  
Старый 12.06.2009, 10:47
iFynk iFynk вне форума
Прохожий
 
Регистрация: 10.06.2009
Сообщения: 36
Репутация: 10
По умолчанию

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

Несовсем так, повторно нажать можно, только вам надо завести 2 состояния для кнопки:
Ожидает - ничего не нажато и можно запустить анимацию,
Действует - кнопка уже была нажата и анимация запущена.
При нажатии на кнопку состояние кнопки переключается с Ожидает на Действует и наоборот.
А в событии OnTimer обрабатываете эти состояния. Если состояние кнопки Действует, то выполняется следующий шаг анимации. Если сосотяние Ожидает, значит анимацию надо прервать. Как только последний шаг анимации закончится состояние кнопки выставить в Ожидает.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #12  
Старый 12.06.2009, 11:59
iFynk iFynk вне форума
Прохожий
 
Регистрация: 10.06.2009
Сообщения: 36
Репутация: 10
По умолчанию

Я имел ввиду, что картинка с ефектом будет находится над кнопкой и поетому на ней не получится нажать.
Ответить с цитированием
  #13  
Старый 12.06.2009, 14:02
DungeonLords DungeonLords вне форума
Активный
 
Регистрация: 21.07.2008
Сообщения: 257
Репутация: 14
По умолчанию

Цитата:
Сообщение от iFynk
Я имел ввиду, что картинка с ефектом будет находится над кнопкой и поетому на ней не получится нажать.
Кажется я нашёл решение для вас. Но придётся полностью отказаться от стандартных Delphi кнопок. Делайте свои кнопки. Например из TBitmap. А нажатие проверяйте в таймере как коллизию точки с квадратом. Позиция X,Y очки - координаты курсора. Позицию X,Y квадрата - координаты кнопки. Незабудьте, что у кнопки ещё есть ширина и высота (я имею ввиду коллизию с ними). Про коллизию смотрите в гугле или на геймдейве: http://www.gamedev.ru/ . В таком случае ничто не будет перекрываться и вы сможите нажимать на кнопки в любое время.
__________________
Делаем'c разные игры. Искать на glscene.ru
Ответить с цитированием
  #14  
Старый 12.06.2009, 14:24
iFynk iFynk вне форума
Прохожий
 
Регистрация: 10.06.2009
Сообщения: 36
Репутация: 10
По умолчанию

Цитата:
Сообщение от DungeonLords
Кажется я нашёл решение для вас. Но придётся полностью отказаться от стандартных Delphi кнопок. Делайте свои кнопки. Например из TBitmap. А нажатие проверяйте в таймере как коллизию точки с квадратом. Позиция X,Y очки - координаты курсора. Позицию X,Y квадрата - координаты кнопки. Незабудьте, что у кнопки ещё есть ширина и высота (я имею ввиду коллизию с ними). Про коллизию смотрите в гугле или на геймдейве: http://www.gamedev.ru/ . В таком случае ничто не будет перекрываться и вы сможите нажимать на кнопки в любое время.

Спасибо, интересное решение. Все конечно усложняет, но ведь "красота требует жертв".
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter