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

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

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

Регистрация: Aug 2011
Адрес: 56° 51' с.ш. 53° 13' в.д.
Сообщений: 172
Записей в блоге: 1
менее громоздко:
Код AS3:
package ui.buttons
{
	import flash.display.Sprite;
	import flash.events.MouseEvent;
 
	/**
	 * ...
	 * @author Ookami
	 */
	public class Button extends Sprite
	{
 
		private var stateNorm:Sprite;
		private var stateOver:Sprite;
		private var stateDown:Sprite;
 
		/*
		 * Конструктор класса
		 */
		public function Button(spriteNorm:Sprite, spriteOver:Sprite, spriteDown:Sprite)
		{
			/**
			 * Формирование тела кнопки
			 */
			stateNorm = spriteNorm;
			stateOver = spriteOver;
			stateDown = spriteDown;
			addChild(stateNorm);
			addChild(stateOver);
			addChild(stateDown);
			stateOver.visible = false;
			stateDown.visible = false;
			/**
			 * Прослушка событий
			 */
			addEventListener(MouseEvent.MOUSE_OVER, onMouseEvent);
			addEventListener(MouseEvent.MOUSE_OUT, onMouseEvent);
			addEventListener(MouseEvent.MOUSE_DOWN, onMouseEvent);
			addEventListener(MouseEvent.MOUSE_UP, onMouseEvent);
		}
 
		/*
		 * Фокус мыши на кнопке
		 */
		private function onMouseEvent(event:MouseEvent):void
		{
			stateNorm.visible = false;
			stateOver.visible = false;
			stateDown.visible = false;
			switch (event.type)
			{
				case MouseEvent.MOUSE_OVER: 
				{
					stateOver.visible = true;
					break;
				}
				case MouseEvent.MOUSE_OUT: 
				{
					stateNorm.visible = true;
					break;
				}
				case MouseEvent.MOUSE_DOWN: 
				{
					stateDown.visible = true;
					break;
				}
				case MouseEvent.MOUSE_UP: 
				{
					stateNorm.visible = true;
					break;
				}
			}
		}
 
	}
 
}
Цитата:
небольшое уточнение, из за того что у меня есть еще и textField поверх всех этих спрайтов, то возникал небольшой касячок при обработке фокуса и нажатия мыши. А именно нажатие срабатывало только на текстовом поле. Я так понял это из за того что спрайты скрываются. Я сделал еще один спрайт который содержит прозрачный png размером ровно с мою кнопку и поместил этот спрайт поверх всех остальных. Так обработка нажатия мыши срабатывает корректно.
Можно запретить чайлдам кнопки реагировать на мышь - так проще. Добавьте в конструктор класса
Код AS3:
			mouseChildren = false;

Старый 13.11.2011, 11:23
Vektor вне форума Посмотреть профиль Отправить личное сообщение для Vektor Найти все сообщения от Vektor
  № 2  
Ответить с цитированием
Vektor
 
Аватар для Vektor

Регистрация: May 2008
Адрес: Новокузнецк
Сообщений: 219
Записей в блоге: 1
Так, мне кажется лучше.
Код AS3:
package {
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
	public class Cbutton extends MovieClip {
		private var _mcButton:mcButton=new mcButton  ;
                       //Здесь из библиотеки можно вытащить другой клип.
		private var _mcButton1:mcButton1=new mcButton1  ;
		public function Cbutton():void {
			// constructor code
			fButtonCreate(_mcButton,100,100);
			fButtonCreate(_mcButton1,200,100);
 
		}
                   private function fButtonCreate(But:MovieClip,x:int,y:int):void {
			addChild(But);
			But.stop();
			But.x=x;
			But.y=y;
			this.addEventListener(MouseEvent.MOUSE_OVER, fMouseEvent);
			this.addEventListener(MouseEvent.MOUSE_OUT, fMouseEvent);
			this.addEventListener(MouseEvent.MOUSE_DOWN, fMouseEvent);
			this.addEventListener(MouseEvent.MOUSE_UP, fMouseEvent);
		}
		private function fMouseEvent(event:MouseEvent):void {
			switch (event.type) {
				case MouseEvent.MOUSE_OVER :
					event.target.gotoAndStop(2);
					break;
				case MouseEvent.MOUSE_OUT :
					event.target.gotoAndStop(1);
					break;
				case MouseEvent.MOUSE_DOWN :
					event.target.gotoAndStop(3);
					break;
				case MouseEvent.MOUSE_UP :
					event.target.gotoAndStop(2);
					break;
			}
		}
	}
}
Вложения
Тип файла: rar Button.rar (9.1 Кб, 21 просмотров)
__________________
Книги и желание лучшие учителя.


