Comunidad de diseño web y desarrollo en internet online

Variables y dibujos...

Citar            
MensajeEscrito el 23 May 2006 04:54 pm
Hola a todos... ante todo gracias por cualquier aportación.

Bueno, he llegado a un punto de desesperación, no entiendo que puede estar ocurriendo en este código para que no funcione, he probado mil cosas, he buscado y requetebuscado por todas partes y no encuentro nada. La cuestion básica es que tengo un problema con las variables. En el código que os implemento a continuación lo que hago es hacer una llamada a una base de datos (esto lo hace bien) y mediante las variables retornadas hago unos cálculos, en concreto es sobre velocidad del viento, el código es muy sencillo de entender. Lo que pretendo en definitiva es finalmente dibujar la dirección del viento y unas cuantas cosas más pero no consigo que haga nada de eso... y antes de agregar el tema de la llamada a la BD si que funcionaba... Lo que he observado es que no se hablan las variables dentro de la función que "recibe" los datos de la BD y el resto del código fuera de la funcion porque la variable 'v' no es capaz de leerla fuera de esta función y eso que he probado con _root.v _global.v y un ¿millon? de cosas mas pero nada que no hay manera.

Estoy seguro de que tiene que ser una estupidez... pero no consigo verlo! :twisted:

Aqui viene el peacho codigo y antetodo muchas muchisimas gracias a TODOS...

Código :

//Funciones
function modulo(fvx,fvy) {
   var a:Number = Number(fvx);
   var b:Number = Number(fvx);
   a=(Math.abs(a));a=a*a;
   b=(Math.abs(b));b=b*b;
   return Math.sqrt(a+b);
};

function direccion(fvx,fvy) {
   var fd=(Math.atan(fvx/fvy))*180/Math.PI;
   if (fd<0 & fvy>0) {
      fd=360+fd;
   } else if (fd<0 & fvy<0) {
      fd=180+fd;
   } else if ( fd>0 & fvy<0) {
      fd=180+fd;
   } 
   return Math.round(fd);   
};
//#######################################

// Fecha de hoy para enviar a la BD
var today_date:Date = new Date();
if ((today_date.getMonth()+1)<10) {
   var aux:String = ("0"+(today_date.getMonth()+1));
} else {
   var aux:Number = (today_date.getMonth()+1);
}
if (today_date.getDate()<10) {
   var aux2:String = (aux+"-0"+today_date.getDate());
} else {
   var aux2:String = (aux+"-"+today_date.getDate());
}
var pdata:String = (today_date.getFullYear()+"-"+aux2);
   
// hora UTC
var horaUTC:Number = today_date.getUTCHours();

// Enviamos i Recibimos los datos del servidor de la BD
envio = new LoadVars();
recibir = new LoadVars();
envio.dia=pdata;
envio.hora=horaUTC;
envio.action="vent";
envio.sendAndLoad("./FLASH_MYSQL/consulta.php", recibir, "POST");

recibir.onLoad = function(exito) {
   if (exito) {
      switch (this.opcion) {
      case "0" :
         mensaje_txt = "No hay predicción";
         break;
      case "1" :
         mensaje_txt = "Datos correctos";
         inivx = Number(this.vx);
         inivy = Number(this.vy);
         inievx = Number(this.errorvx);
         inievy = Number(this.errorvy);
         mdata = this.pdata;
         break;
      default :
         mensaje_txt = "no hay conexión";
         break;
      };
   } else {
      mensaje_txt = "Error en el Script";
   };

   // c es para seleccionar imagen de fondo en nudos
   c = modulo(Math.abs(inivx)+inievx,Math.abs(inivy)+inievy); 

   // modulo de la velocidad (predicción)
   v = Math.round(modulo(inivx,inivy)); 

   // dirección (predicción)
   d = direccion(inivx,inivy); 
   
   // velocidad máxima i mínima
   vmax=Math.round(modulo(Math.abs(inivx)+inievx,Math.abs(inivy)+inievy));
   vmin=Math.round(modulo(Math.abs(inivx)-inievx,Math.abs(inivy)-inievy));

   if ( v<=3 ) {
      vmax='variable';
   } else {
      vmax=vmax+' / '+vmin;
   };

   // punto de partida para dibujar
   base = 200;

   // imagen de fondo: 5/20/40 nudos
   if ( c<=5 ) { 
      fons.gotoAndStop(1);
      vx = Number(base)+Number(inivx)*40;
      vy = Number(base)-Number(inivy)*40;
      evx = Number(inievx)*40;
      evy = Number(inievy)*40;
   } else if ( c>5 & c<=20 ) {
      fons.gotoAndStop(2);
      vx = Number(base)+(Number(inivx)*10);
      vy = Number(base)-(Number(inivy)*10);
      evx = Number(inievx)*10;
      evy = Number(inievy)*10;
   } else if ( c>20 ) {
      fons.gotoAndStop(3);   
      vx = Number(base)+(Number(inivx)*5);
      vy = Number(base)-(Number(inivy)*5);
      evx = Number(inievx)*5;
      evy = Number(inievy)*5;
   }
};

