Показать сообщение отдельно
Старый 16.03.2013, 18:48
yasha005 вне форума Посмотреть профиль Отправить личное сообщение для yasha005 Найти все сообщения от yasha005
  № 6  
Ответить с цитированием
yasha005

Регистрация: Dec 2012
Сообщений: 100
Кстати, что касается паузы. Если внести немного изменений в вышеописанную реализацию шаблона состояния, то можно в него добавить состояние паузы.

Реализация на примере видеопотока с именем test.flv

Код:
Видеоплеер с состояниями: расширение паузой

1. Интерфейс состояния
	State.as
2. Классы контекста состояния
	StopState.as - состояние проигрывание остановлено
	PlayState.as - состояние проигрывания
	PauseState.as - состояние паузы
3. Контекстный класс
	VideoWorks.as
4. Кнопки
	NetBtn.as - кнопка для переключения триггеров
	BtnState.as - состояния для кнопок переключения
5. Клиент
	TestPause.as
Код AS3:
package 
{
	//State Interface #1
	// Интерфейс состояния
	import flash.net.NetStream;
	internal interface State
	{
		function startPlay(ns:NetStream,flv:String):void;
		function stopPlay(ns:NetStream):void;
		function doPause(ns:NetStream):void;// добавлено
	}
}
Код AS3:
package 
{
	//Stop State #2
	// Состояние проигрывание остановлено
	import flash.net.NetStream;
 
	internal class StopState implements State
	{
		private var videoWorks:VideoWorks;
 
		public function StopState(videoWorks:VideoWorks)
		{
			trace("--Stop State--");
			this.videoWorks = videoWorks;
		}
		public function startPlay(ns:NetStream,flv:String):void
		{
			ns.play(flv);
			trace("Begin playing");
			videoWorks.setState(videoWorks.getPlayState());
		}
		public function stopPlay(ns:NetStream):void
		{
			trace("You're already stopped");
		}
 
		// Добавлено
		public function doPause(ns:NetStream):void
		{
			trace("Cannot go to Stop from Pause.");
		}
	}
}

Код AS3:
package 
{
	//Play State #3
	// Состояние проигрывания
	import flash.net.NetStream;
 
	class PlayState implements State
	{
		private var videoWorks:VideoWorks;
		public function PlayState(videoWorks:VideoWorks)
		{
			trace("--Play State--");
			this.videoWorks = videoWorks;
		}
		public function startPlay(ns:NetStream,flv:String):void
		{
			trace("You're already playing");
		}
		public function stopPlay(ns:NetStream):void
		{
			ns.close();
			trace("Stop playing.");
			videoWorks.setState(videoWorks.getStopState());
		}
 
		// Добавлено
		public function doPause(ns:NetStream):void
		{
			ns.togglePause();
			trace("Begin pause.");
			videoWorks.setState(videoWorks.getPauseState());
		}
	}
}
Код AS3:
package 
{
	//Pause State #4
	// Состояние паузы
	import flash.net.NetStream;
	class PauseState implements State
	{
		var videoWorks:VideoWorks;
		public function PauseState(videoWorks:VideoWorks)
		{
			trace("--Pause State--");
			this.videoWorks = videoWorks;
		}
		public function startPlay(ns:NetStream,flv:String):void
		{
			trace("You have to go to unpause");
		}
		public function stopPlay(ns:NetStream):void
		{
			trace("Don't go to Stop from Pause");
		}
		public function doPause(ns:NetStream):void
		{
			ns.togglePause();
			trace("Quit pausing.");
			videoWorks.setState(videoWorks.getPlayState());
		}
	}
}

Код AS3:
package 
{
	//Context Class #5
	// Контекстный класс
	import flash.net.NetStream;
 
	internal class VideoWorks
	{
		private var playState:State;
		private var stopState:State;
		private var pauseState:State;
		private var state:State;
 
		public function VideoWorks()
		{
			trace("Video Player is on");
			playState = new PlayState(this);
			stopState = new StopState(this);
			pauseState = new PauseState(this);
			state = stopState;
		}
		internal function startPlay(ns:NetStream,flv:String):void
		{
			state.startPlay(ns,flv);
		}
		internal function stopPlay(ns:NetStream):void
		{
			state.stopPlay(ns);
		}
		// Добавлено
		internal function doPause(ns:NetStream):void
		{
			state.doPause(ns);
		}
		internal function setState(state:State):void
		{
			trace("A new state is set");
			this.state = state;
		}
		internal function getState():State
		{
			return state;
		}
		internal function getPlayState():State
		{
			return this.playState;
		}
		internal function getStopState():State
		{
			return this.stopState;
		}
		// Добавлено
		internal function getPauseState():State
		{
			return this.pauseState;
		}
	}
}

Код AS3:
package 
{
	//Button for transition triggers
	// Кнопка для переключения триггеров
	import flash.display.Sprite;
	import flash.display.SimpleButton;
	import flash.display.Shape;
	import flash.text.TextFormat;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	public class NetBtn extends SimpleButton
	{
		public function NetBtn(txt:String)
		{
			upState = new BtnState(0xfab383,0x9e0039,txt);
			downState = new BtnState(0xffffff,0x9e0039,txt);
			overState = new BtnState(0x9e0039,0xfab383,txt);
			hitTestState = upState;
		}
	}
}

