Hola. Estoy haciendo una version "liviana" de mi juego en el cual nivel a nivel va cargando la imagen desde la web. Lo tengo asi:
switch (global.level) {
case 01:
global.spr_impar = sprite_add("https://URL/spr_level02_0.png", 0, false, false, 0, 0);
with obj_levelbase
sprite_index = spr_level01
break;
case 02:
global.spr_par = sprite_add("https://URL/spr_level03_0.png", 0, false, false, 0, 0);
with obj_levelbase
sprite_index = global.spr_impar
break;
case 03:
global.spr_impar = sprite_add("https://URL/spr_level04_0.png", 0, false, false, 0, 0);
with obj_levelbase
sprite_index = global.spr_par
break;
case 04:
global.spr_par = sprite_add("https://URL/spr_level05_0.png", 0, false, false, 0, 0);
with obj_levelbase
sprite_index = global.spr_impar
break;
case 05:
with obj_levelbase
sprite_index = global.spr_par
break;
}
Hasta acá todo bien, anda excelente. El problema es cómo guardar los global.spr_par y global.spr_impar ? Ya que son imágenes y si las guardo en un .ini no creo que funcionen.
¿A qué te refieres con "guardar"? los global.spr_par y global.spr_impar son referencias a sprites, números que los identifican pero no tienen ninguna otra información sobre la imagen. Si guardas estas variables en un ini lo que estás guardando son números y no hay manera de regenerar luego un sprite en base a un número. Si lo que pretendes es disponer de ellos en una nueva ejecución del juego, tendrás que volver a crearlos desde la URL. Si lo que quieres es guardar los sprites en el equipo, usa sprite_save. En cualquier caso, los índices probablemente van a ser diferentes a los originales.
En tu post anterior mencionaste que querías agregar una imagen desde una url porque eso hacía más liviana la app. No sé si este hilo tiene que ver con eso o no, pero si es así, entonces no le veo mucho beneficio. Establecer conexión para descargar una imagen para luego guardar esa imagen en disco y que el juego la use en sesiones posteriores no me parece tan bueno. Entiendo que al principio la app va a ser más liviana, pero al final, el espacio ocupado por todo el juego juntando todos los recursos va a ser lo mismo y terminarás guardando imágenes que podrías haber agregado desde un principio al árbol de recursos y que siempre estarían disponibles sin necesidad de guardarlas manualmente (más código para un resultado final igual)
Yo vería más viable el uso de algún optimizador de imágenes. Los resultados varían según las imágenes, pero hay casos en que la reducción que se logra con esos programas es de hasta un 50% (o más, quizás) y con una pérdida de detalle mínima, prácticamente inapreciable. Como dijo Guacusio, lo que devuelve sprite_add es un índice, y ese índice sirve mientras el juego está cargado en memoria. Al terminar el proceso, todo eso se pierde, y en el ini sólo quedaría un número.
Por regla general, si agregas un recurso (sprite ene ste caso) a GMS en tiempo de ejecución, ese recurso es volátil. Obviamente que se puede guardar, pero si es algo que se va a usar en cada sesión del juego, a mi se me hace más práctico el agregarlo al árbol de recursos desde un principio. ¿Que va a pesar más el juego? Sí, pero si al final la diferencia son unos cuantos megas, yo no me preocuparía, pero entiendo que ya es una decisión personal.
Cita de: penumbra en Agosto 16, 2015, 05:14:25 AM
En tu post anterior mencionaste que querías agregar una imagen desde una url porque eso hacía más liviana la app. No sé si este hilo tiene que ver con eso o no, pero si es así, entonces no le veo mucho beneficio. Establecer conexión para descargar una imagen para luego guardar esa imagen en disco y que el juego la use en sesiones posteriores no me parece tan bueno. Entiendo que al principio la app va a ser más liviana, pero al final, el espacio ocupado por todo el juego juntando todos los recursos va a ser lo mismo y terminarás guardando imágenes que podrías haber agregado desde un principio al árbol de recursos y que siempre estarían disponibles sin necesidad de guardarlas manualmente (más código para un resultado final igual)
Yo vería más viable el uso de algún optimizador de imágenes. Los resultados varían según las imágenes, pero hay casos en que la reducción que se logra con esos programas es de hasta un 50% (o más, quizás) y con una pérdida de detalle mínima, prácticamente inapreciable. Como dijo Guacusio, lo que devuelve sprite_add es un índice, y ese índice sirve mientras el juego está cargado en memoria. Al terminar el proceso, todo eso se pierde, y en el ini sólo quedaría un número.
Por regla general, si agregas un recurso (sprite ene ste caso) a GMS en tiempo de ejecución, ese recurso es volátil. Obviamente que se puede guardar, pero si es algo que se va a usar en cada sesión del juego, a mi se me hace más práctico el agregarlo al árbol de recursos desde un principio. ¿Que va a pesar más el juego? Sí, pero si al final la diferencia son unos cuantos megas, yo no me preocuparía, pero entiendo que ya es una decisión personal.
El tema es así: Mi juego tiene aproximadamente 50 niveles. Tengo varios del mismo tipo. Quiero hacer "packs" con hasta 250 niveles lo cual quedaría en 60 megas, y la gente no lo bajaría por ser muy pesado. La idea es que el nivel se juegue, al pasar de nivel, el nivel anterior deje de existir y va a aparecer nuevamente bloqueado ya que es un juego de buscar objetos y no tiene sentido volverlo a jugar.
En cuanto a optimizado, lo tengo hiper optimizado mediante el tinypng.
Cita de: Guacusio en Agosto 16, 2015, 03:44:06 AM
¿A qué te refieres con "guardar"? los global.spr_par y global.spr_impar son referencias a sprites, números que los identifican pero no tienen ninguna otra información sobre la imagen. Si guardas estas variables en un ini lo que estás guardando son números y no hay manera de regenerar luego un sprite en base a un número. Si lo que pretendes es disponer de ellos en una nueva ejecución del juego, tendrás que volver a crearlos desde la URL. Si lo que quieres es guardar los sprites en el equipo, usa sprite_save. En cualquier caso, los índices probablemente van a ser diferentes a los originales.
Voy a probar eso del sprite_save a ver como funciona.
Cita de: Guacusio en Agosto 16, 2015, 03:44:06 AM
¿A qué te refieres con "guardar"? los global.spr_par y global.spr_impar son referencias a sprites, números que los identifican pero no tienen ninguna otra información sobre la imagen. Si guardas estas variables en un ini lo que estás guardando son números y no hay manera de regenerar luego un sprite en base a un número. Si lo que pretendes es disponer de ellos en una nueva ejecución del juego, tendrás que volver a crearlos desde la URL. Si lo que quieres es guardar los sprites en el equipo, usa sprite_save. En cualquier caso, los índices probablemente van a ser diferentes a los originales.
Dónde se guardan los sprite_save? Me está dando error y según chequeo tengo todo bien. Lo tengo así:
En el evento que controla los niveles (estan en el mismo room)
switch (global.level) {
case 01:
global.spr = sprite_add("https://url.png", 0, false, false, 0, 0); //carga nivel 2
with obj_levelbase
sprite_index = spr_level01 // EL NIVEL 1 VIENE DENTRO DEL JUEGO
break;
case 02:
global.spr_par = sprite_add("https://url.png", 0, false, false, 0, 0); //carga nivel 3
with obj_levelbase
sprite_index = spr_level0
break;
case 03:
global.spr_impar = sprite_add("https://url.png", 0, false, false, 0, 0); //carga nivel 4
with obj_levelbase
sprite_index = spr_level0
break;
case 04:
global.spr_par = sprite_add("https://url.png", 0, false, false, 0, 0); //carga nivel 5
with obj_levelbase
sprite_index = spr_level0
break;
case 05:
with obj_levelbase
sprite_index = spr_level0
break;
}
En el evento que controla el fin del nivel (nivel completado):
if (instance_number(obj_0) == 10) and (alarm[0] < 0) and (global.click == 5) // Todos los objetos encontrados
{
alarm[0] = 1.5 * room_speed // Esta alarma activa los carteles de "you win" y los botones al finalizar
sprite_save(global.spr, 0, "spr_level0.png")
}
Teóricamente lo que estoy haciendo es, cargar un nivel cuando arranca y guardaría el sprite llamandolo "spr_level0.png" al completar el nivel. No veo en dónde está el fallo.
Y acá el error:
(http://puu.sh/jEbuV/6c173966ed.png)
Como el sistema de archivos de GMS se basa en modo sandbox, la ruta o lugar donde se guarden los recursos no es importante, quiero decir que para que un juego funcione no es necesario saber dónde queda ese lugar exactamente, porque GMS no permite que haya distintos lugares de escritura, sólo uno, y ese lugar esta definido por defecto y no es estrictamente necesario indicar la ruta cuando se quiere guardar algo.
La variable working_directory apunta a ese lugar, pero como digo, no es necesario conocer la ruta exacta.
Los errores PUSH ocurren cuando la variable carece de un valor que GMS pueda manipular o dicha variable no existe. En este caso, quieres almacenar el valor de spr_level0 en sprite_index, pero GMS no encuentra que la variable spr_level0 tenga un valor adecuado (probablemente no ha sido declarada o inicializada correctamente, o esa inicialización se realiza después y se está intentando acceder a la variable antes)