el problema es el siguiente. un cliente me habia pedido deasarrollar una rueda de la fortuna o ruleta con premios aleatorios y yo acepte el encargo lo que se le olvidó decir era que tenia un numero limitado de premios para cada casillero.
este es el ejemplo que logre con un proyecto que compré en mfiles.com y un poco de esfuerzo.
y este es el codigo principal
Código ActionScript :
import flash.display.*; import flash.events.*; import flash.utils.getTimer; import fl.transitions.Tween; import fl.transitions.TweenEvent; import fl.transitions.easing.*; import flash.filters.BlurFilter; import flash.utils.Timer; import flash.events.TimerEvent; //angleArray, prizesArray, and prizeClass tienen que tener el mismo largo. //angleArray: cambiar el angulo "end" para encajar con la rueda //prizesArray: estos serán mostrados dentro de "mc_prize" en un texto dinamico //prizeClass: los "linkage id" de tus premios. estan en la carpeta "prozes" var angleArray:Array = [0,30,60,75,90,120,150,180,210,240,250,260,270,300,330,360]; var prizesArray:Array = [0,700,2000,7500,"Perdiste",900,1500,4000,3000,400,9000,"Perdiste",5000,500,4500,"Otro Turno"]; var prizeClass:Array = [null,prize1,prize2,prize3,prize4,prize5,prize6,prize7,prize8,prize9,prize10,prize11,prize12,prize13,prize14,prize15]; //rotacion maxima y minima en segundos var maxDuration:Number = 10.5; var minDuration:Number = 2; var itemsNum:int = angleArray.length; var isRotating:Boolean = false; var rotateTween:Tween; var timeClicked:Number; var endTime:Number; var prizeContainer:MovieClip = new MovieClip(); addChild(prizeContainer); var numPower:int; var duration:Number; var timeRotating:Number; var setTimer:Timer; //filtros estáticos const FILTERSNULL:Array = []; const SHADOW:DropShadowFilter = new DropShadowFilter(4,45,0x000000,.7, 12,12,.5,1); const GLOW:GlowFilter = new GlowFilter(0x333333, .4, 14, 14); const SHADOWON:Array = [SHADOW]; const GLOWON:Array = [GLOW]; //condiciones iniciales del juego startGame(); function startGame() { mc_indicator.needle.rotation =-90; mc_prize.visible = false; btn_start.buttonMode = true; giveColorTo(btn_start,0x0099FF); btn_start.addEventListener(MouseEvent.MOUSE_DOWN, timeIsRunning); mc_indicator.pointer.filters = SHADOWON; btn_start.filters = GLOWON; } //funcion para iniciar el animador de poder function startTimer(tickevery:int) { setTimer = new Timer(tickevery); setTimer.addEventListener(TimerEvent.TIMER, increasePower, false, 0, true); setTimer.start(); } //esta funcion se dispara después de clickear btn_start. function timeIsRunning(e:MouseEvent) { btn_start.removeEventListener(MouseEvent.MOUSE_DOWN, timeIsRunning); stage.addEventListener(MouseEvent.MOUSE_UP, startRotating); timeClicked = getTimer(); startTimer(100); numPower = 0; } //incrementa el tiempo de rotacion. solo por decoracion function increasePower(e:TimerEvent) { if(mc_indicator.mc_inner.rotation < 180) { numPower +=5; mc_indicator.mc_inner.rotation += numPower; mc_indicator.needle.rotation += numPower; } } //gira la rueda al soltar el mouse function startRotating(e:MouseEvent) { stage.removeEventListener(MouseEvent.MOUSE_UP, startRotating); if (!isRotating) { isRotating = true; timeRotating = getTimer(); timeAvail = timeRotating - timeClicked; numBlur = 2; duration = Math.min(maxDuration, Math.max(minDuration, (timeAvail / 100))); var destRotation = Math.round((duration * 360) + (Math.random() * 360) - (Math.random() * 90)); rotateTween = new Tween(mc_wheel, "rotation", Strong.easeOut, mc_wheel.rotation, destRotation, duration, true); rotateTween.addEventListener(TweenEvent.MOTION_CHANGE, blurRotating); rotateTween.addEventListener(TweenEvent.MOTION_FINISH, endRotating); Mouse.hide(); } } //mientras la rueda gira. se aplica filtro de desenfoque //el desenfoque depende de la duracion del giro en (ms) function blurRotating(e:TweenEvent):void { var blur:BlurFilter = new BlurFilter(); blur.quality = 1; blur.blurX = numBlur; blur.blurY = numBlur; mc_wheel.filters = [blur]; var ms:Number = duration*1000; var d:Number = getTimer(); var m:Number = timeRotating+ms; var dx:Number = m - d; if (ms > 9000) easeFading = ms-3500;//6500; else if (ms > 6000 && ms <= 9000) easeFading = ms-2500; else if (ms > 3000 && ms <= 6000) easeFading = ms-1500; else if (ms > 1000 && ms <= 3000) easeFading = ms-500; else easeFading = 500; if(dx > easeFading && numBlur < 8) { numBlur ++ } if(dx < easeFading && numBlur >0) { numBlur-- } setTimer.stop(); btn_start.buttonMode = false; giveColorTo(btn_start, 0xCCCCCC) mc_indicator.mc_inner.rotation = 0; btn_start.removeEventListener(MouseEvent.MOUSE_DOWN, timeIsRunning); mc_indicator.needle.rotation =-90; } /* cuando la rotacion termina,se remueve el filtro mc_wheel , y se rastrea el angulo de la rotación de mc_wheel y muestra el premio correspondiente */ function endRotating(e:TweenEvent):void { var myTween:Tween = e.currentTarget as Tween; myTween.removeEventListener(TweenEvent.MOTION_FINISH, endRotating); myTween = null; isRotating = false; mc_wheel.filters = FILTERSNULL; endTime = getTimer() - timeClicked; var endr:Number = mc_wheel.rotation; var trueend:Number = endr - 90; var truepos:Number = 360 - endr; if(truepos > 360) truepos = truepos - 360; timeClicked = 0; btn_start.buttonMode = true; btn_start.addEventListener(MouseEvent.MOUSE_DOWN, timeIsRunning); giveColorTo(btn_start,0x0099FF); Mouse.show(); showPrize(getAngleSpace(truepos)) } /*funcion para emparejar el angulo-final y angleArray array. el resultado es "n" que será el usasdo como indice de los otros array */ function getAngleSpace(n:Number):int { for (var i = itemsNum - 1; i >= 0; i--) { if(n > angleArray[i-1] && n <= angleArray[i]) { return i; break; } } } /* el premio #n será mostrado en el escenario. "n" es el indice del array prizeClass*/ function showPrize(n:int) { var mc:MovieClip = new prizeClass[n]; mc.x = mc_wheel.x; mc.y = mc_wheel.y - 30; prizeContainer.addChild(mc); mc_prize.visible = true; mc_prize.prizetxt.text = String(prizesArray[n]) mc_prize.btn_close.buttonMode = true; mc_prize.btn_close.addEventListener(MouseEvent.CLICK, hidePrize) } function hidePrize(e:MouseEvent) { mc_prize.visible = false; e.currentTarget.removeEventListener(MouseEvent.CLICK, hidePrize); removeAssets(prizeContainer); } /* colorear un movie clip */ function giveColorTo(mc:MovieClip, theColor:uint) { var col:ColorTransform = new ColorTransform; col.color = theColor; mc.mc_inner.transform.colorTransform = col; } /* funcion para remover los children de un movieclip*/ function removeAssets(mc:MovieClip):void { while (mc.numChildren) { mc.removeChildAt(0); } }
El problema es ahora que cuando salga la cantidad de premios previstos para cada casillero debería eliminarse esa opción. lo cual es imposible en el código actual ya que los angulos son definidos en un array estatico y la gráfica es un mc. lo más cercano que se me ocurrió es que que cuando se terminé ese premio, la rueda pare en la opción valida más cercana. pero no tengo idea de como lograrlo.
cualquier solucion que se les ocurra será bienvenida.
Además la cantidad de premios restantes deberia guardarse en un archivo externo para que al reiniciar la aplicacion no se reinicie el stock. no se dejen engañar por el código no soy programador apenas puedo leer eso.
Gracias!