Comunidad de diseño web y desarrollo en internet online

Como trabajar con las variables locales de una funcion afuera de ella

Citar            
MensajeEscrito el 29 Sep 2008 06:30 am
Hola a todos!
Antes que nada quisiera que sepan que soy principiante en este tema...Estoy haciendo mi primer juego de Flash y es un juego de naipes españoles.El juego consta de cuatro jugadores (el usuario y tres IA), los cuatro empiezan el juego con tres cartas cada uno. Recientemente escribí el siguiente código ActionScript en la línea de tiempo principal (mi pregunta viene después del código):

Código :

stop();
//Cuando sueltes el "clic" del ratón arriba del botón repartir, que elija un número entre 1 y 12. Este será el número del naipe

repetir_btn.onRelease = function():Void  {
   for (var i:Number = 0; i<100; i++) {
      var nElegirnúmero:Number = Math.floor(Math.random()*12)+1;

//Luego que elija otro número entre 1 y 4. Este será correspondido con la pinta.

      var nElegirPinta:Number = Math.floor(Math.random()*4)+1;

//La siguiente variable será usada más tarde.

      var nProbarIgualdad1:Number=(nElegirnúmero/nElegirPinta) +nElegirnúmero;

/*Si el primer número elegido no es ni 8 ni 9, que se detengan los bucles y continue. Escribí esto porque en mi juego no se usan esas cartas. Por esta razón utilicé el bucle "for", no me sirven esos números.
*/   
      if (nElegirnúmero !== 8 && nElegirnúmero !== 9) {
         break;
      }
   }
/*Si el segundo número elegido es por ejemplo "1", que se declare una nueva variable "String" que a su vez contenga la ID de vinculación de un clip de película. Esta ID se armará con el primer número elegido y la palabra "oro" porque el segundo número es "1" .
*/
   switch (nElegirPinta) {
   case 1 :
      var sPrimeraCarta:String = (nElegirnúmero+' '+'de'+' '+'oro'+'_mc');
      break;
   case 2 :
      var sPrimeraCarta:String = (nElegirnúmero+' '+'de'+' '+'copa'+'_mc')
      break;
   case 3 :
      var sPrimeraCarta:String = (nElegirnúmero+' '+'of'+' '+'basto'+'_mc');
      break;
   case 4 :
      var sPrimeraCarta:String = (nElegirSnúmero+' '+'of'+' '+'espada'+'_mc');
      break;
   default :
      trace("error 1");
   }
//------------------------------------------------------------------------------------------
/* El código anterior es sólo para una de las doce cartas (recuerden que cada jugador tiene tres cartas), en consecuencia el código se repite doce veces con algunos cambios como nombres de variables, y la sentencia "if". Como ejemplo aquí está el segundo bucle "For".
*/
   //------------------------------------------------------------------------------------------
   for (var j:Number = 0; j<100; j++) {
      var nElegirSnúmero:Number = Math.floor(Math.random()*12)+1;
      var nElegirSPinta:Number = Math.floor(Math.random()*4)+1;
      var nProbarIgualdad2:Number = (nElegirSnúmero/nElegirSPinta) +nElegirSnúmero;

/* En este caso empleé la variable "nProbarIgualdad1" que había escrito en las líneas anteriores. La coloqué aquí porque quiero que el segundo naipe sea distinto al primero. Si "nElegirnúmero" es igual a "nElegirSnúmero" no tendrá importancia mientras "nElegirPinta" sea distinto a "nElegirSPinta". Si esto no fuera así, tendría por ejemplo dos 4 de oro en el escenario de mi película Flash.
   Por otro lado, "nElegirSnúmero" y "nElegirSPinta"  pueden ser iguales entre sí, pero sí o sí tienen que ser distintas a "nElegirnúmero" y "nElegirPinta". Utilicé una operación matemática dentro de la variable nProbarIgualdad porque fue el único modo que encontre de lograr que dos números aleatorios se conviertan en uno solo, y pueda este último compararse con otro obtenido de igual modo. No se como comparar dos números  con otros dos.
*/

      if (nElegirSnúmero !== 8 && nElegirSnúmero !== 9 && nProbarIgualdad2 !== nProbarIgualdad1) {
         break;
      }
   }
   switch (nElegirSPinta) {
   case 1 :
      var sSegundaCarta:String = (nElegirSnúmero+' '+'de'+' '+'oro'+'_mc');
      break;
   case 2 :
      var sSegundaCarta:String = (nElegirSnúmero+' '+'de'+' '+'copa'+'_mc');

      break;
   case 3 :
      var sSegundaCarta:String = (nElegirSnúmero+' '+'de'+' '+'basto'+'_mc');
      break;
   case 4 :


      var sSecondCard:String = (nElegirSnúmero+' '+'de'+' '+'espada'+'_mc');
      break;
   default :
      trace("error 2");
   }
//------------------------------------------------------------------------------------------
// La sentencia "if" dentro del último bucle "For" se vuelve muy confusa. Aquí está.
   //------------------------------------------------------------------------------------------
   
if (nElegirMnúmber !== 8 && nElegirMnúmber !== 9 && nProbarIgualdad12 !== nProbarIgualdad11 && nProbarIgualdad12 !== nProbarIgualdad10 && nProbarIgualdad12 !== nProbarIgualdad9 && nProbarIgualdad12 !== nProbarIgualdad8 && nProbarIgualdad12 !== nProbarIgualdad7 && nProbarIgualdad12 !== nProbarIgualdad6 && nProbarIgualdad12 !== nProbarIgualdad5 && nProbarIgualdad12 !== nProbarIgualdad4 && nProbarIgualdad12 !== nProbarIgualdad3 && nProbarIgualdad12 !== nProbarIgualdad2 && nProbarIgualdad12 !== nProbarIgualdad1) {
         break;
      }
/*Por último, (aún dentro de la función) que se adjunten los clips de película dentro de nuevas variables llamadas mPrimerNaipe, mSegundoNaipe, etc.
*/

   var mPrimerNaipe:MovieClip = this.attachMovie(sPrimeraCarta, 'm'+sPrimeraCarta, _root.getNextHighestDepth());
    mPrimerNaipe._height = 88.7;
    mPrimerNaipe._width = 60;
    mPrimerNaipe._x = 290;
   mPrimerNaipe._y = 400;
   var mSegundoNaipe:MovieClip = this.attachMovie(sSegundaCarta, 'm'+ssSegundaCarta, _root.getNextHighestDepth());
    mSegundoNaipe._height = 88.7;
    mSegundoNaipe._width = 60;
    mSegundoNaipe._x = 370;
    mSegundoNaipe._y = 400;
   var mTercerNaipe:MovieClip = this.attachMovie(sTerceraCarta, 'm'+sTerceraCarta, _root.getNextHighestDepth());
   mTercerNaipe._height = 88.7;
   mTercerNaipe._width = 60;
   mTercerNaipe._x = 450;
   mTercerNaipe._y = 400;
   var mCuartoNaipe:MovieClip = this.attachMovie(sCuartaCarta, 'm'+sCuartaCarta, _root.getNextHighestDepth());
   mCuartoNaipe._height = 88.7;
   mCuartoNaipe._width = 60;
   mCuartoNaipe._x = 600;
   mCuartoNaipe._y = 410;
   mCuartoNaipe._rotation = 270;

//etc...

};
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

