Форум 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=135698)

Stanislavsky 29.01.2010 19:15

как сделать Слушатель на колесо мыши?
 
Привет!
Есть код - горизонтальный скролл. Подскажите, пожалуйста, как делать прокрутку с помощью колеса мыши!

AS3Coder 29.01.2010 19:20

Смотрите MouseEvent.MOUSE_WHEEL

Stanislavsky 29.01.2010 19:33

Кто посмотрит? Что то не правильно у меня?
Код AS3:

package
{
        import flash.display.*;
        import flash.events.*;
        import flash.geom.*;
        //Импорт TweenMax и plugin для blur filter
        import com.greensock.TweenMax;
 
        public class GalleryClass extends MovieClip
        {
                var scrollMC:Hand;
                var myContent:Content;
                var myMask:Maska;
                var scrolling:Boolean = false;
                //Создадим прямоугольник, который будет действовать как ограничитель для scrollMC.
                //Это способ, при помощи которого scrollMC можно перетаскивать только вдоль линии.
                var bounds:Rectangle = new Rectangle(scrollMC.x, scrollMC.y, 700, 0);
                //Мы хотим знать, какая была предыдущая x-координата для контента (для анимации)
                var oldX:Number = myContent.x;
                //Запомним длину контента и маски.
                var CONTENT_WIDTH:Number = 4000;
                var MASK_WIDTH:Number = 408;
 
 
                public function GalleryClass() : void       
                {           
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
 
                public function init(event:Event = null) : void       
                {
                        scrollMC = new Hand();
                        addChild(scrollMC);
                        scrollMC.x = 35;
                        scrollMC.y = 54;
 
                        myMask = new Maska();
                        addChild(myMask);
                        myMask.x = 20;
                        myMask.y = 90;
 
 
                        //Располагаем контент в левом верхнем углу маски
                        myContent = new Content();
                        addChild(myContent);
                        myContent.x = myMask.x;
                        myContent.y = myMask.y;
 
                        //Установим маску для нашего контента
                        myContent.mask = myMask;
 
 
                        //Мы хотим знать, когда пользователь скроллирует
                        var scrolling:Boolean = false;
                        //Слушаем, когда пользователь нажимает мышь на scrollMC
                        scrollMC.addEventListener(MouseEvent.MOUSE_DOWN, startScroll);
                        //Слушаем когда пользователь вращает колесико мыши
                        stage.addEventListener(MouseEvent.MOUSE_WHEEL, mouseWheelHandler);                       
                        //Слушаем, когда пользователь отпускает кнопку мыши
                        stage.addEventListener(MouseEvent.MOUSE_UP, stopScroll);
                        //Добавим ENTER_FRAME чтобы анимировать скроллирование
                        addEventListener(Event.ENTER_FRAME, enterHandler);
                }
                //Эта функция вызывается, когда пользователь перетаскивает scrollMC
                private function startScroll (event:Event):void
                {
                        //Установим scrolling равным true
                        scrolling = true;
 
                        //Начинаем перетаскивать scrollMC
                        scrollMC.startDrag(false,bounds);
 
                }
 
                //Эта функция вызывается, когда пользователь заканчивает перетаскивание scrollMC
                private function stopScroll(event:Event):void
                {
                        //Установим scrolling равным false
                        scrolling = false;
 
                        //Остановим перетаскивание
                        scrollMC.stopDrag();
                }
                //Эта функция выполняется в каждом фрейме
                private function enterHandler(event:Event):void
                {
                        //Проверяем, происходит ли скроллирование
                        if (scrolling == true)
                        {
                                //Вычисляем расстояние scrollMC от левого края
                                var distance:Number = Math.round(scrollMC.x - bounds.x);
 
                                //Вычисляем процентное содержание расстояния по отношению к длине линии.
                                //Итак, когда scrollMC слева, percentage равно 0 ,
                                // а когда справа - percentage равно 1.
                                var percentage:Number = distance / MASK_WIDTH;
 
                                //Сохраним старую x - координату
                                oldX = myContent.x;
 
                                //Вычисляем новую x -координату (targetX) для контента.
                                //Мы вычитаем длину маски из длины контента.
                                //Таким образом, контент должен двигаться влево, когда мы прокручиваем вправо.
                                //Удалите вычитание, чтобы убедиться лично!
                                var targetX:Number = -((CONTENT_WIDTH - MASK_WIDTH) * percentage) + myMask.x;
 
                                //Мы хотим анимировать скроллирование только если старый х отличается от нового х.
                                //В нашем мувике мы анимируем прокрутку, если разница больше чем 5 пикселов.
                                if (Math.abs(oldX - targetX) > 5)
                                {
                                        //Твин контента на новую позицию.
                                        //Вызываем функцию tweenFinished() когда твин завершится.
                                        TweenMax.to(myContent, 2, {x: targetX, blurFilter:{blurX:0, blurY:0}, onComplete: tweenFinished});
                                        }
                                }
                }
 
                //Эта функция вызывается, когда твин завершается
                private function tweenFinished():void
                {
                        //твин для возврата контента к нормальному состоянию (= удалим blur)
                        TweenMax.to(myContent, 0.3, {blurFilter:{blurX:0, blurY:0}});
                }
 
 
                function mouseWheelHandler(event:MouseEvent):void
                {
                        if ((event.delta < 0 && scrollMC.x > bounds.x) ||
                        (event.delta > 0 && scrollMC.x < bounds.x + bounds.width))
                        {
                        scrolling = true;
                        scrollMC.x = scrollMC.x + (event.delta * 9);
                        }
                }
        }
}

Добавлено через 6 часов 58 минут
ОШИБКА 1009!!! Что неправильно? Где же Вы специалисты?

alatar 30.01.2010 02:35

А текст ошибки все должны не память помнить?

Stanislavsky 30.01.2010 04:16

Извиняюсь.
"Невозможно получить доступ к свойству или методу пустой ссылки на объект. "
Объект, результатом которого является null, не может иметь свойств. Эта ошибка может возникнуть в некоторых неожиданных (однако допустимых) ситуациях. Возьмем для примера следующий код создания объекта Sprite. Так как этот объект Sprite никогда не добавляется в список отображения (с использованием метода addChild() объекта DisplayObjectContainer), его свойство stage принимает значение null. Таким образом, выполнение данного кода приводит к ошибке, так как свойство stage объекта Sprite не может обладать какими-либо свойствами:
import flash.display.Sprite;
var sprite1:Sprite = new Sprite();
var q:String = sprite1.stage.quality;

alatar 30.01.2010 05:11

1. Запустите флешку в дебаг режиме, что бы узнать строку в которой происходит ошибка.
2. В конструкторе все равно не может быть stage, оставьте:
Код AS3:

public function GalleryClass() : void         
{
        addEventListener(Event.ADDED_TO_STAGE, init);
}

Добавлено через 3 минуты
3. Зачем вам слушать ENTER_FRAME если вы используете твинер?В данном случае вместо ENTER_FRAME можно исмользовать MOUSE_MOVE. И слушатель лучше добавлять в обработчике MOUSE_DOWN и убирать в обработчике MOUSE_UP (MOUSE_UP тоже добавлять в MOUSE_DOWN и удалять в своем обработчике), зачем им висеть когда они не нужны?

dj_Kayot 31.01.2010 03:30

вопрос. а можно-ли как то узнать в какую сторону крутится скрол??

СлаваRa 31.01.2010 03:36

открываем хелп и видим
Цитата:

delta
delta:int [чтение и запись]

Язык версии : ActionScript 3.0
Версии среды выполнения: 1.0 9

Показывает расстояние прокрутки в строках на единицу вращения колесика мыши. Положительное значение delta показывает прокручивание вверх, отрицательное значение показывает прокрутку вниз. Как правило, используются значения в пределах 1-3, но более быстром прокручивании это число увеличивается. Этот параметр от устройства и операционной системы, как правило оно может настраиваться пользователем. Это свойство применяется только к событию MouseEvent.mouseWheel.

Psycho Tiger 31.01.2010 11:32

Цитата:

В конструкторе все равно не может быть stage
Может, если это базовый класс.

cleptoman 31.01.2010 13:32

о_О..а может если он не добавлен на сцену? )

