Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 13.10.2009, 13:51
_moscow вне форума Посмотреть профиль Отправить личное сообщение для _moscow Найти все сообщения от _moscow
  № 1  
Ответить с цитированием
_moscow
 
Аватар для _moscow

Регистрация: May 2009
Сообщений: 173
По умолчанию Не всегда срабатывает действие "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" и получается кнопка не вернулась на место - а мыша уже в другом мести !

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

Старый 13.10.2009, 13:53
il phoenix вне форума Посмотреть профиль Отправить личное сообщение для il phoenix Найти все сообщения от il phoenix
  № 2  
Ответить с цитированием
il phoenix

Регистрация: Apr 2009
Сообщений: 77
может лучше воспользоваться классом SimpleButton?

Старый 13.10.2009, 14:53
GFreemen вне форума Посмотреть профиль Отправить личное сообщение для GFreemen Найти все сообщения от GFreemen
  № 3  
Ответить с цитированием
GFreemen
 
Аватар для GFreemen

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

Старый 13.10.2009, 15:04
CrazyFlasher вне форума Посмотреть профиль Отправить личное сообщение для CrazyFlasher Найти все сообщения от CrazyFlasher
  № 4  
Ответить с цитированием
CrazyFlasher
 
Аватар для CrazyFlasher

Регистрация: May 2003
Адрес: Tallinn
Сообщений: 3,182
у меня всё работает...проблема где-то в другом...
ps. методы и проперти пишутся со строчных букв

Старый 13.10.2009, 23:45
switcher! вне форума Посмотреть профиль Отправить личное сообщение для switcher! Найти все сообщения от switcher!
  № 5  
Ответить с цитированием
switcher!

Регистрация: May 2009
Сообщений: 220
Цитата:
Сообщение от GFreemen Посмотреть сообщение
Может чтобы случилось 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)

Старый 14.10.2009, 00:05
_moscow вне форума Посмотреть профиль Отправить личное сообщение для _moscow Найти все сообщения от _moscow
  № 6  
Ответить с цитированием
_moscow
 
Аватар для _moscow

Регистрация: May 2009
Сообщений: 173
Ну вот конкретный код и он глючит - если мышкой немного дернуть !

Код 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]);
	       }
 
	  }
 
 
 
 
 
 
  }

Старый 14.10.2009, 01:14
switcher! вне форума Посмотреть профиль Отправить личное сообщение для switcher! Найти все сообщения от switcher!
  № 7  
Ответить с цитированием
switcher!

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

Старый 14.10.2009, 01:19
_moscow вне форума Посмотреть профиль Отправить личное сообщение для _moscow Найти все сообщения от _moscow
  № 8  
Ответить с цитированием
_moscow
 
Аватар для _moscow

Регистрация: May 2009
Сообщений: 173
И как это лечит ?

Старый 14.10.2009, 03:28
switcher! вне форума Посмотреть профиль Отправить личное сообщение для switcher! Найти все сообщения от switcher!
  № 9  
Ответить с цитированием
switcher!

Регистрация: May 2009
Сообщений: 220
Цитата:
Сообщение от _moscow Посмотреть сообщение
И как это лечит ?
Продумать другой алгоритм.
Например, для класса 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);
		}
	}
}

Старый 14.10.2009, 12:25
_moscow вне форума Посмотреть профиль Отправить личное сообщение для _moscow Найти все сообщения от _moscow
  № 10  
Ответить с цитированием
_moscow
 
Аватар для _moscow

Регистрация: May 2009
Сообщений: 173
Цитата:
Сообщение от switcher! Посмотреть сообщение
Продумать другой алгоритм.
Например, для класса 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!


Последний раз редактировалось _moscow; 14.10.2009 в 12:28.
Создать новую тему Ответ Часовой пояс GMT +4, время: 21:41.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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