Comunidad de diseño web y desarrollo en internet online

Rueda de la fortuna aleatoria OK, problema con premios limitados.HELP!

Citar            
MensajeEscrito el 31 Jul 2014 04:16 pm
bueno estoy en un problema que seguramente algun "critalAngel" me va saber a ayudar.

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!

Por x-dim

56 de clabLevel



 

firefox
Citar            
MensajeEscrito el 01 Ago 2014 03:36 am
podes hacer que tenga X cantidad de posiciones para salir y que dicha posicion esta en un array estatico, cuando haces el random la primera vez sea de entre los numeros 1 a 10 ponele si sale 3, que lea la posicion 2 de la ray para el angulo, en la proxima tire random de nuevo si sale el numero que salio anteriormente que tire random de neuvo pero entre los numeros 2 y 4 y vas haciendo algo asi

Por fenix8k

6 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Ago 2014 05:05 pm
En realidad es un una idea que no va a funcionar. si observas el código cuando el giro se queda sin fuerza determina la posicion final y dependiendo del angulo muestra el premio correspondiente.

La solucion que busco es crear una grafica tipo torta que se genere leyendo un xml o una serie de txt y que al caer en un numero determinado reste un valor al premio. y si el numero de premios del patrocinador es igual a 0 no dibuje la marca en la grafica de torta..

el verdadero problema es que no se como lograr que flash reescriba un dato determinado en un archivo externo de manera automática y confiable

Por x-dim

56 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Ago 2014 07:25 pm

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 08 Ago 2014 10:40 pm
Gracias. Jorge la verdad me ayudó a entrender más que es lo que necesito.

Lo que necesito es: que a traves de la clase Local Shared Object me genere y guarde un estado de una variable y que cada vez que presione el botón se Reste un valor y guarde dicho shared object. Deberia hacer 7 shared objects para evitar problemas de lecto escritura.

pero no entiendo como hacer esta funcion, se que es una cosa de principiantes. pero se me escapa. Podría alguien darme un ejemplo de este código?

Por x-dim

56 de clabLevel



 

firefox
Citar            
MensajeEscrito el 11 Ago 2014 12:51 pm

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 15 Ago 2014 01:09 am
Gracias, ya lo habia consultado y auque entendí como hacerlo no pude programar la solucion a la fecha de cierre de todas formas el cliente quedó conforme con el resultado.

Ya que no se aclaró el tema ni se aportó nada nuevo a la comunidad me gustaría que algún moderador de por cerrado y/o elimine este post...

Es extraño estoy casi seguro que antes podía modificar y eliminar los post creados por mí y ahora no... raro no?

Por x-dim

56 de clabLevel



 

firefox
Citar            
MensajeEscrito el 15 Ago 2014 11:32 am
Hay muchos temas que aunque no cerrados del todo orientan a la gente. Hay muchos usuarios que luego de larguisimos POST de discusiones técnicas los borraban, casi siempre argumentando que no querían que su cliente se enterara que habían consultado en el foro. Por eso se evita que se borren hilos que generalmente contienen valiosa información para otros intentando hacer lo mismo (y de paso le evitan al moderador escribir lo mismo una y otra vez)

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.