Comunidad de diseño web y desarrollo en internet online

Posición Aleatoria en AS3

Citar            
MensajeEscrito el 10 Ene 2011 01:05 am
Mi duda es la siguiente, mi intención es crear un "juego" en el cual aparezcan unos objetos en lugares concretos cómo podria ser:

posición x,y = (20, 20)
posición2 x,y= (20, 40)
posición3 x,y =(20, 60)
posición4 x,y =(40, 20)
posición5 x,y = (40, 40)
posición 6 x,y =(40,60)

Pero de forma aleatoria, que al iniciar el juego los objetos estén en uno de esas posiciones, pero que en cada inicio del juego la posición de los 6 objetos varíe. És decir, en la posición 1 quizás primero hay una manzana y en la siguiente "partida" hay un melocotón. (Cómo por ejemplo el juego de hacer parejas)

Los objetos son clips dinámicos guardados en una tabla (Array) llamada Animales.

Alguna idea?


Muchas gracias a quien se moleste en leerlo y gracias al que a demás me pueda ayudar!

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

safari
Citar            
MensajeEscrito el 10 Ene 2011 01:23 am
no se si hay un metodo mejor, pero funciona :wink:

Código ActionScript :

var posiciones:Array = new Array(20, 40, 60);

function randomPos(){
   var myNum:int = Math.floor(Math.random()*3);
   trace(posiciones[myNum]);
}

randomPos()
randomPos()
randomPos()


Saludos

Por theblabla

10 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Ene 2011 06:52 am
Gracias, estoy trabajando en ello. Cuando termine a ver que sale!

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

safari
Citar            
MensajeEscrito el 12 Ene 2011 07:44 am
Personalmente crearía un array con las posiciones y lo desordenaría. Luego es tomar de uno en uno el array

Código ActionScript :

//creamos el array
var posiciones:Array=new Array({x:20,y:20},{x:20,y:40},{x:20,y:60},{x:40,y:20},{x:40,y:40},{x:40,y:60})
//Así, p.e.
trace(posiciones[0].x) //saldría 20
trace(posiciones[4].y) //saldría 40
//para ver el array
for (var i:int=0;i<posiciones.length;i++){
    trace(i+"="+posiciones[i].x+","+posiciones[i].y)
}
//desordenamos el Array
for (var i:int=0;i<posiciones.length;i++){
      var j:int=Math.floor(Math.random(posiciones.length))
      var xx:int=posiciones[j].x
      var yy:int=posiciones[j].y
      posiciones[j].x=posiciones[i].x
      posiciones[j].y=posiciones[i].y
      posiciones[i].x=xx
      posiciones[i].y=yy
}
//Ahora el array ha cambiado
for (var i:int=0;i<posiciones.length;i++){
    trace(i+"="+posiciones[i].x+","+posiciones[i].y)
}

NOTA:Siempre que tengamos unos números que queremos asignar a determinados objetos sin que se repitan es útil tener un array y desordenarlo. En esta ocasión he usado un "array de objetos", con lo que el "desorden es algo más complicado

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Ene 2011 08:28 pm
Chicos,
Aquí estoy intentando encontrar la manera. El tema esta en que he creado cuatro Tablas (Array), en las que guardo:
Animales: Clips dinámicos, son los objetos que quiero colocar aleatoriamente.
PosicionsX: puntos X donde se situaran dichos objetos.
PosicionsY: puntos Y donde se situaran dichos objetos.
Ocupats: Tabla donde quiero que quede constancia de si se ha utilizado o no, una posición concreta de cada tabla.
Van relacionados con la variable n, donde genero números aleatorios de 0 a cont, siendo cont una variable que guarda un valor entrado por el usuario. Inicialmente son valores false, cuando utilice, por ejemplo, la posición 4 de cada tabla, quiero que en la posición 4 de Ocupats, cambe su estado false por true.

Esta era la idea, pero al mezclar http://foros.cristalab.com/posting.php?mode=reply&t=94049un while y un for, he cometido algun error, se que algo que he puesto dentro debe ir fuera, y al revés.