Stanislavsky 31.01.2010 17:38

Этот код стоит в первом кадре мувика.
Не получается загрузить этот мувик в другой addChildAt.
Код AS3:

//Импорт TweenMax и plugin для blur filter
import com.greensock.TweenMax;
 
//Запомним длину контента и маски.
//Присвойте длину вашего контента здесь!
var CONTENT_WIDTH:Number = 1500;
var MASK_WIDTH:Number = 330;
 
//Мы хотим знать, какая была предыдущая x-координата для контента (для анимации)
var oldX:Number = myContent.x;
 
//Располагаем контент в левом верхнем углу маски
myContent.x = myMask.x;
myContent.y = myMask.y;
 
//Установим маску для нашего контента
myContent.mask = myMask;
 
//Создадим прямоугольник, который будет действовать как ограничитель для scrollMC.
//Это способ, при помощи которого scrollMC можно перетаскивать только вдоль линии.
var bounds:Rectangle = new Rectangle(scrollMC.x,scrollMC.y,700,0);
 
//Мы хотим знать, когда пользователь скроллирует
var scrolling:Boolean = false;
 
//Слушаем, когда пользователь нажимает мышь на scrollMC
scrollMC.addEventListener(MouseEvent.MOUSE_DOWN, startScroll);
 
//Слушаем когда пользователь вращает колесико мыши
stage.addEventListener(MouseEvent.MOUSE_WHEEL, mouseWheelHandler);
 
