/* Class ControlPanel created by Alon Farchy This is the code for the Control Panel -- the thing that allows the user to navigate through scenes by either clicking on a "playbar tick", dragging the playhead, or clicking on the forward/back/pause buttons. */ package code { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import code.controlPanelSkin; import code.buttons.*; public class ControlPanel extends SpriteExt { //vars private var _play:ButtonPlay = new ButtonPlay(); private var _next:ButtonForward = new ButtonForward(); private var _back:ButtonBackward = new ButtonBackward(); private var playhead:Playhead = new Playhead(); private var playPoint:Array = new Array(); private var _scene:int = 0; //const. public function ControlPanel(numScenes:int) { drawControlPanel(numScenes); } //GETTERS *************** public function get scene() { return _scene; } public function get btnPlay():ButtonCheck { return _play; } public function get btnBack():ButtonClass { return _back; } public function get btnNext():ButtonClass { return _next; } //DRAW IT! protected function drawControlPanel(numTicks:int) { //BACKGROUND ********************************************************************************* var bg:controlPanelSkin = new controlPanelSkin(); addChild(bg); //ADD BUTTONS! ******************************************************************************* btnPlay.x = -2; btnPlay.y = 3; btnPlay.scaleX = .6; btnPlay.scaleY = .6; btnPlay.name = "play"; addChild(btnPlay); btnNext.x = -2+30; btnNext.y = 3; btnNext.scaleX = .6; btnNext.scaleY = .6; btnNext.name = "next"; addChild(btnNext); btnBack.x = -2-30; btnBack.y = 3; btnBack.scaleX = .6; btnBack.scaleY = .6; btnBack.name = "back"; addChild(btnBack); //PLAYBAR TICKS****************************************************************************** var ticks:Sprite = new Sprite(); var interval:Number = 253.4/(numTicks); ticks.y = -8; ticks.x = -1 ticks.graphics.lineStyle(2,0x000000,.5); for(var i = 0; i < numTicks; i++) { ticks.graphics.moveTo(-253.4/2+interval*i,ticks.y-3); ticks.graphics.lineTo(-253.4/2+interval*i,ticks.y+3); playPoint[i] = new ButtonPlaybar(); playPoint[i].y = -19.5+playPoint[i].height/2; playPoint[i].width = interval; playPoint[i].x = -253/2+playPoint[i].width/2+interval*i-1; addChild(playPoint[i]); playPoint[i].name = "s"+i; } addChild(ticks); //PLAYHEAD ********************************************************************************** playhead.width = interval; playhead.x = -253/2+playhead.width/2-1; playhead.y = -19.5+playhead.height/2; addChild(playhead); playhead.name = "playhead"; // EVENT LISTENERS ************************************************** addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler); } //Moves the playhead to the closest tick mark and changes the scene to that tick. protected function fixPlayhead() { //Find closest tickmark. var closest:Number = 0; var distance:Number = 1000; for(var i = 0; i < playPoint.length; i++) { if(Math.abs(playhead.x - playPoint[i].x) < distance) { distance = playhead.x - playPoint[i].x; closest = i; } } changeScene(closest); Main(root).changeScene(closest); } //Moves the playhead to scene sceneNumber. public function changeScene(sceneNumber):void { _scene = sceneNumber; playhead.addEventListener(Event.ENTER_FRAME, playheadEnterFrameHandler); } //EVENT HANDLERS ******************************************************************************** //Mouse release playhead. protected function releasePlayheadHandler(event:Event):void { if(playhead.dragging) { playhead.reset(); fixPlayhead(); } } //Mouse click buttons. protected function mouseClickHandler(event:Event):void { for(var i = 0; i < playPoint.length; i++) { if(event.target.name == playPoint[i].name) { changeScene(i); Main(root).changeScene(i); return void; } } switch(event.target.name) { case "play": if(btnPlay.isChecked) { if(Main(root).sceneNum == Main(root).numScenes[Main(root).chapterNum]) btnPlay.unCheckButton(); else { Main(root).unFreeze(); Main(root).isPlaying = true; } } else { Main(root).freeze(); Main(root).isPlaying = false; } break; case "back": Main(root).changeSceneBack(); break; case "next": Main(root).changeSceneForward(); break; default: break; } } //Playhead move on enter frame. protected function playheadEnterFrameHandler(event:Event):void { var vel = -(playhead.x-playPoint[_scene].x)/2; playhead.x += vel/2; if(Math.abs(vel) <= .3) { playhead.x = playPoint[_scene].x; playhead.removeEventListener(Event.ENTER_FRAME, playheadEnterFrameHandler); } } //Playhead let go. protected function addedToStageHandler(event:Event):void { stage.addEventListener(MouseEvent.MOUSE_UP, releasePlayheadHandler); addEventListener(MouseEvent.CLICK, mouseClickHandler); } } }