// dibujamos error en la dirección
this.createEmptyMovieClip("dir_mc", this.getNextHighestDepth());
dir_mc.beginFill(0xffff00,30);
dir_mc.moveTo(Number(base), Number(base));
if ( inivx>=0 & inivy>=0 ) {
   if ( (vx-evx)<200 ) {
      dir_mc.lineTo(vx-evx,vy+evy);
   }
   dir_mc.lineTo(vx-evx,vy-evy);
   dir_mc.lineTo(vx+evx,vy-evy);
   dir_mc.lineTo(vx+evx,vy+evy);
   if ( (vy+evy)>200 ) {
      dir_mc.lineTo(vx-evx,vy+evy);
   }
   } else if ( inivx<0 & inivy>0 ) {
      if ( (vx+evx)>200 ) {
         dir_mc.lineTo(vx+evx,vy+evy);
      }
      dir_mc.lineTo(vx+evx,vy-evy);
      dir_mc.lineTo(vx-evx,vy-evy);
      dir_mc.lineTo(vx-evx,vy+evy);
      if ( (vy+evy)>200 ) {
         dir_mc.lineTo(vx+evx,vy+evy);
      }
   } else if ( inivx<0 & inivy<0 ) {
      if ( (vx+evx)>200 ) {
         dir_mc.lineTo(vx+evx,vy-evy);
      }
      dir_mc.lineTo(vx+evx,vy+evy);
      dir_mc.lineTo(vx-evx,vy+evy);
      dir_mc.lineTo(vx-evx,vy-evy);
      if ( (vy-evy)<200 ) {
         dir_mc.lineTo(vx+evx,vy-evy);
      }
   } else if ( inivx>0 & inivy<0 ) {
      if ( (vx-evx)<200 ) {
         dir_mc.lineTo(vx-evx,vy-evy);
      }
      dir_mc.lineTo(vx-evx,vy+evy);
      dir_mc.lineTo(vx+evx,vy+evy);
      dir_mc.lineTo(vx+evx,vy-evy);
      if ( (vy-evy)<200 ) {
         dir_mc.lineTo(vx-evx,vy-evy);
      }
}
dir_mc.lineTo(base,base);
dir_mc.endFill();

