Hola a todos, quería saber cómo hacer para que los enemigos te dropeen, hmm, te lancen un objeto una única vez y luego al volver al escenario, esté el enemigo de nuevo pero, que al matarlo, ya no suelte más items.

Pensaba en aplicar una variable global, pero claro, no sé cuánta persistencia tenga dicho tipo de variable dentro de la memoria. Puesto que si se almacenan hasta que finaliza el juego entonces, creo yo, ocuparía demasiado tener una variable global por cada enemigo dentro del juego.

Cuál sería la forma mas optima? :D

Pues se me ocurre esto:
Haz que el room sea persistente y que los enemigos al morir, que tendrán un booleano llamado 'o' en true en vez de destruirse se convierta en objetos Cadaver, aparte de que en caso de que 'o' sea true, entrega un objeto y pasa 'o' a false. Luego al volver al room, en el evento room_start de los cadáveres haces que vuelvan a la vida, y ahora al volverlos al matar, al estar 'o' en false ya no dará más objetos.

Usar una room persistente es una forma sencilla de resolver el problema, pero esa es la forma que consume más memoria, porque se guardan las variables de todas las instancias de la room persistente. Me parece que usar una variable global es la mejor opción, creo que se usan 4 bytes por cada variable numérica, entonces sólo se usa una cantidad considerable de memoria si guardas los ids de miles de enemigos. Sólo que hay que considerar un pequeño detalle; además del id, también se debe guardar la room de la que se obtuvo ese id, porque los mismos ids pueden estar en diferentes rooms.

#3 Mayo 26, 2015, 03:20:20 AM Ultima modificación: Mayo 26, 2015, 03:29:24 AM por penumbra
Cita de: Silver_light en Mayo 26, 2015, 12:42:22 AM
Pensaba en aplicar una variable global, pero claro, no sé cuánta persistencia tenga dicho tipo de variable dentro de la memoria. Puesto que si se almacenan hasta que finaliza el juego entonces, creo yo, ocuparía demasiado tener una variable global por cada enemigo dentro del juego.

Cuál sería la forma mas optima? :D

Para "gastar" 1MB de RAM en variables globales, tendrías que declarar 131`072 variables globales distintas. Quiero ver qué usuario necesita (y puede manejar) más de ciento treinta mil variables individuales en su juego. Por eso siempre he pensado que optmizar variables en GM no da ningún beneficio REAL determinante de cara al consumo de memoria. Suponiendo que el equipo donde se corra el juego tenga 1 GB de RAM (y me estoy yendo a un ejemplo muy limitado), cien mil variables de GM "desperdiciadas" (mal usadas por un programador al que no le importe la optmización) ni siquiera representarían el 0.1% de la memoria total del sistema.

Tambien podrias crear un array con el nombre y true o false si a dropeado. Y comprobar cada vez que muera.

Si te parece excesivo trabajo, se me ocurre esto, aunque no es perfecto: haz un vector de booleanos que hayan variables por cada room y cada vez que salgas de una sala el room_end ponga el booleano que le corresponda en false. si al matar a un oponente el booleano esta aun en true, dará objeto, pero al salir pasa a false y si vuelves a la sala y matas a un oponente ya no dará otro objeto.

Ah, ya. Si ese es el caso entonces creo que está bien utilizar variables globales de la forma que pensaba hacerlo.
Siempre creí que era un poco exagerado usar tantas globales pero no por lo visto.

Voy a ver cómo implemento el sistema que tengo en mente, que me pareció buena idea usar arrays.

Como fuera, gracias por las respuestas!  :D