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

DZHETIGAPA 28.02.2011 02:14

Как "обмануть" события?
 
Возникла странная проблема. Делаю проект в PaperVision. Подписываю объекты на сцене на MOUSE_OVER, MOUSE_OUT. Но, например, при попадании мышки на объект эти два события (MOUSE_OVER, MOUSE_OUT) вызываются сразу друг за другом 2-3раза подряд(хотя на самом деле событие MOUSE_OUT даже не происходило), что мне, конечно, не нужно. Все пересмотрел, ошибки вроде нигде нету. Просто я там намудрил много чего, думаю из-за этого что-то ПэперВижион тупит.

Так вот вопрос. Так как ошибку найти не могу, то как сделать так, чтобы события не срабатывали несколько раз друг за другом?(то есть как бы обмануть события). То есть, чтобы MOUSE_OVER и MOUSE_OUT срабатывали только тогда, когда они на самом деле происходят. Я уже и логические переменные использовал и таймеры ставил, но так оптимального решения не нашел.

ЗЫ: Надеюсь вы поняли и представляете, о чем я говорю:)

tsarapkabel 28.02.2011 02:20

События ROLL_OVER/ROLL_OUT ведут себя также?

DZHETIGAPA 28.02.2011 02:23

Полностью аналогично. Я пытался таймером исправить это. То есть через определенное время подписываться на событие MOUSE_OUT, но, как вы понимаете, ниче хорошего из этого не вышло.

Bgg 28.02.2011 02:24

Ошибки нужно исправлять, а не скрывать. Покажите код, может быть другие увидят в чем причина.

DZHETIGAPA 28.02.2011 02:31

Полностью с тобой согласен, что ошибки надо исправлять... НО... я просто понять не могу, что мутит этот Papervision. Весь код показывать, думаю, не имеет смысла. Вот главное:

На МувиКлипы вешаю события MOUSE_OVER MOUSE_OUT. Пихаю эти мувики в Plane. Ну и в слушателях события происходят определенные действия. то есть ничего необычного, например:
Код AS3:

mov[i].addEventListener(MouseEvent.MOUSE_OVER, onOver)
mov[i].addEventListener(MouseEvent.MOUSE_OUT, onOut)
 
private function onOver(e:MouseEvent):void
{
    trace("OVER")
}
 
private function onOut(e:MouseEvent):void
{
    trace("OUT")
}


in4core 28.02.2011 03:40

Код AS3:

mov[i].mouseChildren = false;

и закрывайте тему ))

Gaen 28.02.2011 03:42

Потрейсите e.relatedObject, это может дать зацепку.

cr0w312 28.02.2011 10:01

в PV3D свои ивенты. для их рвботы надо выполнить несколько условий
1 - интерактивный вьюпорт
Код AS3:

         viewport.interactive = true;

2 - интерактивный материал
Код AS3:

         myMaterial.interactive = true;

3 - прицеп слушателя к 3D объекту
Код AS3:

    import org.papervision3d.events.InteractiveScene3DEvent;
    ....
      var plane:Plane = new Plane(myInteractiveMaterial, 300, 300, 3, 3);
      plane.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, planeMouseOver);
    ....
      Private function planeMouseOver(e:InteractiveScene3DEvent):void{
            e.displayObject3D..localRotationY += 10;
      }

есть и другой способ - зашить спрайт(в данном случае кнопка с именем "btn") в мувик с именем, в данном случае - "material"
Код AS3:

import org.papervision3d.materials.MovieAssetMaterial;
        ....
        viewport.interactive = true;
        var material:MovieAssetMaterial = new MovieAssetMaterial("material",false,true,false,true);
        material.interactive = true;
 
                        MovieClip(MovieClip(material.movie).getChildByName("btn")).mouseChildren = false;
                        MovieClip(material.movie).getChildByName("btn").addEventListener(MouseEvent.CLICK,click);
                        MovieClip(material.movie).getChildByName("btn").addEventListener(MouseEvent.MOUSE_OVER,mouseOver);
                        MovieClip(material.movie).getChildByName("btn").addEventListener(MouseEvent.MOUSE_OUT,mouseOut);
        private function click(e:MouseEvent):void
                {
                        var buttonText:TextField = MovieClip(e.target).getChildByName("label") as TextField;
                        switch(buttonText.text)
                        {
                                case "start":
                                        buttonText.text = "stop";
                                        MovieClip( MovieClip(e.target).parent ).play();
                                break;
                                default:
                                        buttonText.text = "start";
                                        MovieClip( MovieClip(e.target).parent ).stop();
                        }
                }
 
                private function mouseOver(e:MouseEvent):void
                {
                        viewport.buttonMode = true;
                }
 
                private function mouseOut(e:MouseEvent):void
                {
                        viewport.buttonMode = false;
                }

вот примерно так

DZHETIGAPA 28.02.2011 21:35

Цитата:

Сообщение от in4core (Сообщение 976755)
Код AS3:

mov[i].mouseChildren = false;

и закрывайте тему ))

Я б с удовольствием, но ничего не выходит. К тому же mov[i] детей не имеет:)
Цитата:

Потрейсите e.relatedObject, это может дать зацепку.
Потрейсил. Выходит трейсится по два-три раза следующее: Stage, Sprite(родитель мувиков), mov_Class(сам мувик). Трейсятся они в разном сочетании, то три раза Stage, то 2 раза Sprite, то по одному дисплэйОбджекту. Короче ХЗ.... Пытался применять mouseChidren mouseEnabled в различных сочетаниях - не помогает.

cr0w312 01.03.2011 00:18

Цитата:

Сообщение от DZHETIGAPA (Сообщение 977045)
Я б с удовольствием, но ничего не выходит. К тому же mov[i] детей не имеет:)


Потрейсил. Выходит трейсится по два-три раза следующее: Stage, Sprite(родитель мувиков), mov_Class(сам мувик). Трейсятся они в разном сочетании, то три раза Stage, то 2 раза Sprite, то по одному дисплэйОбджекту. Короче ХЗ.... Пытался применять mouseChidren mouseEnabled в различных сочетаниях - не помогает.

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


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

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