// dibujamos error en el area
this.createEmptyMovieClip("area_mc", this.getNextHighestDepth());
area_mc.beginFill(0xff0000,20);
if ( inivx>=0 & inivy>=0 ) {
   area_mc.moveTo(vx-evx, vy+evy);
   area_mc.lineTo(vx-evx, vy-evy);
   area_mc.lineTo(vx+evx, vy-evy);
   area_mc.lineTo(vx+evx, vy+evy);
   area_mc.lineTo(vx-evx, vy+evy);
   dmax=direccion(inivx+inievx,inivy-inievy);
   dmin=direccion(inivx-inievx,inivy+inievy);
   } else if ( inivx<0 & inivy>0 ) {   
       area_mc.moveTo(vx+evx, vy+evy);
      area_mc.lineTo(vx-evx,vy+evy);
      area_mc.lineTo(vx-evx,vy-evy);
      area_mc.lineTo(vx+evx,vy-evy);
      area_mc.lineTo(vx+evx,vy+evy);
      dmax=direccion(inivx+inievx,inivy+inievy);
      dmin=direccion(inivx-inievx,inivy-inievy);
   } else if ( inivx<0 & inivy<0 ) {
      area_mc.moveTo(vx+evx, vy-evy);
      area_mc.lineTo(vx+evx,vy+evy);
      area_mc.lineTo(vx-evx,vy+evy);
      area_mc.lineTo(vx-evx,vy-evy);
      area_mc.lineTo(vx+evx,vy-evy);      
      dmax=direccion(inivx-inievx,inivy+inievy);
      dmin=direccion(inivx+inievx,inivy-inievy);
   } else if ( inivx>0 & inivy<0 ) {
      area_mc.moveTo(vx-evx,vy-evy);
      area_mc.lineTo(vx+evx,vy-evy);
      area_mc.lineTo(vx+evx,vy+evy);
      area_mc.lineTo(vx-evx,vy+evy);
      area_mc.lineTo(vx-evx,vy-evy);
      dmax=direccion(inivx-inievx,inivy-inievy);
      dmin=direccion(inivx+inievx,inivy+inievy);
}
area_mc.endFill();

if ( recibir.v<=3 ) {
   dmax='variable';
} else {
   dmax=dmax+' / '+dmin;
};

// ejes
this.createEmptyMovieClip("linvx_mc", this.getNextHighestDepth());
linvx_mc.lineStyle(0, 0xffffff, 60, true, "none", "round", "miter", 1);
linvx_mc.moveTo(vx, base);
linvx_mc.lineTo(vx,vy);
this.createEmptyMovieClip("linvy_mc", this.getNextHighestDepth());
linvy_mc.lineStyle(0, 0xffffff, 60, true, "none", "round", "miter", 1);
linvy_mc.moveTo(base, vy);
linvy_mc.lineTo(vx,vy);

// Vector viento
this.createEmptyMovieClip("vector_mc", this.getNextHighestDepth());
vector_mc.lineStyle(2, 0x0000ff, 150, true, "none", "round", "miter", 1);
vector_mc.moveTo(base, base);
vector_mc.lineTo(vx,vy);

//control de errores en dirección
if ( Math.abs(inivx)<=inievx & Math.abs(inivy)<=inievy ){
   dir_mc._alpha = 0;
} else {
   dir_mc._alpha = 40;
};

Por orixas

3 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 23 May 2006 05:15 pm
Es un código un poco largo... ¿donde falla exactamente (sería bueno que hicieras traces de v y postearas donde falla)?
De todas formas, prueba declarando las variables que te harán falta para dibujar (vx, vy, base...) al principio del código, (pr ej "var vx:Number;")

Por Zah

BOFH

4290 de clabLevel

27 tutoriales
5 articulos

  Bastard Operators From Hell Editores

Zaragoza, España

firefox
Citar            
MensajeEscrito el 23 May 2006 05:25 pm
Ok, he declarado ya todas las variables que tenia que declarar al principio, sigue sin funcionar pero era de esperar.

El problema está concretamente en la funcion "recibir.onLoad = funcion(exito)" dentro de ella llamo asigno valores a unas variables entre ellas v, inivx, inivy, etc.. pero estas variables se vuelven ¿locales? pues el resto del codigo no las ve y por lo tanto no dibuja nada ni calcula nada.

Respecto al tema de los traces, no comprendo como va, porque yo voy poniendo trace(v) por ejemplo y no me escribe nada en la salida... por eso no he puesto traces.

Gracias.

Por orixas

3 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 23 May 2006 06:38 pm
A ver... el único problema que hay es que, en la funcion que se crea para recibir los datos "recibir.onLoad = function(exit)" se generan unas variables en mi caso solo me interesan inivx, inivy, inievx i inievy, solo quiero poder decirle al programa que pueda leer estas variables desde cualquier parte del codigo ActionScript!! Eso no es tan dificil no? pues bien he intentado las posibles maneras _global.inivx o _root.inivx y no lo consigo de ninguna de las dos, aunqeu en el codigo que os muestro dentro de la funcion se hacen muchas mas cosas en realidad solo quiero que esas cuatro variables las pueda leer desde cualquier lugar... eso debe ser algo rutinario no?? vamos una variable global, pero no lo consigo de ninguna de las maneras!!

