|
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
Click to continue
Друзья!
Уже где-то кратко спрашивал и даже получил ответ, но в упор не могу найти. Да и многое прояснилось с тех пор, могу уже на чуть более адекватном уровне задать вопрос. Итак, в определённые моменты мне нужно, чтобы перед продолжением выполнения пользователь мог спокойно прочитать/просмотреть всю инфо и кликнуть для продолжения. На первый взгляд, ничего сложного, но дьявол как всегда в деталях. Сделал класс ClickToContinue, который выводит на экран соответствующий текст и ждёт клика. Вот ключевые фрагменты его кода: 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 для использование подобной конструкции? Спасибо. |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
Цитата:
Странная конструкция ты сначала отключаешь реакцию детей стейджа на клики и тут же вешаешь слушатель CLICK, оно будет срабатывать только когда кликаешь на пустое место на стейдже.При клике по содержимому стейджа оно не сработает.Так и задумано? |
|
|||||
Ну, во первых, вот так:
Лучше не делать. У тебя все дисплей объекты являются "детьми" stage, со всеми вытекающими. Такой функционал обычно реализуют двумя способами: 1) (самый распространенный) просто поверх всего кладется спрайт с прозрачной или полупрозрачной заливкой, в размер stage, а поверх него кладется нужное окно. Получается, что этот спрайт ловит на себя все щелчки и не пропускает их дальше. А отключается он при удалении искомого окна. 2) Более сложный, но позволяет обойтись без без всяких спрайтов. При добавлении окна, на его кнопку вешается слушатель события MouseEvent.CLICK с высоким приоритетом (смотри 4 параметр в addEventListener). И в обработчике, если event.target не равен нужной кнопке, то ход событий прерывается через Профит. Я лично второй способ использую при разработке разных туторов, где надо разрешить щелчки только по определенным объектам и запретить всё остальное
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Делаю так, как пишет caseyryan.
Вообще в утилитах у меня есть класс, который занимается просто добавлением такого полупрозрачного фона 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); } } } , который обрубает поток событий и не дает ему дальше распространяться. |
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
Цитата:
Цитата:
|
Часовой пояс GMT +4, время: 10:24. |
|
« Предыдущая тема | Следующая тема » |
|
|