Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Взаимное исключение событий мышки (http://www.flasher.ru/forum/showthread.php?t=177709)

KaaPex 06.04.2012 15:14

Взаимное исключение событий мышки
 
Всем привет.
Если кто-то встречался со подобным подскажите: есть две переменные, которые отслеживают зажата ли ЛКМ или просто сделан клик мышкой. Как можно взаимно исключить эти два события, чтобы признак зажатой кнопки проставлялся только после какого-то интервала что-ли? То есть приоритет был у одиночного щелчка.

wvxvw 06.04.2012 15:55

А может проще в таком случае было бы реагировать на "отпускание" мышки? Просто у всех мышек и людей разные настройки / привычки. Вы на всех одинаковым интервалом не угодите.

KaaPex 06.04.2012 16:04

Если на отпускание мышки, то получится двойное срабатывание, то есть сначала будет признак что мышка зажата, а потом сразу еще и признак что просто нажата кнопка. Либо опять же надо какое-то рациональное время вводить, сколько прошло между зажатой и отжатой кнопкой. Наверное лучше будет ввести счетчик, который будет отвечать за количество тиков пройденных между зажатием и отпусканием кнопки мышки.

fljot 06.04.2012 19:02

Если, к примеру, взять эппловский UILongPressGestureRecognizer, то там эта самая задержка по-умолчанию равна 0.5 секунды.
Вам зачем вообще это всё?

wvxvw 06.04.2012 21:06

Нет, вы не поняли. Одно событие происходит когда мышку отпускают, другое - когда нажимают. Нет двух событий, просто "клик" будет срабатывать когда мышку оптустили, а не нажали.

fish_r 07.04.2012 17:05

Может заменить прослушивание события CLICK на DOUBLE_CLICK? Оно, вроде, для таких вот случаев.

KaaPex 09.04.2012 10:53

Зачем это все надо: пишу небольшую стрелялку, необходимо, чтобы объекты вылетали через одинаковый интервал времени, независимо от количества и вариантов нажатия мышки, то есть у персонажа есть некий стат, который отвечает за скорость стрельбы, его можно уменьшать либо увеличивать. Сейчас более мене вроде добился стабильности, но все равно что-то не так.

alatar 09.04.2012 11:08

Выстрел -> перезарядка -> выстрел -> ...
Варьируется только время перезарядки. И не будет зависеть от скорости кликов.

KaaPex 09.04.2012 12:48

Можно ли использовать setTimeout для таких случаев, так как пуля должна вылетать только на втором кадре анимации персонажа? Само собой скорость анимации зависит от количества ударов в секунду.

alatar 09.04.2012 13:05

Зачем? Паузу не замучаетесь реализовывать? На каждый игровой тик проверяйте закончилась ли перезарядка.

Dukobpa3 09.04.2012 13:21

Можно и setTimeout.
Только в таких играх как правило уже есть стопицот таймеров. Лучше бы сделать один таймер отовсюду доступный и на него подписываться, какой-то там 100мс или 1сек. Меньше лучше не делать, все-равно будет косячить если интервал короче одного-двух кадров.

alatar 09.04.2012 13:26

Цитата:

Лучше бы сделать один таймер отовсюду доступный и на него подписываться
а потом повсюду отписываться, а потом повсюду подписываться, а потом...

Dukobpa3 09.04.2012 13:35

Именно!!
)))

К тому же незачем подписываться там где это не нужно - это упрощает задачу отписывания ;)

alatar 09.04.2012 13:43

В играх вообще нет смысла городить подписку на глобальные таймеры. Это еще больше упрощает задачу отписывания :)

Dukobpa3 09.04.2012 13:50

Один таймер это бонус к производительности и глобальной синхронизации по времени, как я понимаю.

alatar 09.04.2012 13:52

Зависит от того как его варить. То, что вы предложили это бонус к глюкам и костылям.

Dukobpa3 09.04.2012 13:55

Так а что я предложил то? Я без подробностей. А суть верная.

alatar 09.04.2012 15:13

Обычно делается единый "обновлятор" (менеджер игрового цикла), который обновляет (например, вызывает у них метод update) состояния объектов. А не таймер на который все подписываются.

KaaPex 09.04.2012 15:13

Вообще у меня сделано все через тик рэйты на каждое действие, которые зависят от статов игрока и количества кадров в секунду. По поводу setTimeout спросил, так как изначально наткнулся на него и попробовал что-то сделать с его помощью, но получилось весьма глюковато. Сделать конечно через что угодно можно, но все это держать в голове и не забыть обнулить где-то таймер для меня сложновато )) Если интересно, могу дать ссылку что получилось сейчас. Правда вот интересный феномен, garbage на десктопе показывает 0.130 , а на сайте около 10.000. С чем это может быть связано?

alatar 09.04.2012 15:16

setTimeout не рекомендован к использованию. По-сути это костыль к Timer.

Dukobpa3 09.04.2012 15:20

