Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Не всегда срабатывает действие "MouseEvent.MOUSE_OUT" (http://www.flasher.ru/forum/showthread.php?t=131119)

_moscow 13.10.2009 13:51

Не всегда срабатывает действие "MouseEvent.MOUSE_OUT"
 
Всем привет !

Делаю так

Код AS3:

 
// делаю кнопку
var But:MovieClip = new MovieClip()
    But.graphics.beginFill(color);
    But.graphics.drawRect(0, 0, 100, 100);
 
var ButOut:MovieClip = new MovieClip()
    ButOut.graphics.beginFill(color);
    ButOut.graphics.drawRect(0, 0, 100, 100);
 
addChild(But);
 
But.addEventListener(MouseEvent.MOUSE_OVER,    But_OVER);
ButOut.addEventListener(MouseEvent.MOUSE_OUT,  But_OUT );
 
 
 
private function But_OVER(event:MouseEvent):void
{       
 removeChild(But);
 addChild(ButOut)
}
 
private function But_OUT(event:MouseEvent):void
{
 removeChild(ButOut);
 addChild(But);
}

Это-т код очень часто дает сбои - он не всегда реагирует на выход мыши с обьекта "ButOut" и получается кнопка не вернулась на место - а мыша уже в другом мести !

Как это выличить ? или может я что делаю не так ?

il phoenix 13.10.2009 13:53

может лучше воспользоваться классом SimpleButton?

GFreemen 13.10.2009 14:53

Может чтобы случилось MOUSE_OUT сначала должно быть MOUSE_OVER - а для But_OUT это не происходит. Проще создать прозрачный клип, на него вешать оба события и в них менять необходимые обложки.

CrazyFlasher 13.10.2009 15:04

у меня всё работает...проблема где-то в другом...
ps. методы и проперти пишутся со строчных букв

switcher! 13.10.2009 23:45

Цитата:

Сообщение от GFreemen (Сообщение 857443)
Может чтобы случилось MOUSE_OUT сначала должно быть MOUSE_OVER

Для общего понимания: Событие MOUSE_OVER произойдет независимо от того, поставите вы слушатель на целевой объект (в данном случае - ButOut) или нет.
Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.MouseEvent;
 
        public dynamic class NewExample extends Sprite
        {
                private var s:Sprite = new Sprite;
 
                function NewExample():void
                {                       
                        s.graphics.beginFill(0x000000);
                        s.graphics.drawRect(0, 0, 200, 200);
                        s.x = 100;
                        //s.mouseEnabled = false; // Раскомментируйте, чтобы событие не возникало для 's'
 
                        this.addChild(s);                       
                        this.addEventListener(MouseEvent.MOUSE_OVER, mouseOverParent, true); // слушатель на "предка" (parent), чтобы отловить событие в Фазе Захвата, т.е. №1
                }
 
                private function mouseOverParent(e:MouseEvent):void
                {
                        trace(e.type, '"Фаза №' + e.eventPhase + '"', e.target, e.currentTarget);
                        // выводит: mouseOver "Фаза №1" [object Sprite] [object NewExample]
                }
        }
}

Как видите, s.addEventListener(MouseEvent.MOUSE_OVER, ...); нету. Но событие происходит пир наведении на черный квадрат (s)

_moscow 14.10.2009 00:05

Ну вот конкретный код и он глючит - если мышкой немного дернуть !

Код AS3:

package  { 
 
              import flash.display.*;
          import flash.events.*;
 
    public class Bt extends MovieClip {
 
                private var M:MovieClip;
                private var O:MovieClip;
 
          public function Bt():void
        {
 
                M = new MovieClip()
                      M.graphics.beginFill(0x000000);
                      M.graphics.drawRect(0, 0, 200, 20);
 
                      O = new MovieClip()
                      O.graphics.beginFill(0x666666);
                      O.graphics.drawRect(0, 0, 200, 20);
 
                addChild(M);
 
                M.addEventListener(MouseEvent.MOUSE_OVER,    But_OVER);
                      O.addEventListener(MouseEvent.MOUSE_OUT,  But_OUT );
 
        }
 
        private function But_OVER(event:MouseEvent):void
          {       
                        removeChild(M);
                        addChild(O)
          }
 
          private function But_OUT(event:MouseEvent):void
          {         
                        removeChild(O);
                        addChild(M);
          }
 
 
  }
}
 
 
 