Код AS3:
package 
{
	//States for transition buttons
	// Состояния для кнопок переключения
	import flash.display.Sprite;
	import flash.display.Shape;
	import flash.text.TextFormat;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	class BtnState extends Sprite
	{
		public var btnLabel:TextField;
		public function BtnState(color:uint,color2:uint,btnLabelText:String)
		{
			btnLabel = new TextField();
			btnLabel.text = btnLabelText;
			btnLabel.x = 5;
			btnLabel.autoSize = TextFieldAutoSize.LEFT;
			var format:TextFormat = new TextFormat("Verdana");
			format.size = 12;
			btnLabel.setTextFormat(format);
			var btnWidth:Number = btnLabel.textWidth + 10;
			var bkground:Shape = new Shape();
			bkground.graphics.beginFill(color);
			bkground.graphics.lineStyle(2,color2);
			bkground.graphics.drawRect(0,0,btnWidth,18);
			addChild(bkground);
			addChild(btnLabel);
		}
	}
}

Код AS3:
package 
{
	//Implement FMS2 App and Test State Machine #6
	// Имплементация приложения и тестирование автомата
	import flash.display.Sprite;
	import flash.net.NetConnection;
	import flash.net.NetStream;
	import flash.media.Video;
	import flash.text.TextField;
	import flash.text.TextFieldType;
	import flash.events.MouseEvent;
	import flash.events.NetStatusEvent;
 
	public class TestPause extends Sprite
	{
		private var nc:NetConnection=new NetConnection( );
		private var ns:NetStream;
		private var vid:Video = new Video(320,240);
		private var vidTest:VideoWorks;
		private var playBtn:NetBtn;
		private var stopBtn:NetBtn;
		private var flv:String;
		private var flv_txt:TextField;
		private var dummy:Object;
 
		public function TestPause( )
		{
			nc.connect(null);
			ns = new NetStream(nc);
			addChild(vid);
			vid.x = stage.stageWidth / 2 - vid.width / 2;
			vid.y = stage.stageHeight / 2 - vid.height / 2;
 
			//Instantiate State Machine
			// Создаём автомат состояний
			vidTest = new VideoWorks();
 
			//Play, Stop and Pause Buttons
			// Кнопки проигрывания, остановки и паузы
			playBtn = new NetBtn("Play");
			addChild(playBtn);
			playBtn.x = stage.stageWidth / 2 - 100 + playBtn.width / 2;
			playBtn.y = 350;
			stopBtn = new NetBtn("Stop");
			addChild(stopBtn);
			stopBtn.x = stage.stageWidth / 2 - stopBtn.width / 2;
			stopBtn.y = 350;
			var pauseBtn:NetBtn = new NetBtn("Pause");
			addChild(pauseBtn);
			pauseBtn.x=(stage.stageWidth / 2 + 100) - pauseBtn.width;
			pauseBtn.y = 350;
 
			//Add Event Listeners
			// Добавляем обработчики событий
			playBtn.addEventListener(MouseEvent.CLICK,doPlay);
			stopBtn.addEventListener(MouseEvent.CLICK,doStop);
			pauseBtn.addEventListener(MouseEvent.CLICK,pauseNow);
 
			//Add the text field;
			// Добавляем текстовое поле
			flv_txt = new TextField();
 
			// Имя видеофайла
			flv_txt.text = "test";
 
			flv_txt.border = true;
			flv_txt.borderColor = 0x9e0039;
			flv_txt.background = true;
			flv_txt.backgroundColor = 0xfab383;
			flv_txt.type = TextFieldType.INPUT;
			flv_txt.x = stage.stageWidth / 2 - 45;
			flv_txt.y = 10;
			flv_txt.width = 90;
			flv_txt.height = 16;
			addChild(flv_txt);
 
			//This prevents a MetaData error being thrown
			// Для предотвращения ошибки мета-данных
			dummy = new Object();
			ns.client = dummy;
			dummy.onMetaData = getMeta;
 
			//NetStream
			ns.addEventListener(NetStatusEvent.NET_STATUS,flvCheck);
		}
 
		//MetaData
		// Мета-данные
		private function getMeta(mdata:Object):void
		{
			trace(mdata.duration);
		}
 
		//Handle flv
		// Работаем с видеофайлом
		private function flvCheck(event:NetStatusEvent):void
		{
			switch (event.info.code)
			{
				case "NetStream.Play.Stop" :
					vidTest.stopPlay(ns);
					vid.clear( );
					break;
				case "NetStream.Play.StreamNotFound" :
					vidTest.stopPlay(ns);
					flv_txt.text = "File not found";
					break;
			}
		}
 
		//Start play
		// Начинам проигрывание
		private function doPlay(e:MouseEvent):void
		{
			if (flv_txt.text != "" && flv_txt.text !=
			 "Provide file name")
			{
				flv_txt.textColor = 0x000000;
				flv = flv_txt.text + ".flv";
				vidTest.startPlay(ns,flv);
				vid.attachNetStream(ns);
			}
			else
			{
				flv_txt.textColor = 0xcc0000;
				flv_txt.text = "Provide file name";
			}
		}
 
		//Stop play
		// Останавливаем проигрывание
		private function doStop(e:MouseEvent):void
		{
			vidTest.stopPlay(ns);
			vid.clear( );
		}
 
		//Pause play
		// Ставим проигрывание на паузу
		function pauseNow(e:MouseEvent):void
		{
			vidTest.doPause(ns);
		}
	}
}