Единый обновлятор не везде хорош, хотя я тоже склоняюсь к такому подходу, как к основному в своих разработках. Ничего плохого в глобальном таймере не вижу.

alatar 09.04.2012 15:48

Например?

Dukobpa3 09.04.2012 16:44

Например я в последнее время склоняюсь к несколько асинхронной архитектуре, а то что-то меня напрягать начали эти деревья классов, когда верхний рулит дочерними, и так в глубь. На простых приложениях конечно всё ок и с деревом, а если там стопицот всего появляется то уже как-то уныло становится от такого кол-ва связей.

Ну т.е. в целом у меня дерево, но не брезгую и асинхроном, там где это упростит разработку. Так вот глобальный таймер, с моей точки зрения, это такой вот полезный асинхрон, упрощающий жизнь.

alatar 09.04.2012 16:49

Я имел ввиду конкретный пример.

Dukobpa3 09.04.2012 16:58

Та банально МВЦ - структура.
Если и есть какой-то глобальный обновлятор - то это будет нечто глобальное которое меняет все модели, чтобы вьюхи отрисовались.

Или же делать дерево моделей централизованное, чтобы была одна верхняя, которая будет свои ветки дергать.

А так есть несколько больших моделей независимых, плюс есть еще одна в которой вот этот самый таймер. Этот таймер периодически синхронизируется с сервером. Ну и остальные модели(а может контроллеры) подписаны на этот таймер и там что-то делают.

alatar 09.04.2012 17:17

Цитата:

у и остальные модели(а может контроллеры)
Так модели или все-таки "может"? Моделям-то какое дело до каких-то там таймеров. Ладно это уже оффтоп пошел.

Dukobpa3 09.04.2012 17:26

На самом деле не оффтоп. Просто по-правильному таймера как раз в моделях должны быть и модели должны уметь самообновляться если это периодическое обновление без внешнего поступления новых данных.

Но часто делают так что модель это тупо БД, которая ничего не умеет и только хранит данные. Потому и "может контроллер". Я в своих личных поделках использую правильный МВЦ в котором модель умная. На работе же у нас принята структура в которой контроллер - всему голова.

alatar 09.04.2012 17:38

Цитата:

Я в своих личных поделках использую правильный МВЦ в котором модель умная.
Кто вам сказал, что именно ваше видение MVC правильное? Тем более, что собственно "C" у вас отсутствует. И почему "по-правильному" у вас модели самообновляются. AI вы тоже в модели запихали?

Dukobpa3 09.04.2012 17:50

ну да ну да, мвц у всех разный.
Под правильным я понимаю то что описано в википеди.
И там большими буквами написано: "одна из самых распространенных ошибок - модель в роли базы данных, которая не содержит логики"

Добавлено через 31 секунду
Я не хочу мвц обсуждать, просили пример - я дал.

alatar 09.04.2012 18:47

Для интерпрайза именно такой подход "как в википедии" и применяется, Большинство "универсальных" MVC фреймворков построены по этому принципу. Т.е. контроллера, как отдельной сущности нет, вместо этого используются команды, выполняемые по определенному событию. Для игр (с моей точки зрения) более удобен промежуточный вариант. Ладно, это все лирика. Вернемся к таймерам.

По факту в вашей схеме (если я все правильно понял), "таймер" тот же "обновлятор". Единственная разница, что вместо "добавить участника" у вас "подписаться на событие обновления". Так?

Dukobpa3 09.04.2012 18:57

Цитата:

Единственная разница, что вместо "добавить участника" у вас "подписаться на событие обновления". Так?
Да я собственно с этого и начал. Тот же кран только в левой руке.

Только почему-то:
Цитата:

Сообщение от alatar
То, что вы предложили это бонус к глюкам и костылям.

Цитата:

Сообщение от alatar
Обычно делается единый "обновлятор"


alatar 09.04.2012 19:34

В такой схеме нет контроля порядка обновления. В случаях, когда такой порядок необходим придется выкручиваться через приоритеты, что повлечет изменения в нескольких местах программы вместо одного. Нет простой возможности исключить группу объектов из обработки. Эти проблемы решаемы, но в итоге сложность программы получается даже выше, чем при менеджере, который на прямую вызывает методы у участников. В частных случаях, получится проще, но в общем либо сопоставимо, либо сложнее.

Dukobpa3 09.04.2012 19:43

Ни о чем спор.
Это всё тонкости реализации, и если у кого-то это выливается в какие-то сложности, то к чему тут я.

В общем и целом - асинхрон требует меньше кода, но его сложнее контролировать. Очевидно, что при недостаточности опыта, это повлечет за собой проблемы.

Не вижу смысла продолжать дискуссию.

alatar 09.04.2012 19:49

Как раз не "в общем и целом", а в частном. Естественно все зависит от конкретной реализации. И кстати ваша схема без дополнительных действий синхронна, а описанная мной схема не исключает асинхронности.

Dukobpa3 09.04.2012 19:54

"В интернете кто-то не прав"


Часовой пояс GMT +4, время: 14:57.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.