Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Silver_light en Mayo 26, 2015, 12:42:22 AM

Título: Cómo hacer que un enemigo te dé un item una sola vez
Publicado por: Silver_light en Mayo 26, 2015, 12:42:22 AM
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
Título: Re:Cómo hacer que un enemigo te dé un item una sola vez
Publicado por: Marth en Mayo 26, 2015, 02:06:58 AM
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.
Título: Re:Cómo hacer que un enemigo te dé un item una sola vez
Publicado por: Clamud en Mayo 26, 2015, 02:35:06 AM
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.
Título: Re:Cómo hacer que un enemigo te dé un item una sola vez
Publicado por: penumbra en Mayo 26, 2015, 03:20:20 AM
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.
Título: Re:Cómo hacer que un enemigo te dé un item una sola vez
Publicado por: arcangelcaos en Mayo 26, 2015, 08:27:40 AM
Tambien podrias crear un array con el nombre y true o false si a dropeado. Y comprobar cada vez que muera.
Título: Re:Cómo hacer que un enemigo te dé un item una sola vez
Publicado por: Marth en Mayo 26, 2015, 02:58:46 PM
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.
Título: Re:Cómo hacer que un enemigo te dé un item una sola vez
Publicado por: Silver_light en Mayo 26, 2015, 06:36:36 PM
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