Foros del Web » Programando para Internet » Javascript »

Arrays de objetos

Estas en el tema de Arrays de objetos en el foro de Javascript en Foros del Web. Hola, estoy realizando un sencillo juego en Canvas de html5 y intento generar unas bolas de fuego que caen. Para generarlas uso lo siguiente: Código: ...
  #1 (permalink)  
Antiguo 15/05/2012, 02:35
 
Fecha de Ingreso: mayo-2012
Mensajes: 1
Antigüedad: 12 años, 7 meses
Puntos: 0
Pregunta Arrays de objetos

Hola, estoy realizando un sencillo juego en Canvas de html5 y intento generar unas bolas de fuego que caen.

Para generarlas uso lo siguiente:

Código:
var balls = new Array();

var numberOfFireballs = 3;

var fireball = {
	speed : 100
};

for (i = 0; i < numberOfFireballs; i++) {
	balls[i] = fireball;
};
el problema es que al hacer...

Código:
for (i = 0; i < numberOfFireballs; i++) {
		if (balls[i]) {
			if (balls[i].y > canvas.height) {
				resetFire(i);
			} else {
				balls[i].y += balls[i].speed * modifier;
			}
		}
	}

var resetFire = function(i) {
	do {
		balls[i].x = 32 + (Math.random() * (canvas.width - 64));
	} while ((balls[i].x + 30) > (canvas.width - 30) && (balls[i].x) > (30))
	balls[i].y = 0;
};
me cambia el x de todos los balls[i] a la vez y no una x diferente para cada balls[i].
Y por eso las bolas que deberían aparecer en diferentes zonas de la pantalla aparecen superpuestas todas en la misma posición.

Gracias por la ayuda, espero que se entienda.
  #2 (permalink)  
Antiguo 15/05/2012, 05:54
Avatar de diamari  
Fecha de Ingreso: marzo-2012
Mensajes: 95
Antigüedad: 12 años, 8 meses
Puntos: 30
Respuesta: Arrays de objetos

Allí no esta el código completo para generarla ya que estas utilizando y x. Probando resetFire solo, si hace su trabajo. Tendrás que verificar que ese for este funcionando como supone o colocar código funcional para poder recrear el error y poder ver donde es el problema.
  #3 (permalink)  
Antiguo 15/05/2012, 05:55
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 9 meses
Puntos: 574
Respuesta: Arrays de objetos

Diria que este condicional no tien mucho sentido

if (balls[i])

balls[i]={ speed : 100 };

y eso no es un booleano, no?

O lo lee siempre como true o siempre como false con lo que no tiene sentido....

???

Código Javascript:
Ver original
  1. for (i = 0; i < numberOfFireballs; i++) {
  2.             if (balls[i].y > canvas.height) {
  3.                 resetFire(i);
  4.             } else {
  5.                 balls[i].y += balls[i].speed * modifier;
  6.             }
  7.     }
  8.  
  9.  
  10. function resetFire(i) {
  11.     do {
  12.         balls[i].x = 32 + (Math.random() * (canvas.width - 64));
  13.     } while ((balls[i].x + 30) > (canvas.width - 30)
  14.                     && (balls[i].x) > (30));
  15.     balls[i].y = 0;
  16. }

Con el codigo completo te podriamos ayudar con mas seguirdad....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #4 (permalink)  
Antiguo 16/05/2012, 18:59
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 7 meses
Puntos: 1485
Respuesta: Arrays de objetos

buenas,
Cita:
Diria que este condicional no tien mucho sentido

if (balls[i])

balls[i]={ speed : 100 };

y eso no es un booleano, no?
cito el texto porque sospecho que hay una especie de duda. en este caso particular todos generan true porque un objeto convertido a boolean siempre devuelve true. no obstante, en algo tienes razón... la condición carece de sentido ya que no existe la posibilidad de un false, asumiendo que siempre se itera por la longitud del array y que todos los elementos sean un objeto.

el problema surge en esta línea.
Código:
for (i = 0; i < numberOfFireballs; i++) {
	balls[i] = fireball;
};
específicamente porque le estás asignando el mismo objeto a todos los elementos del array. es decir, cada elemento es una referencia de las demás. en javascript, los objetos no se asignan como copia sino como referencia. de modo que múltiples contenedores accesan al mismo objeto y por ende cuando uno altera el estado en los demás se refleja.

Código:
var obj = {prop: "value"};
var ref = obj;
ref.prop = 'modified';
alert(obj.prop); // modified;
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Etiquetas: arrays
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 11:02.