Quizá este código parezca para los programadores basura. Pero a pesar de eso funciona!!! Ahora viene el problema: Cuando quiero utilizar lo que contiene una variable que se encuentra dentro de la función no puedo hacerlo. Esto debe ser porque es una variable local y estoy fuera de ámbito. ¿Como puedo declarar entonces las últimas variables (como mCuartoNaipe) afuera de la función utilizando los números aleatorios que ésta me calculó?


PD: editado para mejor lectura...

Por decxx1

1 de clabLevel



 

firefox
Citar            
MensajeEscrito el 29 Sep 2008 09:46 am
Quizá este código parezca para los programadores basura. Pero a pesar de eso funciona!!!


Yo con mas de diez líneas me pierdo, así que dejo a alguien con mejor ojo la respuesta. Solo una opinión si se me permite. No se trata de si les gusta o no a los programadores, ya que a cierto nivel no es una cuestión subjetiva, sino básicamente técnica. Es decir ciertas cosas pueden funcionar con mucha artesana paciencia (por ejemplo un if de 20 condiciones) pero jamás escalar, y mucho menos en un juego, donde se necesita de buena técnica para no lleggar a situaciones imposibles.
Yo siempre sugiero empezar con cosas mas simples, por ejemplo situar cuatro cartas al azar sin que se repitan en cada tirada, algo que no te puede llevar mas de 20 líneas de código

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 29 Sep 2008 08:54 pm
Puedo asegurarte que le hagas caso a lo que te aconseja Jorge, depende de ti si deseas tomar el consejo o no.
No he mirado tu código, pero por tu pregunta mira este post

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox

 

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