![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Sep 2012
Сообщений: 57
|
Здравствуйте, не подскажете как создать встроенный(!) в приложение звук, и чтоб он при нажатии на объект начинал проигрываться, а при повторном нажатии замолкал (а лучше чтоб вставал на паузу, но можно без этого).
Пыталась сделать так: Добавила звук внутрь мувиклипа с классом zvuk zvuk_1.addEventListener(MouseEvent.CLICK, play_sound1); function play_sound1 ():void { var zvuk1:zvuk = new zvuk (); addChild(zvuk1); zvuk1.visible = false; if (stage.contains(zvuk1)) { zvuk_1.removeEventListener(MouseEvent.CLICK, play_sound1); zvuk_1.addEventListener(MouseEvent.CLICK, stop_sound1); } function stop_sound1 ():void { removeChild(zvuk1); zvuk_1.removeEventListener(MouseEvent.CLICK, stop_sound1); zvuk_1.addEventListener(MouseEvent.CLICK, play_sound1); } } И ещё заметила, что он воспроизводится лишь один раз. А надо циклично. |
|
|||||
|
Регистрация: Dec 2012
Сообщений: 100
|
Шаблон состояние:
1. Контекстный класс VideoWorks.as 2. Классы контекста состояния StopState.as - проигрывание остановлено PlayState.as - состояние проигрывания 3. Интерфейс состояния State.as 4. Клиент TestState.as package { //Context class // Контекстный класс class VideoWorks { var playState:State; var stopState:State; // Переменная для хранения текущего состояния var state:State; public function VideoWorks() { trace("Video Player is On"); playState = new PlayState(this); stopState = new StopState(this); state = stopState; } public function startPlay():void { state.startPlay(); } public function stopPlay():void { state.stopPlay(); } // Методы получатели и установщики public function setState(state:State):void { trace("A new state is set"); this.state = state; } public function getState():State { return state; } public function getPlayState():State { return this.playState; } public function getStopState():State { return this.stopState; } } } package { //Stop State; // Класс контекстного состояния: проигрывание остановлено class StopState implements State { // Доступ к методам установщикам и получателям для каждого состояния var videoWorks:VideoWorks; public function StopState(videoWorks:VideoWorks) { trace("--Stop State--"); this.videoWorks = videoWorks; } public function startPlay():void { trace("Begin playing"); videoWorks.setState(videoWorks.getPlayState()); } public function stopPlay():void { trace("You're already stopped"); } } } package { //Play State // Класс контекстного состояния: состояние проигрывания class PlayState implements State { var videoWorks:VideoWorks; public function PlayState(videoWorks:VideoWorks) { trace("--Play State--"); this.videoWorks = videoWorks; } public function startPlay():void { trace("You're already playing"); } public function stopPlay():void { trace("Stop playing."); videoWorks.setState(videoWorks.getStopState()); } } } package { //State Machine Interface // Интерфейс автомата состояний interface State { function startPlay():void; function stopPlay():void; } } |
|
|||||
|
Регистрация: Sep 2012
Сообщений: 57
|
Спасибо, но я с классами не очень много работала, вот я их все создала, а в главный класс добавила:
Окно вывод выдаёт каждый раз как я добавляю объект с музыкой на сцену: Video Player is On --Play State-- --Stop State-- Begin playing A new state is set Но я упорно не могу понять как управлять воспроизведением с помощью этого кода( |
|
|||||
|
Регистрация: Dec 2012
Сообщений: 100
|
Цитата:
С помощью метода setState эземпляра контекстного класса VideoWorks вы устанавливаете состояние. А уже непосредственно startPlay() или stopPlay() будет вызываеть метод конкретного состояния. И если вы обратили внимание, то первое сотояние в которое переходит VideoWorks в своём конструкторе (т.е. при инициализации) state = stopState; - состояние остановлено, таким образом, если бы мы вызвали в клиенте test.stopPlay( );, то вам в трэйс выдало: You're already stopped., т.е. выполнение каких-либо действий в данном случае просиходить не должно. Друми словами: в зависимости от состояния: либо выполняются действия, либо они не выполняются (т.е. метод ничего не содержит и служит только для обращения к нему через интерфейс) |
|
|||||
|
Регистрация: Feb 2012
Сообщений: 1,540
|
Удали классы, верни все обратно. Нажми на кадр с музыкой и выбери в настройках тип воспроизведения - "Поток" (Stream).
|
|
|||||
|
Регистрация: 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 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;// добавлено } } 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."); } } } 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()); } } } 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()); } } } 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; } } } 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; } } } 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); } } } 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); } } } |
|
|||||
|
Регистрация: Feb 2012
Сообщений: 1,540
|
Яша, это всего новичок.
|
|
|||||
|
Цитата:
package { import flash.display.*; import flash.events.*; import flash.media.*; import flash.net.*; import flash.utils.*; public class Main extends MovieClip { var soundChanel; var pauseTr; var soundPosition = 0; public function Main() { // constructor code sndPlayPauseBtn.addEventListener(MouseEvent.CLICK, clickHandler); } function clickHandler(e:*):void{ if (pauseTr){ soundPosition = soundChanel.position; soundChanel.stop(); pauseTr = false; } else { soundChanel = new MySound().play(soundPosition,99999999); pauseTr = true; } } } } Без AS3 http://www.youtube.com/watch?v=ekZiCYfDGEo
__________________
Гоночка Последний раз редактировалось Alex Lexcuk; 16.03.2013 в 20:19. |
|
|||||
|
Регистрация: Sep 2012
Сообщений: 57
|
Alex Lexcuk, огромное вам спасибо!
|
![]() |
![]() |
Часовой пояс GMT +4, время: 21:16. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|