|
Блокировка запуска анимации до её окончания
|
|||
---|---|---|---|
#18+
У меня по нажатию на кнопку запускается анимация. Как сделать, чтобы при зажатии этой кнопки анимацию на запускалась много раз очень быстро, а проигрывалась только один раз? При этом по окончании анимации, если кнопка по-прежнему зажата, то анимация должна запуститься снова. Вобщем при зажатии кнопки должен быть эффект, как будто анимация зациклена, хотя при этом в свойствах анимации я специально зацикленность убрал. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2011, 20:34 |
|
Блокировка запуска анимации до её окончания
|
|||
---|---|---|---|
#18+
Наверх. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2011, 07:54 |
|
Блокировка запуска анимации до её окончания
|
|||
---|---|---|---|
#18+
user7320, у анимации есть событие, "закончилась", вот в ней меняй флаг. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2011, 10:34 |
|
Блокировка запуска анимации до её окончания
|
|||
---|---|---|---|
#18+
триггер на IsMouseOver = false, IsPressed = true и сделай зацикленную. В твоем сценарии подвохов не вижу нигде. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2011, 15:34 |
|
Блокировка запуска анимации до её окончания
|
|||
---|---|---|---|
#18+
xpoft2010триггер на IsMouseOver = false, IsPressed = true и сделай зацикленную. В твоем сценарии подвохов не вижу нигде. Уточню: по нажатии кнопки (т. е. нажал и отпустил) анимация должна один раз полностью проиграть. По зажатии (нажал и держишь) - должна быть зацикленной, при этом каждый цикл должен запускаться только один раз - анимация не должна перекрывать сама себя (а она это делает, если её на событие простого нажатия кнопки повесить). Пример с печатанием текста. Как сделано обычно: нажал раз - одна буква, держишь кнопку - автоматом серия букв. Как мне надо: нажал раз - одна буква, держишь кнопку - одна анимация отрисовки буквы, потом друга, потом третья и т. д., а не одновременно серия анимаций отрисовки сразу кучи одинаковых букв. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2011, 12:54 |
|
Блокировка запуска анимации до её окончания
|
|||
---|---|---|---|
#18+
xpoft2010IsMouseOver Мне всё же на баттоны надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2011, 12:54 |
|
Блокировка запуска анимации до её окончания
|
|||
---|---|---|---|
#18+
user7320, Я бы посоветовал освоить VisualStateManger ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2011, 19:33 |
|
Блокировка запуска анимации до её окончания
|
|||
---|---|---|---|
#18+
Руки-крюкиuser7320, Я бы посоветовал освоить VisualStateManger На баттоны клавиатуры. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2011, 10:41 |
|
Блокировка запуска анимации до её окончания
|
|||
---|---|---|---|
#18+
Руки-крюкиuser7320, Я бы посоветовал освоить VisualStateManger Анимация запускается не для чего-нибудь, а для камеры в трёхмерном пространстве. А точнее, я запускаю DoubleAnimation для нужной координаты положения камеры. VisualState тут, я думаю, не нужен. Я специально более общий вопрос задал, чтобы не конкретизировать. Нужно просто реализовать описанное выше поведение: нажал кнопку - анимация один раз; зажал кнопку - анимация один раз, потом ещё раз и т. д. последовательно, пока зажата кнопка, а не параллельно куча одних и тех же анимаций. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2011, 10:44 |
|
Блокировка запуска анимации до её окончания
|
|||
---|---|---|---|
#18+
user7320, слушай, ты что правда не можешь сообразить? сделай простую очередь. туда пихай все клавиши. сделай поток в программе, который будет управлять анимацией. этот потом будет смотреть на какие нито переменные UI потока. может тебе просто поспать надо, чтобы голова трезвая была? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2011, 11:50 |
|
Блокировка запуска анимации до её окончания
|
|||
---|---|---|---|
#18+
AlexeiKuser7320, слушай, ты что правда не можешь сообразить? сделай простую очередь. туда пихай все клавиши. сделай поток в программе, который будет управлять анимацией. этот потом будет смотреть на какие нито переменные UI потока. может тебе просто поспать надо, чтобы голова трезвая была? Я могу придумать какой-нибудь костыль. Но я хочу узнать, есть ли какой способ сделать это по уму. "По уму" - значит просто и красиво. Вроде, задача-то тривиальная - должно быть какое-то простое решение. Ну, раз вы не знаете, значит, не тривиальная. Тогда костыль придётся. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2011, 12:43 |
|
Блокировка запуска анимации до её окончания
|
|||
---|---|---|---|
#18+
user7320, ты думал, что есть уже какой то компонент в студии, который реализовывает эту логику? ну это ж не логично так думать. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2011, 13:27 |
|
Блокировка запуска анимации до её окончания
|
|||
---|---|---|---|
#18+
AlexeiKuser7320, ты думал, что есть уже какой то компонент в студии, который реализовывает эту логику? ну это ж не логично так думать. Нет, я думал, что раз задача тривиальная и распространённая (а почему бы ей не быть такой?), то народ уже давно напридумывал шаблонных решений. Я очень удивлён, что не напридумывал. У меня камера (т. е. сам персонаж) двигается по клеточкам в трёхмерном мире. Т. е. за одно нажатие кнопки проходится одна клетка. Это я делаю, анимируя координату камеры. Когда пользователь хочет просто долго идти вперёд, то он не должен жать много раз на кнопку "вперёд", а должен просто зажать её. Так вот, у меня сейчас анимация отрабатывает по событию ButtonDown. При зажатии кнопки эти события очень быстро возникают, и анимация тоже стартует много раз, и неизбежно накладывается друг на друга. В результате камера перемещается вперёд очень быстро - с суммой скоростей всех анимаций. Теперь понимаете, чего я хочу? ) Первое, что пришло в голову - в событии ButtonDown запустить анимацию и тут же отписаться от события ButtonDown. По окончании анимации подписаться на это же событие. Вот так и заблокирую повторные нажатия до окончания анимации. Костыль? - Костыль и кривовато придумано. Некрасиво. Да ещё непонятно, сколько попутных костылей придётся придумать, чтобы описанное реализовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2011, 15:07 |
|
Блокировка запуска анимации до её окончания
|
|||
---|---|---|---|
#18+
user7320, ну вот , а че раньше то, не говорилось по-русски? писал какие то зажеванные мысли. смотри: делаешь переменную: направление движения. на событие keydown , делаешь: проверяем, нужно ли менять направление если да, то меняем если нет, то игнор нажатия. двигать же камеру должен какой то таймер или поток. вот ты собственно и должен управлять только направлением движения. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2011, 16:02 |
|
Блокировка запуска анимации до её окончания
|
|||
---|---|---|---|
#18+
AlexeiKuser7320, ну вот , а че раньше то, не говорилось по-русски? писал какие то зажеванные мысли. смотри: делаешь переменную: направление движения. на событие keydown , делаешь: проверяем, нужно ли менять направление если да, то меняем если нет, то игнор нажатия. двигать же камеру должен какой то таймер или поток. вот ты собственно и должен управлять только направлением движения. Насчёт таймера или потока - это не нужно в отдельном потоке, так как там всё проще - интерфейс не работает, пока анимация движения на одну клетку не закончилась. (Так нужно - я копирую интерфейс одной игры. Всё в порядке, это не мешает играть, а наоборот удобно.) Так что всё в потоке интерфейса можно сделать. Далее, про направление движения. У меня тоже всё проще: клавиши клавиатуры "ввехр" и "вниз" - это вперёд и назад. Клавиши "вправо" и "влево" - повороты на месте направо и налево. Т. е. определять, куда меняется направление не нужно - за каждой клавишей своя готовая анимация закреплена. Всё на ButtonDown'ах. Я могу ходить по клеточкам - нажимая по разу на одну клеточку. Могу зажать, но тогда либо очень быстро двигаюсь вперёд-назад, либо очень быстро поворачиваюсь. Надо только вот эту быстроту убрать. С учётом всего этого рекомендации не изменились? Вот вы сказали про игнор ражатия - это про Handled-свойство? Тогда у меня такой вариант, чтобы не отписываться-подписываться на события постоянно: заводить глобальную переменную, означающую, завершилась ли анимация движения, и в обработчике нажатия кнопки проверять её значение - если не завершилась, то Handled == true. Глобальную переменную менять в обработчике события завершения анимации движения. Итого для четырёх моих движений - четыре анимации и четыре глобальных переменных соответственно. Вот только с глобальными мне не нравится - костыль. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2011, 16:34 |
|
Блокировка запуска анимации до её окончания
|
|||
---|---|---|---|
#18+
Тут вообще никакая анимация не нужна, и уж тем более VisualStateManager. По зажатию клавишы запускаешь таймер. По отжатию останавливаешь. Пускай таймер тикает с частатой 100 мс. 1-й тик - 1 раз двигаем персонажа. 2-20 тики - таймер делает return в начале обработчика. 20 и дальше тики - двигаем на одну клетку. Зачем мудрить? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2011, 22:45 |
|
Блокировка запуска анимации до её окончания
|
|||
---|---|---|---|
#18+
Ну и конечно в функции передвижения сделать проверку работает ли анимация. Если работает то сделать отложенный вызов следующего передвижения (если конечно такой вызов не был уже сделан). ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2011, 22:48 |
|
Блокировка запуска анимации до её окончания
|
|||
---|---|---|---|
#18+
Руки-крюкиТут вообще никакая анимация не нужна, и уж тем более VisualStateManager. По зажатию клавишы запускаешь таймер. По отжатию останавливаешь. Пускай таймер тикает с частатой 100 мс. 1-й тик - 1 раз двигаем персонажа. 2-20 тики - таймер делает return в начале обработчика. 20 и дальше тики - двигаем на одну клетку. Зачем мудрить? Анимация как раз нужна. По-вашему выйдет, что каждое движение персонажа будет рывками и вообще ограничено 10 кадрами в секунду. Более того, заботу о частоте кадров тут я беру на себя. В модели анимации WPF всё делает за меня сам WPF. Тем более, что в WPF нет таймеров в таком свободном доступе, как в формах. Мне приходилось импортировать компонент таймер из форм, т. к. больше никаких свободно доступных таймеров в WPF нету. Те таймеры, что отвечают за анимацию WPF - до них не добраться. Тем более непонятно, как их использовать отдельно от анимации. Кроме того, у меня персонаж может двигаться только по клеточкам (специально), и поэтому, даже если игрок отпустил клавишу на границах между клетками, анимация движения в клетку назначения должна доиграть о конца, чтобы игрок встал на середину клетки. А у вас получается, что он может остановиться в любой момент. Т. е. мне нужно ещё дополнительную логику для отслеживания количества прошедших тиков таймера. Короче говоря, вы предлагаете организовать ту же анимацию, только вручную, с неизбежными косякам, которые наверняка всплывут, и код только усложнится. У меня же всё готово уже - весь "движок" в части перемещений, и надо только решить проблему, которую я вначале описал. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2011, 07:37 |
|
Блокировка запуска анимации до её окончания
|
|||
---|---|---|---|
#18+
Мне приходилось импортировать компонент таймер из форм, т. к. больше никаких свободно доступных таймеров в WPF нету. Те таймеры, что отвечают за анимацию WPF - до них не добраться. Тем более непонятно, как их использовать отдельно от анимации. Плюс, таймер из форм имеет точность где-то 16 мс, что примерно и соответствует WPFфовским 60 кадрам в секунду. Но вот как формовский таймер отрабатывает значения, не кратные 16 мс - это вопрос. На сколько я знаю, он просто пропускает (не успевает тикнуть) все не кратные 16 мс... ну или приводит каждый следующий тик к значению, кратному 16 мс. Короче, баг. А вот WPFфовский таймер не факт, что имеет квант в 16 мс. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2011, 07:43 |
|
Блокировка запуска анимации до её окончания
|
|||
---|---|---|---|
#18+
AlexeiKделаешь переменную: направление движения. Ну и ещё я могу сказать, что мой движок перемещений по клеткам сделан из движка свободных перемещений в любом направлении на любое расстояние (заделка на будущее, если я захочу поменять модель перемещений). Вычислений всего чуток больше, а потенциальная функциональность закладывается огромная. Вот мои функции. Движения вперёд-назад - только изменение позиции, ЕЩЁ НЕ АНИМАЦИЯ. Формулы взял у одного дяди в Интернете в свободном доступе, но, как видите, они тривиальны и из единичной окружности и прямоугольного треугольника выводятся. Вверху-вниз смотреть нельзя. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Повороты: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Вот обработчик нажатия любой клавиши направления - тут уже запускаются анимации: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2011, 07:50 |
|
|
start [/forum/search_topic.php?author=zinziver&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
57ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 722ms |
total: | 902ms |
0 / 0 |