Por orixas

3 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 24 May 2006 07:50 am
Coloca al principio las declaraciones de las variables y estas seran leidas desde cualquier lugar del código.
Otra cosa es que luego declares variables locales con el mismo nombre ( poniendo var) ya que solo funcionaran dentro de su ámbito.

Por otra parte, la "secuencia" de ordenes que pones en el listado, imagino que creyendo que se ejecutaran así, no sirve.
Coloca todas las ordenes de la secuencia seguidas y al final las 3 funciones recibir , modulo y dirección.
Ahora deberías ver lo que pasa. ^^
El tinglado de control de dibujo se debe de hacer como respuesta a un on Load Complete posiblemente montado como función de respuesta a ese evento.
El programa pasa de la carga.......esta por un lado cargando y A LA VEZ ejecutando la secuencia de ordenes sin actualizar los datos todavia.

Por Teseo

SWAT Team

1780 de clabLevel

14 tutoriales

Genero:Masculino   SWAT

firefox
Citar            
MensajeEscrito el 24 May 2006 10:44 am
Muchas Mucahs gracias Teseo... el consejo que me proporcionabas no me ha servido para resolverlo pero si para orientarme!!

La cuestion es que el dichoso sendAndLoad tardaba lo suyo en resolver, y no se porque no le daba la gana de enviarme las variables al resto del codigo por muy ordenado y meticuloso que fuera en el codigo y por muy globales que fueran las variables.

Para todos aquellos que os esteis peleando con sendAndLoad y todo esto aqui va una solución un tanto pachanguera pero la UNICA que me ha funcionado
Resolucion:
Nada mas sencillo que en un primer fotograma hacer un Actionscript que te haga la llamada y la carga de las variables en este caso lo tengo declarado asi:

Código :

//Variables
var entvx:Number; var entvy:Number;
var entevx:Number; var entevy:Number;
var today_date:Date = new Date();
envio = new LoadVars();
recibir = new LoadVars();

// Fecha de hoy para enviar a la BD
if ((today_date.getMonth()+1)<10) {
   var aux:String = ("0"+(today_date.getMonth()+1));
} else {
   var aux:Number = (today_date.getMonth()+1);
}

if (today_date.getDate()<10) {
   var aux2:String = (aux+"-0"+today_date.getDate());
} else {
   var aux2:String = (aux+"-"+today_date.getDate());
}

var pdata:String = (today_date.getFullYear()+"-"+aux2); // fecha actual
var horaUTC:Number = today_date.getUTCHours(); // hora UTC

// Enviamos i Recibimos los datos del servidor de la BD
envio.dia=pdata;
envio.hora=horaUTC;
envio.action="vent";
envio.sendAndLoad("./FLASH_MYSQL/consulta.php", recibir, "POST");

recibir.onLoad = function(exito) {
   if (exito) {
      switch (this.opcion) {
      case "0" :
         mensaje_txt = "No hay predicción";
         break;
      case "1" :
         mensaje_txt = "Datos correctos";
           entvx = Number(this.vx);
         entvy = Number(this.vy);
         entevx = Number(this.errorvx);
         entevy = Number(this.errorvy);
         mdata = this.pdata;
         break;
      default :
         mensaje_txt = "no hay conexión";
         break;
      };
   } else {
      mensaje_txt = "Error en el Script";
   };
};

y en el siguiente fotograma (al que pasa cuando el ya ha resuelto la llamada sendAndLoad) se pone un script que te calcule todo lo que quieras con tus variables... nada mas sencillo no? ¡pues esto me ha llevado un buen monton de dolores de cabeza!

Gracias por vuestras aportaciones!! ;-)

Por orixas

3 de clabLevel



Genero:Masculino  

firefox

 

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