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

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

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

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
По умолчанию Click to continue

Друзья!
Уже где-то кратко спрашивал и даже получил ответ, но в упор не могу найти. Да и многое прояснилось с тех пор, могу уже на чуть более адекватном уровне задать вопрос.

Итак, в определённые моменты мне нужно, чтобы перед продолжением выполнения пользователь мог спокойно прочитать/просмотреть всю инфо и кликнуть для продолжения. На первый взгляд, ничего сложного, но дьявол как всегда в деталях.

Сделал класс ClickToContinue, который выводит на экран соответствующий текст и ждёт клика. Вот ключевые фрагменты его кода:

Код AS3:
public class ClickToContinue extends Sprite
	{	
		public function ClickToContinue()
		{
			this.addChild(_cont);
			_cont.addChild(_field);
			_cont.addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
		}
 
		private function addedToStageHandler(event:Event):void 
		{
			_cont.removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
			_cont.stage.mouseChildren = false;
			_cont.stage.addEventListener(MouseEvent.CLICK, stageClickHandler);
		}
 
		private function stageClickHandler(event:MouseEvent):void 
		{
			trace("CLICK");
			_cont.stage.mouseChildren = true;
			_cont.stage.removeEventListener(MouseEvent.CLICK, stageClickHandler);
			_cont.removeChild(_field);
		}
}
Вопросы такие:
1. Чую, что опять на святое - на stage покушаюсь. Как без неё обойтись можно в таком случае? Я планировал отключать все остальные функции до клика пользователя и ловить клик по любому месту приложения.
2. На практике есть ещё одна проблема. У меня выводится некий диалог, где пользователь выбирает один из вариантов. Дальше Модель считает, Вью обновляет, а дальше как раз и нужно вывести "ClickToContinue". Так вот, получается, что тот клик, которым пользователь выбрал опцию в диалоге, уже "засчитывается" как клик для продолжения. Несколько раз тестировал Как с этим бороться?
3. Не могу понять, что привязывать к клику от пользователя (видите, пока просто вывод "CLICK"). Ведь того, ЧТО КОНКРЕТНО требуется продолжить, великое множество, а класс и пользовательский вывод - один. Как настраивать остальные элементы MVC для использование подобной конструкции?

Спасибо.

Старый 05.12.2017, 17:35
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 2  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
Цитата:
1. Чую, что опять на святое - на stage покушаюсь
Если уверен что стейдж будет всегда в твоем единоличном пользование - делай с ним все что душе угодно.
Код AS3:
_cont.stage.mouseChildren = false;
_cont.stage.addEventListener(MouseEvent.CLICK, stageClickHandler);
Странная конструкция ты сначала отключаешь реакцию детей стейджа на клики и тут же вешаешь слушатель CLICK, оно будет срабатывать только когда кликаешь на пустое место на стейдже.При клике по содержимому стейджа оно не сработает.Так и задумано?

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Ну, во первых, вот так:
Код AS3:
_cont.stage.mouseChildren = false;
Лучше не делать. У тебя все дисплей объекты являются "детьми" stage, со всеми вытекающими.
Такой функционал обычно реализуют двумя способами:
1) (самый распространенный) просто поверх всего кладется спрайт с прозрачной или полупрозрачной заливкой, в размер stage, а поверх него кладется нужное окно. Получается, что этот спрайт ловит на себя все щелчки и не пропускает их дальше. А отключается он при удалении искомого окна.
2) Более сложный, но позволяет обойтись без без всяких спрайтов.
При добавлении окна, на его кнопку вешается слушатель события MouseEvent.CLICK с высоким приоритетом (смотри 4 параметр в addEventListener). И в обработчике, если event.target не равен нужной кнопке, то ход событий прерывается через
Код AS3:
event.preventDefault();
event.stopImmediatePropagation();
Профит.

Я лично второй способ использую при разработке разных туторов, где надо разрешить щелчки только по определенным объектам и запретить всё остальное
__________________
Ко мне можно и нужно обращаться на ты)

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

Регистрация: May 2008
Адрес: Питер
Сообщений: 385
Отправить сообщение для ZergMaster с помощью ICQ Отправить сообщение для ZergMaster с помощью Skype™
Делаю так, как пишет caseyryan.
Вообще в утилитах у меня есть класс, который занимается просто добавлением такого полупрозрачного фона
Код AS3:
package src.utils {
	import flash.display.Sprite;
	import flash.display.Stage;
	import flash.events.Event;
	import flash.events.MouseEvent;
 
	public class WhiteAlphaBackground extends Sprite{
 
		public function WhiteAlphaBackground() {
			addEventListener(Event.ADDED_TO_STAGE, addThis);
		}
 
		protected function addThis(event:Event):void 
		{
			graphics.beginFill(0xFFFFFF, 0.5);
			graphics.drawRect(0, 0, this.stage.stageWidth, this.stage.stageHeight);
 
			addEventListener(MouseEvent.CLICK, clickHandler);
		}
 
		private function clickHandler(event:MouseEvent):void 
		{
			quit();
		}
 
		protected function quit():void
		{
			this.parent.removeChild(this);
		}
	}
 
}
соответственно, если унаследоваться от него, то получается окно, которое закрывается при клике на любую его область. Если же мне не нужно, чтобы наследник закрывался сразу а, например, чтобы была возможность понажимать кнопочки в этом окне, или чтобы само тело окна (прямоугольник) не закрывало его, то в них как раз располагаю слушатель на нисходящий поток событий и в него пихаю
Код AS3:
event.stopImmediatePropagation();
, который обрубает поток событий и не дает ему дальше распространяться.

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

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Цитата:
Сообщение от undefined Посмотреть сообщение
Код AS3:
_cont.stage.mouseChildren = false;
_cont.stage.addEventListener(MouseEvent.CLICK, stageClickHandler);
Странная конструкция ты сначала отключаешь реакцию детей стейджа на клики и тут же вешаешь слушатель CLICK, оно будет срабатывать только когда кликаешь на пустое место на стейдже.При клике по содержимому стейджа оно не сработает.Так и задумано?
Даже работает. Там же вроде не ввысь, а вглубь считается, нет? То есть stage - это уровень 0, а потом как под землю -1, -2 и т.д. И если отключить реакцию детей stage на клики, а самой её оставить, то как раз и получится то что надо - сама stage клик поймает, а никакое её содержимое - нет.

Цитата:
Сообщение от caseyryan Посмотреть сообщение
Ну, во первых, вот так:
1) (самый распространенный) просто поверх всего кладется спрайт с прозрачной или полупрозрачной заливкой, в размер stage, а поверх него кладется нужное окно. Получается, что этот спрайт ловит на себя все щелчки и не пропускает их дальше. А отключается он при удалении искомого окна.
У меня не совсем та ситуация. Чуть иная задача. Мне нужно поймать просто клик, неважно по какому месту. Хотя в таком случае тоже можно зафигачить спрайт-"сенсор" на весь экран... Спасибо за комментарии.

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

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

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


 


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


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