Añado el código, a ver si alguien tiene alguna idea.

Gracias!

Código :

stop();

var posicionsX:Array=new Array(60,60,60,60,210,210,210,210,360,360,360,360,510,510,510,510);
var posicionsY:Array=new Array(60,183,306,430,60,183,306,430,60,183,306,430,60,183,306,430);
var ocupat:Array=new Array(false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false);
var i:uint;

var animals:Array=new Array  ;

animals[0]=new balena();
animals[1]=new burro();
animals[2]=new cangur();
animals[3]=new cavall();
animals[4]=new conill();
animals[5]=new dofi();
animals[6]=new elefant();
animals[7]=new gallina();
animals[8]=new gat();
animals[9]=new granota();
animals[10]=new mussol();
animals[11]=new os();
animals[12]=new peix();
animals[13]=new ratpanat();
animals[14]=new tortuga();
animals[15]=new serp();


var n:uint;

for (i=0; i<cont; i++) {
   stage.addChild(animals[i]);
   n=Math.round(Math.random()*cont);
   while (ocupat[i]==false) {
      n=Math.round(Math.random()*cont);
      ocupat[n]=true;
      //animals[i].x=posicionsX[n];
//      animals[i].y=posicionsY[n];
   }
   animals[i].x=posicionsX[n];
   animals[i].y=posicionsY[n];
}

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

safari
Citar            
MensajeEscrito el 13 Ene 2011 07:33 am
ikaH ¿leiste mi post?, sólo quedaba

Código ActionScript :

for (i=0;i<posiciones.length;i++){
animals[i].x=posiciones[i].x
animals[i].y=posiciones[i].y
}

NOTA:NUNCA pongáis un Math.round -redondeo-, usar Math.floor -truncar- con una función random

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 13 Ene 2011 10:06 am
Eliseo2, si lo leí, acabo de probar y creo que funciona perfecto! Gracias! Por cierto, me explicas que és .length?!

Gràcias!

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

safari
Citar            
MensajeEscrito el 13 Ene 2011 10:30 am
Es el tamaño del array. Ver en propiedades del Array
Por eso es útil, a la hora de hallar un número entre 0 y la longitud del array -1 escribir

Código ActionScript :

var index:int=Math.floor(miArray.length*Math.random()) //un número entre 0 y miArray.length-1
trace(miArray[index])


Lo que sí me parece importante es que entiendas que, si queremos asignar una serie de valores que tenemos en un array a una serie de objetos de modo que no se repita ninguno, en lugar de guardar en un array los elementos ya cogidos a un array, podemos
1.-Desordenar el array tal y como indiqué en el post
2.-Escogemos al azar un elemento del Array y lo eliminamos con el método "splice" del Array (ésta segunda opción tiene el "defecto" de que perdemos los valores del Array, pero si no lo vamos a necesitar más, es perfectamente correcto)

, al asignar unos números a una variable, en lugar de guardar en un array los datos asignados

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 16 Ene 2011 10:05 pm
Gracias, lo he conseguido :)!

No pensé que nadie se fuera a molestar en contestar y mucho menos, tan rápido!

Mil gracias!

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

safari
Citar            
MensajeEscrito el 26 Mar 2012 09:52 pm
Reviviendo post :P, revisando el codigo de Eliseo, me daba dos errores, el primero lo solucione cambiando esta linea

Código ActionScript :

var j:int=Math.floor(Math.random(posiciones.length))
tengo entendido que el Math.random(), no acepta valores asi que lo deje asi

Código ActionScript :

var j:int=Math.floor(Math.random()*posiciones.length)
y el segundo tiene que ver con la variable indice (i) que se usa en los for, no estoy seguro si es por que en cada uno de los for se declara la variable, asi que solo le cambie el nombre a la variable, funciona, pero me gustaria saber si es una manera ortodoxa de hacerlo.

Por Finvara

807 de clabLevel



 

EL reino de los duendes...

chrome

 

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