//Слушаем, когда пользователь отпускает кнопку мыши
stage.addEventListener(MouseEvent.MOUSE_UP, stopScroll);
 
//Эта функция вызывается, когда пользователь перетаскивает scrollMC
function startScroll(e:Event):void {
 
        //Установим scrolling равным true
        scrolling = true;
 
        //Начинаем перетаскивать scrollMC
        scrollMC.startDrag(false,bounds);
}
 
//Эта функция вызывается, когда пользователь заканчивает перетаскивание scrollMC
function stopScroll(e:Event):void {
 
        //Установим scrolling равным false
        scrolling = false;
 
        //Остановим перетаскивание
        scrollMC.stopDrag();
}
//Добавим ENTER_FRAME чтобы анимировать скроллирование
addEventListener(Event.ENTER_FRAME, enterHandler);
 
//Эта функция выполняется в каждом фрейме
function enterHandler(e:Event):void {
 
        //Проверяем, происходит ли скроллирование
        if (scrolling == true) {
 
                //Вычисляем расстояние scrollMC от левого края
                var distance:Number = Math.round(scrollMC.x - bounds.x);
 
                //Вычисляем процентное содержание расстояния по отношению к длине линии.
                //Итак, когда scrollMC слева, percentage равно 0 ,
                // а когда справа - percentage равно 1.
                var percentage:Number = distance / MASK_WIDTH;
 
                //Сохраним старую x - координату
                oldX = myContent.x;
 
                //Вычисляем новую x -координату (targetX) для контента.
                //Мы вычитаем длину маски из длины контента.
                //Таким образом, контент должен двигаться влево, когда мы прокручиваем вправо.
                //Удалите вычитание, чтобы убедиться лично!
                var targetX:Number = -((CONTENT_WIDTH - MASK_WIDTH) * percentage) + myMask.x;
 
                //Мы хотим анимировать скроллирование только если старый х отличается от нового х.
                //В нашем мувике мы анимируем прокрутку, если разница больше чем 5 пикселов.
                if (Math.abs(oldX - targetX) > 5) {
 
                        //Твин контента на новую позицию.
                        //Вызываем функцию tweenFinished() когда твин завершится.
                        TweenMax.to(myContent, 2, {x: targetX, blurFilter:{blurX:0, blurY:0}, onComplete: tweenFinished});
                }
        }
}
//Эта функция вызывается, когда твин завершается
function tweenFinished():void {
        //твин для возврата контента к нормальному состоянию (= удалим blur)
        TweenMax.to(myContent, 0.3, {blurFilter:{blurX:0, blurY:0}});
}
function mouseWheelHandler(event:MouseEvent):void {
        if ((event.delta < 0 && scrollMC.x > bounds.x) ||
                (event.delta > 0 && scrollMC.x < bounds.x + bounds.width))
        {
                scrolling = true;
                scrollMC.x = scrollMC.x + (event.delta * 9);
        }
}

В каком коде нужно менять: в этом или в загрузчике?
Выдает ошибку, Невозможно получить доступ к свойству или методу пустой ссылки на объект. Все с этим stage не могу разобраться.

alatar 31.01.2010 20:31

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

Добавлено через 8 минут
Цитата:

Все с этим stage не могу разобраться.
свойство stage у объекта появляется только, когда объект добавлен в display list.
Например, есть три объекта main (класс приложения), container, child.
container.addChild(child) -- child.stage == null
main.addChild(container) -- child.stage == stage

cleptoman 31.01.2010 22:45

не пишите код в кадрах
подписывайте на событие добавления экземпляра на сцену..после этого можете работать с stage

Stanislavsky 04.02.2010 03:13

Цитата:

Сообщение от alatar (Сообщение 883198)
Выложи весь исходник, это будет проще чем вытягивать по капле суть проблемы.
Загрузчик внешний? Весь код только в кадрах? Этот клип лежит на сцене или добавляется динамически?

Я уже темку создавал по поводу струтуры, и выкладывал свой код тут.
Надеюсь будет понятно.
Очень интересует Ваше мнение. В своей логике программирования пока сомневаюсь. У каждого подгружаемого клипа - есть свой класс. Может быть все клипы надо вставить в библиотеку основного?
Спасибо!

RonEXI 16.02.2010 23:04

разобрался


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

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