Código
// En este momento Images es 30, // Barriles es igual no porque hayan 30 sino para evitar que... // tengan el mismo depth que las imágenes anteriores: Barriles = 30; // Para saber qué depth asignar cuando se debe insertar un barril: LdeProfundidadesDisponibles = []; do { Barriles++; LdeProfundidadesDisponibles.push(Barriles); } while (LdeProfundidadesDisponibles.length < BarrilesRate); Barriles = 30;
BarrilesRate es básicamente la máxima cantidad que puede haber.
Creo que esto también está bien:
Código
function AddBarriles () { BarrilesTurn = BarrilesTurn+BarrilesRate; while (LdeProfundidadesDisponibles.length > 0 && BarrilesTurn >= 100) { BarrilesTurn = BarrilesTurn-100; Barriles++; Name = "Barril"+LdeProfundidadesDisponibles[0]; trace("LdeProfundidadesDisponibles[0]: "+LdeProfundidadesDisponibles[0]); trace("se agregó el barril "+Name); attachMovie("sDKBarril", Name, LdeProfundidadesDisponibles[0]); setProperty (Name, _x, Math.random()*800); setProperty (Name, _y, -50); set(Name+".SpeedX", Math.random()*MinBarrilSpeed*(random(2)*2-1)); set(Name+".SpeedY", Math.random()*MinBarrilSpeed+MinBarrilSpeed); LdeProfundidadesDisponibles[0] = LdeProfundidadesDisponibles[LdeProfundidadesDisponibles.length-1]; LdeProfundidadesDisponibles.pop(); trace("LdeProfundidadesDisponibles[0]: "+LdeProfundidadesDisponibles[0]); } }
BarrilesTurn determina si es momento de agregar un barril.
Cuando se debe agregar:
- Aumenta la cantidad de barriles.
- Al barril que se agregará se lo llama BarrilX donde X es la 1er profundidad disponible, guardada en el array LdeProfundidadesDisponibles. Y tiene esa profundidad.
- Se le asigna posición X, Y y velocidades en esos ejes.
- La 1er profundidad disponible es sustuída por la última.
- Se elimina la última profundidad disponible.
Probablemente sería mejor eliminar la 1era y que las demás se corran ordenadas hacia atrás (la de posición 1 pasa a la 0, la 2 a la 1, etc), pero no me di cuenta de intentarlo, y no creo que sea el problema.
El problema creo que está acá:
Código
function MoveBarriles () { BarrilaMover = Barriles; while (BarrilaMover > 30) { Name = "Barril"+BarrilaMover; setProperty (Name, _x, getProperty(Name, _x)+eval(Name+".SpeedX")); trace("se movió el barril "+Name); if (getProperty(Name, _x) < -50 or getProperty(Name, _x) > 850) { removeMovieClip ("Barril"+BarrilaMover); trace("se quitó el barril "+Name); LdeProfundidadesDisponibles.push(BarrilaMover); Barriles--; } else { setProperty (Name, _y, getProperty(Name, _y)+eval(Name+".SpeedY")); if (getProperty(Name, _y) > 650) { removeMovieClip ("Barril"+BarrilaMover); trace("se quitó el barril "+Name); LdeProfundidadesDisponibles.push(BarrilaMover); Barriles--; } else { // Esto no viene al caso. } } BarrilaMover--; } }
Los muevo desde el último al 1ero, no me gusta y no recuerdo por qué, pero no creo que el problema sea eso.
Si un barril sale de la pantalla:
- Se remueve.
- Su profundidad se agrega al final de las profundidades disponibles.
- Se reduce la cantidad de barriles.
Supongamos que se mueve el barril 3 y no se sale de la pantalla.
Luego se mueve el 2, se sale, se ejecuta el código correspondiente, ahora hay 2 barriles.
Luego se mueve el 1, y no se sale de la pantalla.
El proceso se repite, hay 2 barriles así que movemos el 2, pero no existe. Y el 3ero no lo movemos porque la variable dice que hay 2. He ahí el problema. Se debe mover el 1 y el 3, en ese caso, el 2 fue eliminado. Si se hubiera eliminado el 1 solamente o también, el problema sería similar, tenemos que mover el barril llamado Barril3, pero como sólo hay 1 va a mover Barril1 solamente.
¿Cómo puedo resolver esto?
Antes no removía los barriles. Quizá no debería modificar la variable Barriles, y en vez de remover los que salgan... volverles a poner posición y velocidad como si fuese uno nuevo... Vaya truchada. Pero bueno, pruebo eso. Avisen si se les ocurre algo mejor.
Edit: Me funcionó así:
Código
// ///////////////////////////////////////////// // ////////////////// Pisos ////////////////// // ///////////////////////////////////////////// Pisos = 0; do { Piso = "Piso"+Pisos; attachMovie("sDKPiso", Piso, Pisos); setProperty (Piso, _x, Pisos*16+16); setProperty (Piso, _y, 568-Pisos*18); PartesDelPiso = 0; PartesRequeridas = 26-Pisos/2; do { Parte = "Parte"+PartesDelPiso; // trace("Insertando "+Parte+" en "+Piso+" con depth "+PartesDelPiso); eval(Piso).attachMovie("sDKPisoParte", Parte, PartesDelPiso); RutaDeParte = Piso+"."+Parte; setProperty (RutaDeParte, _x, 32*PartesDelPiso); setProperty (RutaDeParte, _y, 0); PartesDelPiso++; } while (PartesDelPiso <= PartesRequeridas); Pisos++; } while (Pisos < 30); Images = Pisos; // ///////////////////////////////////////////// // ////////////////// Mario ////////////////// // ///////////////////////////////////////////// attachMovie("sDKMario", "Player", Images); // ///////////////////////////////////////////// // //////////////// Barriles ///////////////// // ///////////////////////////////////////////// // Cuando llega a 100 puede que se inserte un barril: BarrilesTurn = 0; // Determina qué tan rápido aumenta BarrilesTurn y... // la máxima cantidad de bariiles: BarrilesRate = 1; MinBarrilSpeed = 0.1; // Para saber qué depth asignar cuando se debe insertar un barril: LdeProfundidadesDisponibles = []; do { LdeProfundidadesDisponibles.push(LdeProfundidadesDisponibles.length+1); } while (LdeProfundidadesDisponibles.length < BarrilesRate); function AddBarriles () { BarrilesTurn = BarrilesTurn+BarrilesRate; while (LdeProfundidadesDisponibles.length > 0 && BarrilesTurn >= 100) { BarrilesTurn = BarrilesTurn-100; Name = "Barril"+LdeProfundidadesDisponibles[0]; attachMovie("sDKBarril", Name, LdeProfundidadesDisponibles[0]+Images); setProperty (Name, _x, Math.random()*800); setProperty (Name, _y, -50); set(Name+".SpeedX", Math.random()*MinBarrilSpeed*(random(2)*2-1)); set(Name+".SpeedY", Math.random()*MinBarrilSpeed+MinBarrilSpeed); // Borra el 1er elemento de la lista: LdeProfundidadesDisponibles.shift(); } } function MoveBarriles () { BarrilaMover = 0; while (BarrilaMover < BarrilesRate) { BarrilaMover++; Name = "Barril"+BarrilaMover; setProperty (Name, _x, getProperty(Name, _x)+eval(Name+".SpeedX")); if (getProperty(Name, _x) < -50 or getProperty(Name, _x) > 850) { removeMovieClip ("Barril"+BarrilaMover); LdeProfundidadesDisponibles.push(BarrilaMover); } else { setProperty (Name, _y, getProperty(Name, _y)+eval(Name+".SpeedY")); if (getProperty(Name, _y) > 650) { removeMovieClip ("Barril"+BarrilaMover); LdeProfundidadesDisponibles.push(BarrilaMover); } else { // No viene al caso; } } } }
Si saben cómo mejorarlo, digan.





Autor



En línea
