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

Вернуться   Форум Flasher.ru > Flash > API приложений и сред

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

Регистрация: Dec 2007
Адрес: Россия, Москва
Сообщений: 541
Отправить сообщение для TWETTI с помощью Skype™
Question [Robotlegs] Как связать Starling событие с коммандой в Robotlegs 2?

Столкнулся с проблемой при использовании Robotlegs 2 и Starling.
Я хочу из View через Mediator отправить событие унаследованное от starling.events.Event. Проблема в том, что такое событие нельзя будет связать с Command. Только событие унаследованное от flash.events.Event. Различные расширения Starling для Robotlegs не позволяют это сделать.

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

Регистрация: Jul 2013
Адрес: Днепр
Сообщений: 528
Отправить сообщение для alexandrratush с помощью ICQ Отправить сообщение для alexandrratush с помощью Skype™
Тоже когда-то интересовался данным вопросом. Я обошел это простой отправкой события flash.events.Event с медиатора. Это позволило не мешать старлинговые события, которые относятся к виду, с остальными классами приложения. Может есть решение более лаконичное. Плюс еще спасает SignalCommandMap. И сейчас не переживаю на счет этого.

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

Регистрация: Dec 2007
Адрес: Россия, Москва
Сообщений: 541
Отправить сообщение для TWETTI с помощью Skype™
А как тогда удобнее передать событие из View в Mediator?

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

Регистрация: Jul 2013
Адрес: Днепр
Сообщений: 528
Отправить сообщение для alexandrratush с помощью ICQ Отправить сообщение для alexandrratush с помощью Skype™
Цитата:
А как тогда удобнее передать событие из View в Mediator?
Из View в Mediator можно отправлять событие старлинга, а потом из медиатора уже отправлять нативное. Или же использовать для этого Сигналы. Для этого даже библиотека есть SignalMediator, вроде называется.

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

Регистрация: Dec 2007
Адрес: Россия, Москва
Сообщений: 541
Отправить сообщение для TWETTI с помощью Skype™
Это тогда лишние классы создавать. Что для событий старлинга, что для сигналов.

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

Регистрация: Jul 2013
Адрес: Днепр
Сообщений: 528
Отправить сообщение для alexandrratush с помощью ICQ Отправить сообщение для alexandrratush с помощью Skype™
Цитата:
Это тогда лишние классы создавать. Что для событий старлинга, что для сигналов.
Для событий старлинга, я просто создаю константы во View, и их ловлю в медиаторе. К примеру button_friend_triggered. Уже в медиаторе я отправляю свое событие, к примеру FriendEvent.GET_FRIEND. Из этого выходит, что вид не знает что он конкретно диспатчит (у меня только triggered, change и т.д.), а уже медиатор решает что делать когда была нажата кнопка, или изменился чекбокс.

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

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
В одном из проектов ( связка Robotlegs2 + Starling + Feathers ) подключал звуки. Очень не удобно было работать через медиаторы для каждой вью, где нужно было озвучить клик мышки или другие звуки интерфейса. Плюс тот же функционал нужен и внутри фреймворка ( при инжекте ). Сигналы добавлять пробывал, но это дополнительный импорт классов, менялась архитектура приложения в принципе, что-то сыпалось. Да и вродь как не в POC роботлегса ( есть расширения, но это уже больше похоже на костыль, решая вопрос оптимизации разработки). Но всё же очень хотелось что-бы всё было по стандартам и прямо из вью, работать со звуком не создавая 100-500 обработчиков.

Решение немного замудрённое.

Конфиги
Код AS3:
package com.pentagames.libobingo.configuration.platform
{
	import com.pentagames.libobingo.model.SoundManager.SoundManager;
 
	import robotlegs.bender.framework.api.IConfig;
	import robotlegs.bender.framework.api.IContext;
 
	public class ModelConfig implements IConfig
	{
		[Inject]
		public  var context:IContext;
 
		public function configure():void
		{	
 
			var prepare:Vector.<Class> = new <Class> [
				SoundManager 
			];
 
			while ( prepare.length ) context.injector.map( prepare.shift() ).asSingleton();
 
		}	
	}
}
Код AS3:
package com.pentagames.libobingo
{
	import com.pentagames.libobingo.controll.command.init.InitServiceSoundCommand;
	import com.pentagames.libobingo.events.InitializationEvent;
 
	import robotlegs.bender.extensions.eventCommandMap.api.IEventCommandMap;
	import robotlegs.bender.framework.api.IConfig;
	import robotlegs.bender.framework.api.IContext;
 
	public class CommandConfig implements IConfig
	{
		[Inject]
		public var context:IContext;
 
		[Inject]
		public var commandMap : IEventCommandMap;
 
		public function configure():void
		{
			commandMap.map( InitializationEvent.ON_INITIAL_RESOURCES_LOADED, InitializationEvent)
				.toCommand( InitServiceSoundCommand );
 
		}
	}
}
Соль в том, что мы создаем для SoundService свой медиатор и тут же инициализируем их.
Это нужно для того, что-бы связку Событие_конкретный_Класс -> Команда,
заменить на Медиатор. Который будет обрабатывать всё что нам нужно, в одном месте, единожды инициализировашись