Последний раз редактировалось Vektor; 13.11.2011 в 15:22.
Старый 13.11.2011, 14:41
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 3  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
expl, убрать строчки, содержащие stage, в onMouseOut первой строкой вставить onMouseGoUp(null) =)
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
В кошерной кнопке аут и ап вообще-то разные))) Ап соответствует овер (когда кнопку мыши отпускают над кнопкой, мышь вроде как находится над кнопкой, не?) А вот когда мышь нажали, но увели с кнопки, отображается аут и ап вообще не должен ловиться и обрабатываться - юзер явно передумал делать клик. Поэтому, зачем кнопке стейдж, я так и не понял.
__________________
Reality.getBounds(this);

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

Регистрация: Oct 2011
Сообщений: 46
Vektor я уже тут на принцип пошёл и захотел разобраться как делают люди (с использованием Sprite), с мувиклип я бы без заморочек прям на сцене всё нарисовал и слепил бы в один мувик(как делал в большинстве случаев).

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

Регистрация: May 2008
Адрес: Новокузнецк
Сообщений: 219
Записей в блоге: 1
Sprite тот же MovieClip только без кадров.
__________________
Книги и желание лучшие учителя.

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

Регистрация: Oct 2011
Сообщений: 46
ну да, когда с мувиком всё понятно и вроде проще, но все говорят что спрайт это правильно, интересно узнать почему и как оно делается. Да и я кажется понял наконец как сделать "дубляж" нажатия кнопки при нажатии ентера в текстовом поле (эту тему я поднимал, но так и не разобрался). Вроде как достаточно включить buttonMode и выделять в фокус кнопку. С simpleButton этого сделать мне не удалось. Еще не проверял, но документация говорит что должно работать =)


Последний раз редактировалось noobuser; 13.11.2011 в 16:05.
Старый 13.11.2011, 15:47
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 8  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
Кто бы рассказал, как добиться нормального поведения кнопки без stage, например вот этой:
Когда кнопке требуется stage, он у нее гарантированно есть.

Добавлено через 2 минуты
Цитата:
Сообщение от Wolsh Посмотреть сообщение
А вот когда мышь нажали, но увели с кнопки, отображается аут и ап вообще не должен ловиться и обрабатываться - юзер явно передумал делать клик. Поэтому, зачем кнопке стейдж, я так и не понял.
Не совсем, юзер может и вернуть указатель на кнопку. Обычное поведение при этом, прореагировать как будто указатель и не убирали.
__________________
משיח לא בא
משיח גם לא מטלפן


Последний раз редактировалось alatar; 13.11.2011 в 15:54.
Старый 13.11.2011, 16:18
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 9  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Не совсем, юзер может и вернуть указатель на кнопку. Обычное поведение при этом, прореагировать как будто указатель и не убирали.
Да без проблем))
Код AS3:
private function handlerOver(event:MouseEvent):void 
{
	if (event.buttonDown)
	{
		handlerDown(null);
		return;
	}
	_upState.visible = false;
	_overState.visible = true;
	_downState.visible = false;
}
__________________
Reality.getBounds(this);

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

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
Да без проблем))
Нажали в левом месте, перевели курсор на кнопку, отпустили... проблема.
__________________
משיח לא בא
משיח גם לא מטלפן

Создать новую тему Ответ Часовой пояс GMT +4, время: 23:02.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра
Комбинированный вид Комбинированный вид

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

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


 


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


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