Comunidad de diseño web y desarrollo en internet online

Cambiar mediante un formulario en flash variables de un AS

Citar            
MensajeEscrito el 15 May 2007 12:14 am
Hola a todos, antes de nada y dado que esta es mi primera intervención en el foro,
enhorabuena y gracias por la labor que hacéis. Tengo que decir que soy novato
en esto de Flash y ActionScript, aunque sí que tengo alguna idea de Java, cosa
que almenos me ha ayuadado mucho en la compresión del codigo AS. En fin,
que llevo poco tiempo con esto y aun no se muy bien como funciona todo.
No me extiendo más y voy al grano:
Estoy intentado realizar una aplicación en Flash que dada la matriz
de adycecias de un grafo me calcule el camino más corto desde un vertice
al resto. A este problema da solución el algoritmo de Dijkstra, el cual
ya está implementado en una clase que he creado en un .AS, y en mi
pelicula fash, he insertado en el primer fotograma clave
el siguente código:

Código :

import  Dijkstra
//El grafo que yo tendré que implementar tendrá no menos de 150 vertices, esto es de prueba
f0 = new Array(0, 1, 1000000, 1000000, 100, 100,7);
f1 = new Array(15, 0, 1, 1000000, 1000000, 1000000,1000000);
f2 = new Array(1000000, 1000000, 0, 1, 1000000, 1000000,4);
f3 = new Array(1000000, 2, 1000000, 0, 1, 1000000);
f4 = new Array(1000000, 1000000, 10, 1000000, 0, 1,7);
f5 = new Array(1000000, 1000000, 17, 20, 1000000, 0,1);
f6 = new Array(1000000,10000000,22,333,4,5,0);
 
 ourMap = new Array(f0,f1,f2,f3,f4,f5);
 
 var dijkstra = new Dijkstra(ourMap, 0, 1000000);
 dijkstra.findShortestPath();



en el .AS donde tengo la clase Dijkstra que ha sido importada
tengo, ademas de todo el algortimo, la siguiente función:

Código :