Код AS3:
package com.pentagames.libobingo.services
{
	import flash.events.EventDispatcher;
	import flash.events.IEventDispatcher;
 
	public class SoundService extends EventDispatcher
	{
		public function SoundService(target:IEventDispatcher=null)
		{
			super(target);
		}
	}
}
Код AS3:
package com.pentagames.libobingo.controll.command.init
{
	import com.pentagames.libobingo.mediator.SoundMapMediator;
	import com.pentagames.libobingo.services.SoundService;
 
	import robotlegs.bender.extensions.commandCenter.api.ICommand;
	import robotlegs.bender.extensions.mediatorMap.api.IMediatorMap;
 
	public class InitServiceSoundCommand implements ICommand
	{
		[Inject]
		public var mediatorMap:IMediatorMap;
 
		public function execute():void
		{
			mediatorMap.map( SoundService ).toMediator( SoundMapMediator );
 
			mediatorMap.mediate( new SoundService() );
		}
	}
}
Медиатор подписываеться на управляющие события связанные со звуком и передает их уже на воспроизведение модели, сервису, т.д.

Код AS3:
package com.pentagames.libobingo.mediator
{
	import com.pentagames.libobingo.model.SoundManager.SoundManager;
	import com.pentagames.libobingo.model.SoundManager.SoundsCollection;
	import com.pentagames.libobingo.model.events.SoundEvent;
 
	import robotlegs.bender.bundles.mvcs.Mediator;
 
	public class SoundMapMediator extends Mediator
	{
		public function SoundMapMediator()
		{
			super();
		}
 
		[Inject]
		public var player:SoundManager; // непосредственный обработчик звука
 
		public override function initialize():void {
			// без типизации по класс_событиям
			eventMap.mapListener( eventDispatcher, SoundEvent.PLAY, onSoundRequest);
		}
 
		protected function onSoundRequest(event:SoundEvent):void
		{ 
			player.play(event.soundID, event.channel, event.loop, event.callBack);
 
		}
	}
}
С этого момента стало возможно
Диспатчить события SoundEvent.PLAY с параметрами, в медиаторах без лишних строчек кода
Инжектить непосредственно SoundManager, для работы со звуком по статическому сценарию
Передавать во вью, SoundService для работы со звуком с выдержанной инкапсуляцией.
Расширить SoundMapMediator, который может отлавливать любое событие лишь по его идентификатору ( type ) вместо строгой типизации ИвентКлассов и связки Событие-Команда и так по каждому отдельному событию

Код AS3:
package com.pentagames.libobingo.mediator.gameScreenSupportClasses.inGameSupportClasses.lobyViewSupportClasses.wheelMenuSupportClasses
{
 
	import com.pentagames.libobingo.model.SoundManager.SoundManager;
	import com.pentagames.libobingo.model.SoundManager.SoundsCollection;
	import com.pentagames.libobingo.model.events.SoundEvent;
	import com.pentagames.libobingo.model.games.Dispatcher;
 
	import robotlegs.bender.bundles.mvcs.Mediator;
 
	import starling.events.TouchEvent;
 
	public class WheelMenuItemMediator extends Mediator
	{
		[Inject]
		public var view:WheelMenuItem;
 
		[Inject]
		public var dispatcher:Dispatcher;
 
		public function WheelMenuItemMediator()
		{
			super();
		}
 
		override public function initialize():void{
 
			view.addEventListener(TouchEvent.TOUCH, onTouch);
		}
 
 
		private function onTouch(e:TouchEvent):void {
 
			dispatch( new SoundEvent(SoundEvent.PLAY, SoundsCollection.SFX_WHEEL_MOUSE_OVER_1,SoundManager.CHANNEL_SOUNDS));	
		}
	}
}
В вашем случае, можно в медиаторе основной вьюшки, ловить события унаследованные от starling_event и пересылать нужные на обработку в псевдо_команду ( медиатор )
__________________
return this...


Последний раз редактировалось AlexCooper; 12.10.2015 в 11:24.
Старый 12.10.2015, 17:51
TWETTI вне форума Посмотреть профиль Отправить личное сообщение для TWETTI Найти все сообщения от TWETTI
  № 8  
Ответить с цитированием
TWETTI
 
Аватар для TWETTI

Регистрация: Dec 2007
Адрес: Россия, Москва
Сообщений: 541
Отправить сообщение для TWETTI с помощью Skype™
alexandrratush, AlexCooper, спасибо за ответ.

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

Теги
robotlegs , Starling
Опции темы
Опции просмотра

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

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


 


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


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