Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   MOUSE_OVER (http://www.flasher.ru/forum/showthread.php?t=144815)

roborobo 21.09.2010 23:13

MOUSE_OVER
 
Требуется получать событие MOUSE_OVER все время (с некоторым интервалом, например, 10 раз в секунду), пока курсор над объектом, а не только в момент наведения курсора. Как это лучше сделать?
И сразу второй вопрос - как сделать цикл, что бы на каждой итерации была задержка? Пробовал таймер, не получилось.

stweet 21.09.2010 23:18

Цитата:

Пробовал таймер, не получилось.
плохо пробовал.

roborobo 21.09.2010 23:20

Да, плохо... Есть работающий пример?

КорДум 22.09.2010 00:24

Сработал mouseOver, включился таймер, сработал mouseOut, выключился таймер. Только что-то мне подсказывает, что тут лучше пользоваться enterFrame, а не таймером.

roborobo 22.09.2010 00:41

КорДум: "лучше пользоваться enterFrame"

А если у меня фреймы не меняются? Я скролл делаю. У меня при наведении курсора на объект меняется положение другого объекта (на N пикселей, каждые 1/m сек).

stweet 22.09.2010 00:41

"enterFrame" работает от количества кадров, не вариант. Таймер здесь в раз будит.
А в целом КорДум прав.

roborobo 22.09.2010 00:45

stweet
Ок. Но все же, как правильно организовать таймер в моем случае? Таймер может генерить event'ы с некоторой периодичностью?

stweet 22.09.2010 01:00

нет, <<!"enterFrame" работает от количества кадров!>> скинь пример, допишу отдам.

roborobo 22.09.2010 01:06

stweet
Ну а какой пример? Пусть будет 2 объекта - button и ... да что угодно, например graphic. При наведении курсора на button, graphic должен смещаться вверх на 2 пикселя каждые 1/20 сек. Вот и весь проект :)

stweet 22.09.2010 01:34

Единственное, добавь булевое значение, сори не дописал, не успел. Если что завтро до помогу.

Код AS3:

package {
        import flash.display.Sprite;
        import flash.events.MouseEvent;
        import flash.events.TimerEvent;
        import flash.utils.Timer;
 
        public class TestTimerBtn extends Sprite {
 
                private var tmp_btn:Sprite;
                private var tmp_tim:Timer;
                private var n:int;
 
                public function TestTimerBtn ():void {
 
                        tmp_btn = new Sprite();
                        tmp_btn.graphics.lineStyle(1);
                        tmp_btn.graphics.beginFill(0x0000ff, 1);
                        tmp_btn.graphics.drawRect(50, 50, 100, 50);
                        addChild(tmp_btn);
 
                        tmp_btn.addEventListener(MouseEvent.MOUSE_UP, M_BTN1);
                        tmp_btn.addEventListener(MouseEvent.MOUSE_OVER, M_BTN2);
 
                        tmp_tim = new Timer(100, 0); // Сдесь "100" интервал. "0" количество раз.
 
                        tmp_tim.addEventListener(TimerEvent.TIMER, timeOut);
                }
 
                private function M_BTN1(e:MouseEvent):void {
                        tmp_tim.start();
                }
 
                private function M_BTN2(e:MouseEvent):void {
                        tmp_tim.stop();
                }
 
                private function timeOut(e:TimerEvent):void {
                        n ++;
                        if (n == 10) {
                                trace("Yes");
                                n = 0;
                        }
                }
        }
}


roborobo 22.09.2010 01:36

stweet
Спасибо!

КорДум 22.09.2010 10:02

А вы думаете, что таймер не зависит от кадров? Кадры меняются всегда, не заблуждайтесь. Флешу же нужно обновлять экран. Вот он и обновляет в каждом кадре.

stweet 22.09.2010 11:45

Цитата:

Сообщение от КорДум (Сообщение 937711)
А вы думаете, что таймер не зависит от кадров? Кадры меняются всегда, не заблуждайтесь. Флешу же нужно обновлять экран. Вот он и обновляет в каждом кадре.

=) Ну так протестируй.... Поставь обновление экрана "3 фрэйма" и таймер на "1" в таймер приёмник поставь "update" после каждой интерации и увидите что при чистоте обнавления фрэйма в 3 картинка всё равно будет плавной!

Цитата:

Флешу же нужно обновлять экран.
"obdateAfter" у таймера сам делает обновление экрана не зависимо от установленного количества кадров!

если ни совсем явно описал могу пример сделать.

Добавлено через 4 минуты
КорДум - я бы ещё Мука почитал на вашем месте. Он там целую главу посветил выбору между "Таймер и Ентерфрэйм".

КорДум 22.09.2010 14:04

Я вам советую почитать еще внимательнее и найти место, где Мук говорит про зависимость таймера от кадров. Я также советую вам почитать, что предпочтительнее использовать в той или иной ситуации, дабы вычленить выгоду в оптимизации из этого всего.
3 кадра в секунду? Кто так будет извращаться?

Добавлено через 4 минуты
И вообще, если автор имеет в виду перетаскивание мышкой слайдера, то тут ни энтерФрейма, ни таймера не надо. mouseMove + updateAfterEvent в помощь.

alatar 22.09.2010 16:26

Цитата:

3 кадра в секунду? Кто так будет извращаться?
Тот кто ставит таймер на 1 мс и тут же перерисовывает экран :)

КорДум 22.09.2010 16:50

А все равно меньше 10 мсек таймер не поставить :)

i.o. 22.09.2010 17:16

в нынешнем FP 10.1 ничего чаще 60 раз в секунду не обновляется. Ни таймер, ни кадры.

Цитата:

при чистоте обнавления
Цитата:

я бы ещё Мука почитал на вашем месте
на вашем месте надо бы Русский язык почитать

honest_man 22.09.2010 18:49

ненадо ссориться! А беседа интересная! Любопытно было читать!

roborobo 23.09.2010 00:37

Все получилось. Спасибо за ответы.

КорДум 23.09.2010 00:48

i.o., а чего это уже 60? Это оптимизацию такую решили сделать и еще больше запретить некоторым обновлять экран 1000 раз в секунду? Хотя да, все равно fps выше 60-70 не поставить, а тут и таймер стал каким-то еще более привязанным к кадрам...

i.o. 23.09.2010 01:19

КорДум, я могу конечно ошибаться, и был бы даже рад если б это было так ))
Как я не тестил, как ни крутил - 60fps и не больше. С таймером та же история - чаще 60 раз в сек не срабатывает.

dimarik 23.09.2010 01:30

Цитата:

Сообщение от roborobo (Сообщение 937654)
Требуется получать событие MOUSE_OVER все время (с некоторым интервалом, например, 10 раз в секунду), пока курсор над объектом, а не только в момент наведения курсора. Как это лучше сделать?
И сразу второй вопрос - как сделать цикл, что бы на каждой итерации была задержка? Пробовал таймер, не получилось.

Смысл сего действа не уловил. Вы себе трудности зарабатываете этим? Может Вам стоит пересмотреть архитектуру? Чем не устраивает сам факт MOUSE_OVER и последующие _какие-то_действия_? Зачем нужно подтверждать факт MOUSE_OVER несколько(!) раз? Ведь если был MOUSE_OVER, то когда-нибудь сработает и MOUSE_OUT. Подумайте, прежде чем наворачивать (с/x)уету на пустом мете.


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

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