private function getResults():Void {
     var ourShortestPath = new Array();
          for (var i = 0; i < this.numberOfNodes; i++) {
               ourShortestPath[i] = new Array();
               var endNode = null;
               var currNode = i;
               ourShortestPath[i].push(i);
               while(endNode != this.startNode) {
                    ourShortestPath[i].push(this.previousNode[currNode]);
                    endNode = this.previousNode[currNode];
                    currNode = this.previousNode[currNode];
               }
               ourShortestPath[i].reverse();
               trace("---------------------------------------");
               trace("The shortest distance from the startNode: "+this.startNode+
                     ", to node "+i+": is -> "+this.distance[i]);
               trace("The shortest path from the startNode: "+this.startNode+
                     ", to node "+i+": is -> "+ourShortestPath[i]);
               trace("---------------------------------------");
          }




Esto funciona a la perfección, me devuelve por la salida, la distancia
(mas corta) entre el nodo origen y el nodo actual (el 6).

Hasta aquí bien, pero de momento no hay nada de interfaz, entonces, ahora
lo que pretendo es crear una interfaz que, mediante un forrmulario, me
permita variar el punto de destino, es decir, la i que da valor a currNode.
¿es esto posible? permitir al usuario cambiar el actionscript(supongo que si)
y la salida, ¿podría mostrarse en una caja de texto dinámico incluida
en la interfaz?

Con que alguien me orientara sobre eso me conformaría, creo que ya podría
averiguar como hacer las demás cosas que me gustaría hacer. Como poder cambiar
los pesos de las adyacencias, variar el vertice origen también, y ya el sueño
sería poder plasmar el grafo en otra pelicula de manera que los vertices
sean objetos que por ejemplo cambien su color si forman parte del
camino más corto.(esto como digo sería pa'nota, me gustaría hacerlo por aprender
pero no creo que tenga tiempo antes de la entrega de este "trabajito".

Perdonad si me extendí mucho. Puedan o no ayudarme...gracias, ya me ayudásteis.

Por Noja33

21 de clabLevel



Genero:Masculino  

Sevilla

firefox
Citar            
MensajeEscrito el 15 May 2007 01:13 pm
Mira, lo que necesitas es, dependiendo de lo que quieras capturar y cuantos datos quieras capturar, pero en general lo que vas a necesitar es poner el "formulario" en el clip que necesitas, osea irte a los componentes y ahí poner textfields para poder hacer la captura de datos luego para saber que campo es necesitas ponerle nombres de instancia a cada uno de ellos... luego para obtener su valor pones un boton y en el movie clip principal(o en el boton) pones un codigo como este:

Código :

   pmyButton.onPress = fnClick();
   //Donde con onPress le indicas que va a mandar llamar a esa funcion (fnClick)
   function fnClick()
   {
      strPrimerPunto = txtPrimerValor.text;
      //asignas el valor a una variable
      // ... y así con todos los demás
      fnFuncionCalculaDistancias(strPrimerPunto, strSegundoPunto, ... , strUltimoPunto);      
      //Por medio de esta manera mandas llamar a la funcion con la que calculas las distancias
   }


Y pues con eso interactuan los componentes con el actionscript.

Espero te sirva, pero en caso de necesitar algo mas, puedes postear aquí mismo.
Saludos.

Por zelgadiss01

87 de clabLevel



 

The Silent Hills

msie
Citar            
MensajeEscrito el 15 May 2007 06:17 pm
A ver, gracias por contestar, pero lo he intentado de mil maneras y tras unas horas aquí...no consigo lo que quiero.
Lo que tenía:
Un AS con el código del Algoritmo
Un FLA , con una única capa, en cuyo primer fotograma tenía el código que mencioné arriba.
Ahora tengo:
El mismo FLA con tres capas, la que ya tenía, más una en la que he puesto un fondo y otra en la que he insertado, de momento dos TextImput, etiquetados con origen y destino y sus correspondientes labels y un boton [Calcular]

Tal como está, nada más ejecutar la película se ejecuta, evidentemente, el código existente el primer keyframe y se muestra la ventana de salida con el siguiente mensaje:

---------------------------------------
---------------------------------------
The shortest distance from the startNode: 0, to node 6: is -> 6
The shortest path from the startNode: 0, to node 6: is -> 0,1,2,6
---------------------------------------

Mis preguntas:

¿Ese código que está ahí, hay que moverlo de sitio? Pues no quiero que eso ocurra, solo quiero que ocurra
cuando yo pulse calcular (Lo meto en calcular todo??)
¿el import Dijkstra, habría que ponelro, no?

Luego a ver este código:

[code]pmyButton.onPress = fnClick();////SI ESTE CODIGO VA EN EL BOTÓN, TAMBIEN SE PONE ASÍ?
//Donde con onPress le indicas que va a mandar llamar a esa funcion (fnClick)
function fnClick()
{
strPrimerPunto = txtPrimerValor.text;//
//asignas el valor a una variable
// ... y así con todos los demás
fnFuncionCalculaDistancias(strPrimerPunto, strSegundoPunto, ... , strUltimoPunto);
//Por medio de esta manera mandas llamar a la funcion con la que calculas las distancias
}[/codde]

Lo que pretendo de momento, solo es cambiar el código necesario para que yo pueda meter un origen ( menos importante)
y un destino (muy importante) y me devuelva un mensaje del estilo del que me da actualmente, pero
en otra caja de texto a ser posible.

No se si me lo has explicado obviando conocimentos mios,si es así...ya ves que carezco de ellos.
Si puedes explicarmelo mejor o puedes remitirme a algun tutorial que recuerdes dnd se explica esto...
te lo agradecería mucho.

Mil gracias.

Saludos.

Por Noja33

21 de clabLevel



Genero:Masculino  

Sevilla

firefox
Citar            
MensajeEscrito el 15 May 2007 10:12 pm
si el codigo está dentro del boton tienes que hacer algo como esto

Código :

on(click)
{
   trace(this);
}


el import Dijkstra si lo usas, lo tienes que importar...
y pues no se como funcione esa funcion... pero igual pon mas detalles y te podremos ayudar.
Saludos.

Por zelgadiss01

87 de clabLevel



 

The Silent Hills

firefox
Citar            
MensajeEscrito el 17 May 2007 06:28 pm
Hola, gracias eh! No constesto proque estoy intentando dar solución a mi problema, si no la encuentro, trataré de dar esos detalles mas claros y, si la encuentro, escribiré igualmente para decir, cómo lo hice.
Saludos!

Por Noja33

21 de clabLevel



Genero:Masculino  

Sevilla

firefox
Citar            
MensajeEscrito el 19 May 2007 12:26 pm
Hola, no consigo lo que quiero, esto es un tabajo que he de entregar en la escuela y decidí hacerlo con flash y actionscript para intentar aprender, sin quitar tiempo a mis estudios.

Bueno, pongo lo que tengo y luego diré lo que estoy intentando:

Un ActionScript con el siguiente código (Dijkstra):

Código :

class Dijkstra {   
 
 private var visited:Array;
 private var distance:Array;
 private var previousNode:Array;
 private var startNode:Number;
 private var map:Array;
 private var infiniteDistance:Number;
 private var numberOfNodes:Number;
 private var bestPath:Number;
 private var nodesLeft:Array;
 
    
 public function Dijkstra(ourMap:Array, startNode:Number, infiniteD:Number) {
     this.infiniteDistance = infiniteD;
     this.startNode = startNode;
     this.distance = new Array();
     this.previousNode = new Array();
     this.visited = new Array();
     this.map = ourMap;
     this.numberOfNodes = this.map[0].length;
     this.bestPath = 0;
     this.nodesLeft = new Array();
 }
 
 private function findShortestPath():Void {
     for (var i = 0; i < this.numberOfNodes; i++) {
          if (i == this.startNode) {
               this.visited[i] = 1;
               this.distance[i] = 0;
          }
          else {
               this.visited[i] = 0;
               this.distance[i] = this.map[this.startNode][i];
          }
          this.previousNode[i] = 0;
     }   
     while(this.somethingLeft(this.visited)) {
          this.nodesLeft = this.nodesNotVisited(this.visited);
          this.bestPath = this.findBestPath(this.distance, this.nodesLeft);
          this.updateDistanceAndPrevious(this.bestPath);
          this.visited[this.bestPath] = 1;
     }   
     this.getResults();
 }
 
 private function somethingLeft(ourVisited:Array):Boolean {
     for (var i = 0; i < this.numberOfNodes; i++) {
          if (!(ourVisited[i])) {
               return true;
          }
     }
     return false;
 }
 
 private function nodesNotVisited(ourVisited:Array):Array {
     var selectedArray = new Array();
     for (var i = 0; i < this.numberOfNodes; i++) {
          if (!(ourVisited[i])) {
               selectedArray.push(i);
          }
     }
     return selectedArray;
 }
 
 private function findBestPath(ourDistance:Array, ourNodesLeft:Array):Number {
     var bestPath = this.infiniteDistance;
     var bestNode = 0;
     for (var i = 0; i < ourNodesLeft.length; i++) {
          if (ourDistance[ourNodesLeft[i]] < bestPath) {
               bestPath = ourDistance[ourNodesLeft[i]];
               bestNode = ourNodesLeft[i];
          }
     }
     return bestNode;
 }
 
 private function updateDistanceAndPrevious(ourBestPath:Number):Void {
     for (var i = 0; i < this.numberOfNodes; i++) {
          if (!(this.map[ourBestPath][i] == this.infiniteDistance) || (this.map[ourBestPath][i] == 0)) {
               if ((this.distance[ourBestPath] + this.map[ourBestPath][i]) < this.distance[i]) {
                    this.distance[i] = this.distance[ourBestPath] + this.map[ourBestPath][i];
                    this.previousNode[i] = ourBestPath;
               }
          }
     }
 }
 
 private function getResults():Void {
     var ourShortestPath = new Array();
          for (var i = 0; i < this.numberOfNodes; i++) {
               ourShortestPath[i] = new Array();
               var endNode = null;
               var currNode = i;
               ourShortestPath[i].push(i);
               while(endNode != this.startNode) {
                    ourShortestPath[i].push(this.previousNode[currNode]);
                    endNode = this.previousNode[currNode];
                    currNode = this.previousNode[currNode];
              
           ourShortestPath[i].reverse();
               trace("---------------------------------------");
               trace("The shortest distance from the startNode: "+this.startNode+
                     ", to node "+i+": is -> "+this.distance[i]);
               trace("The shortest path from the startNode: "+this.startNode+
                     ", to node "+i+": is -> "+ourShortestPath[i]);
               trace("---------------------------------------");
          }
     }
 }
 }
           


Una pelicula .fla en cuyo primer fotograma tengo el suiguiente codigo:

Código :

import Dijkstra;
rowZero = new Array(0, 1000000, 1000000, 1000000, 5, 12);
 rowOne = new Array(15, 0, 9, 1000000, 1000000, 1000000);
 rowTwo = new Array(1000000, 1000000, 0, 5, 1000000, 1000000);
 rowThree = new Array(1000000, 2, 1000000, 0, 1000000, 1000000);
 rowFour = new Array(1000000, 1000000, 10, 1000000, 0, 4);
 rowFive = new Array(1000000, 1000000, 17, 20, 1000000, 0);
 
 ourMap = new Array(rowZero, rowOne, rowTwo, rowThree, rowFour, rowFive);
 
 var dijkstra = new Dijkstra(ourMap, 0, 1000000);
 dijkstra.findShortestPath();
           


Al ejecutar la película obtengo esto:

---------------------------------------
The shortest distance from the startNode: 0, to node 5: is -> 9
The shortest path from the startNode: 0, to node 5: is -> 0,5,4
---------------------------------------

¿Qué es lo que yo he estado intentando?

Pues crear en mi película .fla una especie de formulario mediante el cuál yo pudiees modificar el destino (en este caso el nodo 5) y a ser posible el origen (en este caso 0). Para terminar, que lo que me muestra la salida apareciese en una caja de texto, esto no lo he intentado aun, pero creo que es lo más fácil.¿no?

Bueno, tanto si pueden ayudarme como si no, muchas gracias!!

Hasta pronto:

PD: Lo he intentado, con varibles globales, cambiando los códigos de sitio, con textImput, texto dinamico...
me queda mucho que aprender.

Por Noja33

21 de clabLevel



Genero:Masculino  

Sevilla

firefox
Citar            
MensajeEscrito el 20 May 2007 06:22 am
podrias resumir en 5 lineas que es lo que quieres ??, a lo mejor pueda ayudarte

Por Inyaka

Claber

3176 de clabLevel

9 tutoriales
2 articulos

Genero:Masculino   Desarrollador de GAIA

Programador y fotógrafo

firefox
Citar            
MensajeEscrito el 20 May 2007 08:22 pm
Sí, ahí voy:

A ver, como si yo no hubiese hecho nada ok?? Lo que tengo es, un ActionScript con un código, el cuál es llamado desde mi película .fla y se le pasa una matriz de adayacencias de un grafo. Actualmete al ejecutar mi película me muestra por la salida la distancia mas corta entre el nodo inicial y el último nodo de la matriz de adyacencias, así como los vertices por los que hay que pasar. Yo lo quiero es, incluir en mi película un formulario mediante el cuál sea posible introducir el destino que yo quiera, y que operase de la misma manera.La respuesta que actualmente me da por la salida me la mostrase en una caja de texto. ( A ser posible, también sería bueno poder cambiar el origen).

Espero haberme explicado bien, muchas gracias!

Por Noja33

21 de clabLevel



Genero:Masculino  

Sevilla

firefox
Citar            
MensajeEscrito el 21 May 2007 02:22 pm
Por que no primero tratas de hacer el formulario por separado.. osea, en la parte de los componentes arrastras los componentes que necesitas(textinput) y luego los empiezas a probar de uno por uno, con traces, entonces despues y solo después de que hayas probado los componentes con un trace, importas la clase, puesto que por que por lo que he visto la clase funciona bien, lo unico que te falta es hacer la implementacion de la entrada del usuario.
entonces.. por lo pronto puedes probar viendo algo como esto:

http://www.cristalab.com/tutoriales/43/tutorial-del-componente-textinput-de-flash

Saludos.

Por zelgadiss01

87 de clabLevel



 

The Silent Hills

msie
Citar            
MensajeEscrito el 21 May 2007 06:02 pm
supongo que ya tienes la funcion de geometria analitica para ver cuanto mide una recta desde el vector x1,y1 al vector x2,y2

esto debiera estar dentro de una funcion en AS digamos

Código :

function distancia(x1,y1,x2,y2){
//funcion de matematica
return //resultado
}


ahora solo debes hacer un formulario con textInput para ingresar los datos a la funcion "distancia"
ademas esta funcion te haria ganar mucha flexibilidad y te ahorraria un monton de codigo

espero que te halla servido

Por Inyaka

Claber

3176 de clabLevel

9 tutoriales
2 articulos

Genero:Masculino   Desarrollador de GAIA

Programador y fotógrafo

firefox
Citar            
MensajeEscrito el 22 May 2007 10:54 pm
Aquí de nuevo, zelgadiss01, he hecho lo que me has sugerido, que haga primero el formulario, que funcione, ya lo he hecho, gracias. Ahora, aun no consigo enlazar eso, con el AS, ya creo que es que no entiendo realmente que hace el código en cada línea. Así, pues, si no es mucho pedir, ¿puedes decirme qué variables he de cambiar y como? He hecho varios cambios, pero no da resultados. Como ya dije, lo que de verdad me importa es cambiar el destino, cambiar el origen sería un "extra".
Ese código de Dijkstra, no es mío, así pues, estoy haciendo un código propio en java, que yo entienda perfectamente,para luego "traducirlo" a actionscript y proceder. Otra cosa que he buscado es si es posible hacer lo que quiero hacer con el código en java directamente, pero me huele a que se complica más aun.

Por otra parte, inyaca, no tengo esa función de la que me habla y, aunque en principio debería usar dijkstra, si me cuentas un poco más, tal vez me pueda ayudar.

Gracias.

No se como (espero con vuestra ayuda) ni cuando, pero acabaré este trabajo y, espero tras hacerlo, haber aprendido algo de flash y actionscript, que era mi intención, pues lo fácil hubiera sido, como hacen la mayoría de mis compañeros, hacer la presentacioón en powerpoint y el programa en java sin interfaz grafica ni nada. Así pues, que sepais que si tardo en contestar solo es porque estoy intentándolo y avanzando en otras partes del trabajo más libianas.

Saludos

Por Noja33

21 de clabLevel



Genero:Masculino  

Sevilla

firefox
Citar            
MensajeEscrito el 22 May 2007 11:04 pm
mañana le pregunto al ingeniero de la oficina la funcion matematica y te doy el ejemplo, no lo veo complicado quisas solo buscando en la wiquipedia la encuentre

Por Inyaka

Claber

3176 de clabLevel

9 tutoriales
2 articulos

Genero:Masculino   Desarrollador de GAIA

Programador y fotógrafo

firefox
Citar            
MensajeEscrito el 23 May 2007 04:20 am
La distancia la sacás con la clase Point o simplemente con el teorema de pitágoras... cateto al cuadrado más el otro cateto al cuadrado es igual a la hipotenusa al cuadrado.

Quedaría así:

Código :

distancia = function (x1:Number, y1:Number, x2:Number, y2:Number) {
var distx = x2 - x1;
var disty = y2 - y1;
return Math.sqrt (distx * distx + disty * disty)
}

Por HernanRivas

Claber

3416 de clabLevel

26 tutoriales

 

Argentina

firefox
Citar            
MensajeEscrito el 23 May 2007 05:08 am
la función distancia esta resuelta gracias a Hernan, ahora te recomendaria qque si el array es demasiado grande para leerlo y verlo mejor uses un xml en ves de un array gigantesco

el tema hasta ahora lo veo resuelto dinos como te fue ^^

Por Inyaka

Claber

3176 de clabLevel

9 tutoriales
2 articulos

Genero:Masculino   Desarrollador de GAIA

Programador y fotógrafo

firefox
Citar            
MensajeEscrito el 23 May 2007 12:56 pm
El problema es que no se sabe si es necesario que se implemente ese algoritmo, puesto que hay ocasiones en que cuando uno está estudiando le piden que implemente cierto algoritmo para exponerlo, o para preguntarle en el examen, etc; pero.. solo puede ser ese método no otro... y si es así.. es razonable el por que pide implementar esa clase.

Ahora le pregunto al autor de este post... Es necesario que implementes ese algoritmo?, o solo necesitas encontrar la ruta mas corta en un grafo dado mediante algún algoritmo preexistente?

Saludos.

Por zelgadiss01

87 de clabLevel



 

The Silent Hills

msie
Citar            
MensajeEscrito el 23 May 2007 03:04 pm
aca hacemos cosas para que funcionen bien, de la forma mas optima posible, te ayudamos a aprender, pero...

la nota que te saques nos importa un comino XD

Por Inyaka

Claber

3176 de clabLevel

9 tutoriales
2 articulos

Genero:Masculino   Desarrollador de GAIA

Programador y fotógrafo

firefox
Citar            
MensajeEscrito el 24 May 2007 06:46 am
Tengo un .fla que manda y recibe variables de una class (AS). (Creo que es eso lo que necesitas NOJA33 ¿no?) Si alguien lo quiere se lo mando, está sacado de la ayuda del flash.

Yo también llevo unos días preguntando por algo parecido en relación con la gallería clab_gallery y finalmente después de darle varias vueltas al globo encontré la solución en mi propio ordenador.

foro...

Por danielest

2 de clabLevel



 

firefox
Citar            
MensajeEscrito el 24 May 2007 07:52 am
A ver... creo que necesitas setters y getters en la clase.

En el constructor pones esto:

Código :

 public function Dijkstra(ourMap:Array, startNode:Number, infiniteD:Number) {
     this.infiniteDistance = infiniteD;
     this.startNode = startNode;
     this.distance = new Array();
     this.previousNode = new Array();
     this.visited = new Array();
     this.map = ourMap;
     this.numberOfNodes = this.map[0].length;
     this.bestPath = 0;
     this.nodesLeft = new Array();
 }


Ahí asignas a this.map el array con los datos declarado en el fla ourMap cuando creas el objeto con
var dijkstra = new Dijkstra(ourMap, 0, 1000000);

Sencillamente necesitas una función publica en la clase con la que modificar la propiedad. Algo así:

Código :

function cambiaMap(nuevoMap:Array){
    this.map=nuevoMap;
}


A continuación te creas el formulario con los campos de texto que desees, los nombras como te de la gana y creas un nuevo array con los valores. Me explico..., ni idea del algoritmo que usas, pero no es necesario para entender el concepto.

Creas tantos campos de texto como información desees que introduzca el usuario, por ejemplo "campo1, campo2 .... campon"
Creas un boton por ejemplo "miBoton" que al ser pulsado asigne los valores introducidos a un nuevo array que pasaremos.
Y te creas una función así en la línea de tiempo:

Código :

var arrayQueVoyAPasarAlaClase=new Array();
miBoton.onPress=function(){
     /*siempre que sea el nombre del campo de texto, podría ser el nombre de variable declarado en el campo var del inspector       de propiedades*/
   arrayQueVoyAPasarAlaClase[0]=campo0.text;
 arrayQueVoyAPasarAlaClase[1]=campo1.text;
 arrayQueVoyAPasarAlaClase[2]=campo2.text;
.
.
.
.
 arrayQueVoyAPasarAlaClase[n]=campon.text;
}


Con el código anterior recoges el valor de las variables y las introduces en un array.
Ahora podemos pasar ese array a la clase para llamar al método que imlpementa el algoritmo.
Lo podríamos incluso realizar con el botón, de forma que la función del botón sería, en vez de la anterior esta:

Código :

var arrayQueVoyAPasarAlaClase=new Array();
miBoton.onPress=function(){
     /*siempre que sea el nombre del campo de texto, podría ser el nombre de variable declarado     en el campo var del inspector       de propiedades*/
   arrayQueVoyAPasarAlaClase[0]=campo0.text;
   arrayQueVoyAPasarAlaClase[1]=campo1.text;
   arrayQueVoyAPasarAlaClase[2]=campo2.text;
   .
   .
   .
   .
   arrayQueVoyAPasarAlaClase[n]=campon.text;
   dijkstra.cambiaMap(arrayQueVoyAPasarAlaClase);
   dijkstra.findShortestPath();
}




Esto te lo pongo presuponiendo que sólo necesitas modificar el array map. Necesitarías métodos setter como el primero que te pongo para cada propiedad del objeto dijstra que desees modificar.

Espero que te sirva.
:-)

Por erice

6 de clabLevel



 

firefox

 

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