////////////////////////////////////////////////////////////////////////////////////
 
public class Main extends MovieClip {
 
 
            public function Main():void
            {
 
          //-------------------------------------------------------------------
            var Mc:Array    = new Array();
 
                for(i=0;i<10;i++)
                {
                  Mc[i] = new Bt();
                  if(i!=0)
                  {
                    Mc[i].y = Mc[i-1].y+Mc[i-1].height+1;
                  }
                  addChild(Mc[i]);
              }
 
          }
 
 
 
 
 
 
  }


switcher! 14.10.2009 01:14

Цитата:

он глючит - если мышкой немного дернуть !
Тесты не проводил, но поскольку это происходит только при быстром движении мыши (и рывках с элемента на элемент) - очевидно, что к моменту, когда "O:MovieClip" добавляется в список отображения Bt - указателя мыши над этой областью уже не находится.
Соответственно, и событие MouseEvent.MOUSE_OUT - произойти не может в принципе.

_moscow 14.10.2009 01:19

И как это лечит ?

switcher! 14.10.2009 03:28

Цитата:

Сообщение от _moscow (Сообщение 857619)
И как это лечит ?

Продумать другой алгоритм. :)
Например, для класса Bt:
Код AS3:

package  { 
 
        import flash.display.*;
        import flash.events.*;
 
        public class Bt extends MovieClip {
 
                private var M:MovieClip;
                private var O:MovieClip;
 
                public function Bt():void
                {
                        this.mouseChildren = false;
 
                        M = new MovieClip();
                        M.graphics.beginFill(0x000000);
                        M.graphics.drawRect(0, 0, 200, 20);
 
                        O = new MovieClip();
                        O.graphics.beginFill(0x666666);
                        O.graphics.drawRect(0, 0, 200, 20);
 
                        this.addChild(M);
 
                        addEventListener(MouseEvent.ROLL_OVER, But_OVER);
                        addEventListener(MouseEvent.ROLL_OUT, But_OUT);
                }
 
                private function But_OVER(event:MouseEvent):void
                {
                        if (this.contains(M))
                        {
                                removeChild(M);
                        }
                        addChild(O);
                }
 
                private function But_OUT(event:MouseEvent):void
                {
                        if (this.contains(O))
                        {
                                removeChild(O);
                        }
 
                        addChild(M);
                }
        }
}


_moscow 14.10.2009 12:25

Цитата:

Сообщение от switcher! (Сообщение 857639)
Продумать другой алгоритм. :)
Например, для класса Bt:
Код AS3:

package  { 
 
        import flash.display.*;
        import flash.events.*;
 
        public class Bt extends MovieClip {
 
                private var M:MovieClip;
                private var O:MovieClip;
 
                public function Bt():void
                {
                        this.mouseChildren = false;
 
                        M = new MovieClip();
                        M.graphics.beginFill(0x000000);
                        M.graphics.drawRect(0, 0, 200, 20);
 
                        O = new MovieClip();
                        O.graphics.beginFill(0x666666);
                        O.graphics.drawRect(0, 0, 200, 20);
 
                        this.addChild(M);
 
                        addEventListener(MouseEvent.ROLL_OVER, But_OVER);
                        addEventListener(MouseEvent.ROLL_OUT, But_OUT);
                }
 
                private function But_OVER(event:MouseEvent):void
                {
                        if (this.contains(M))
                        {
                                removeChild(M);
                        }
                        addChild(O);
                }
 
                private function But_OUT(event:MouseEvent):void
                {
                        if (this.contains(O))
                        {
                                removeChild(O);
                        }
 
                        addChild(M);
                }
        }
}


так работаек - четко , спасибо switcher!


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

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