Форум 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 минуты. На своем конкретном примере и разберешься что к чему.

DZHETIGAPA 01.03.2011 00:37

Я понимаю, что ты написал. Я все так изначально и делал, но все равно не работало. Так что спасибо за пост:)

Я щас ушел от MOUSE_OVER MOUSE_OUT, а подписался на событие MOUSE_MOVE, ввел там логические переменные и все заработало:)

_Ice_ 01.03.2011 00:49

Не используй переменную е два раза. Проблема в этом. Замени второй раз е на любую другую переменную

private function onOver(e:MouseEvent):void
private function onOut(v:MouseEvent):void

DZHETIGAPA 01.03.2011 01:02

Цитата:

Сообщение от _Ice_ (Сообщение 977111)
Не используй переменную е два раза. Проблема в этом. Замени второй раз е на любую другую переменную

private function onOver(e:MouseEvent):void
private function onOut(v:MouseEvent):void

Попробовал. Ничего не изменилось.

cr0w312 01.03.2011 01:18

Цитата:

Сообщение от DZHETIGAPA (Сообщение 977109)
Я понимаю, что ты написал. Я все так изначально и делал, но все равно не работало. Так что спасибо за пост:)

Я щас ушел от MOUSE_OVER MOUSE_OUT, а подписался на событие MOUSE_MOVE, ввел там логические переменные и все заработало:)

рад, что все разрешилось, но подмитать можно и веником и ломиком:)

DZHETIGAPA 01.03.2011 01:21

Но почему он "глючит", так и не выяснилось.

cr0w312 01.03.2011 15:47

он не глючит, он так работает. если ты создаешь контейнер для спрайта или мувика, добавляешь его в сцену и цепляешь к нему слушатель MouseEvent, событие не сработает пока ты не добавишь что-нибудь видимое.
также и сдесь, DisplayObject3D не воспринимает события мыши MouseEvent, но воспринимает события InteractiveScene3DEvent такие как
Код AS3:

InteractiveScene3DEvent.OBJECT_ADDED
OBJECT_CLICK
OBJECT_DOUBLE_CLICK
OBJECT_MOVE
OBJECT_OUT
OBJECT_OVER
OBJECT_PRESS
OBJECT_RELEASE и OBJECT_RELEASE_OUTSIDE

но для того, чтобы события сработали, нужно, чтобы объект был покрыт интерактивным материалом
Код AS3:

object3d.material.interactive = true;

и чтобы текущий вьюпорт был интерактивным
Код AS3:

viewport.interactive = true;

и не будет никаких глюков, все будет как задумано.

Alexd21 01.03.2011 20:02

проверьте свои графические объекты на сцене, если они сотоят из разных объектов, то объедините их в один. (breackappart) . Иначе может возникать ваша проблема, а event.target.name будет принимать всегда разные значения.


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

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