Hola. Tengo un juego de buscar objetos en el cual lo que cambia en el room del nivel son las imágenes y las coordenadas. Quisiera saber si se pueden descargar las imágenes desde un link externo en android.
La idea mía es algo asi: El jugador está en el nivel 1 mientras se descarga la imagen del nivel 2, al pasar de nivel estando en el 2 se vaya cargando la 3era, asi sucesivamente con los 50 niveles. Ésto reduciría el tamaño del apk de 20mb a 10mb.
Sí, es posible. La función sprite_add() admite en el primer parámetro un URL. Si usas un URL, entonces se va a lanzar un evento asíncrono dentro del cual tienes que definir qué pasa con esa imagen descargada.
El manual da detalles del proceso
http://docs.yoyogames.com/source/dadiospice/001_advanced%20use/more%20about%20async%20events/image%20loaded%20and%20sound%20loaded%20events.html
Si las imágenes van a ser sprites, y son muchas, entonces cargar imágenes externas podría afectar el rendimiento del dibujo, sobre todo en android. Si sólo son fondos, entonces no habría tanto problema, creo.
Cita de: penumbra en Agosto 12, 2015, 10:07:04 PM
Sí, es posible. La función sprite_add() admite en el primer parámetro un URL. Si usas un URL, entonces se va a lanzar un evento asíncrono dentro del cual tienes que definir qué pasa con esa imagen descargada.
El manual da detalles del proceso
http://docs.yoyogames.com/source/dadiospice/001_advanced%20use/more%20about%20async%20events/image%20loaded%20and%20sound%20loaded%20events.html
Si las imágenes van a ser sprites, y son muchas, entonces cargar imágenes externas podría afectar el rendimiento del dibujo, sobre todo en android. Si sólo son fondos, entonces no habría tanto problema, creo.
Excelente! Vi el manual y busque alguna info por internet pero no dice nada de lo que quiero hacer específicamente. Habría alguna forma de cargar la imagen del siguiente nivel como quiero yo? Así cuando pasas de nivel no tenés que esperar a que cargue. Estando en el nivel 1 se vaya cargando la imagen del nivel 2, mientras estás en el 2 se vaya cargando la imagen del 3 y así sucesivamente.
Hasta donde sé, en el sentido estricto, en GM no existe el concepto de precarga de recursos. Lo que cargas queda en uso o a disposición para el room actual y no se puede hacer que estando en una habitación A, se le asigne un fondo de antemano a una habitación B que no está cargada en memoria y por lo tanto GM "no la ve" ni puede acceder a ella. (Y si hay una manera, sería interesante saberla)
Una forma en que se puede simular lo que quieres es que definas un arreglo, un mapa o una lista, y que ahí guardes las imágenes que vas cargando. La manera de hacer esto puede variar, ya que se puede ir guardando una imagen por nivel, con lo que el tamaño de dicha estructura crecería, pero también es posible que el arreglo sólo vaya guardando la imagen actual y la siguiente, y que se vayan borrando y agregando imágenes dinámicamente, para que el arreglo sólo contenga dos imágenes. Desde luego que también es posible usar una sola variable y ahí guardar la imagen descargada (si es que ya no se podrá volver a las habitaciones anteriores. Si se va a poder regresar, entonces sería mejor usar el arreglo/lista/mapa).
Sobre el código a usar, el ejemplo del manual es prácticamente lo mismo que usarías, por lo que no le veo el caso a escribirlo nuevamente., sólo tienes que adaptar los nombres de las variables. Lo único que sería distinto, es que ahí, en cuanto la imagen se descarga, se asigna como fondo de la habitación actual. Lo que tú necesitas cambiar es que tu dibujarías el fondo o lo cambiarías mediante background_index[0] en el evento ROOM START. Así, cada que inicie un nivel (room), se carga el fondo guardado en la variable que tu hayas definido.
Una "desventaja" sería que sin conexión a internet, o si el servidor donde está alojada la imagen falla, el juego fallaría en dibujar el fondo, y eso se vería mal. Quizás esto sea muy poco probable, pero es un escenario que podría presentarse en determinado momento.
NOTA: incluso creo que es totalmente posible usar únicamente la función sprite_add/background_add sin el evento asíncrono: En esencia (en este caso en particular) El evento asíncrono sirve para avisar que la imagen se ha terminado de cargar. Pero como el jugador va a tardar (se supone) un tiempo mayor en jugar el nivel actual que el tiempo que tarda GM en descargar la imagen, entonces no es estrictamente necesario. El ejemplo del manual usa la imagen descargada de inmediato, cambiando el fondo actual en cuanto se termina de descargar, pero en tu juego la imagen no se usaría de inmediato, por eso menciono que es posible descartar el evento asíncrono (aunque no es recomendable, ya que puede servir para saber si la descarga fue exitosa o no)
Gracias por la respuesta penumbra. Lo uso para un sprite de un objeto, no para un background.
Tengo una duda, es normal que se vea mal? Con manchas al cargar el sprite. Mirá, a la izquierda tengo la imagen original cargada desde el juego y a la derecha cargada desde la web. Es exactamente la misma imagen, solo que al cargarla de internet aparecen unas "manchas negras" por todos lados.
(http://puu.sh/jzr26/5e389909b9.jpg)
Nota: La imagen está pixelada porque está con zoom.
Edit: Las manchas en este nivel no se aprecian bien, pero si te fijas en las ventanas del medio se nota la diferencia.
No creo que sea normal, pero ignoro por qué pasa. Yo probaría a subir la imagen a otro servidor o a subir la imagen en distintos formatos jpg/png/gif y ver si el problema se sigue presentando o no.
Cita de: penumbra en Agosto 13, 2015, 02:12:07 AM
No creo que sea normal, pero ignoro por qué pasa. Yo probaría a subir la imagen a otro servidor o a subir la imagen en distintos formatos jpg/png/gif y ver si el problema se sigue presentando o no.
Hice lo que me dijiste. El problema estaba en el formato "jpg". Lo subi a otro host donde no modificaban el png (en tinypic todas las imagenes que subas te las transforma a jpg) y anduvo bien en PNG. En .GIF me daba error el compiler, y en jpg esas manchas negras, asi que solucionado.
Voy a probar haciendo dos objetos para lo que quiero hacer yo, entonces en el nivel 1 el objeto está adelante y hago que cargue el del nivel 2 atras sin que el usuario lo vea, y asi sucesivamente.
Cita de: penumbra en Agosto 13, 2015, 01:57:11 AM
Una forma en que se puede simular lo que quieres es que definas un arreglo, un mapa o una lista, y que ahí guardes las imágenes que vas cargando. La manera de hacer esto puede variar, ya que se puede ir guardando una imagen por nivel, con lo que el tamaño de dicha estructura crecería, pero también es posible que el arreglo sólo vaya guardando la imagen actual y la siguiente, y que se vayan borrando y agregando imágenes dinámicamente, para que el arreglo sólo contenga dos imágenes. Desde luego que también es posible usar una sola variable y ahí guardar la imagen descargada (si es que ya no se podrá volver a las habitaciones anteriores. Si se va a poder regresar, entonces sería mejor usar el arreglo/lista/mapa).
Hola. Reabro el tema ya que estoy intentando hacerlo con alguna lista, pero no me sale. Tengo 50 sprites subidos a internet, que usan un objeto solo (obj_levelbase), en un mismo room. Lo que cambian son los niveles, en cada nivel va un sprite diferente en ese objeto.
Podrías tirarme alguna cuerda para ver como puedo seguir?
Edit:
Traté de hacerlo asi de otra manera. Asignandole por ejemplo global.spr_lvl02 = sprite_add(link,etce,tc) y luego en el nivel 2, el obj_levelbase con el global.spr_lvl02. Anduvo bien, el problema es que la imagen sale con unas manchas raras, por toda la foto. Si es en png, sale con manchas, si es en jpg sale un poco más pixelada y con menos color.
¿Qué código estás usando?
Cita de: penumbra en Agosto 13, 2015, 08:42:12 PM
¿Qué código estás usando?
Ahora ninguno. Borre todos ya que ninguno me anduvo. Lo unico que me anduvo pero las fotos se ven mal es con el global.spr = sprite_add.
Pero mencionaste que intentaste hacerlo con una lista, ¿qué código probaste ahí? Lo de los puntos negros no sé a qué se deberá. Quizás se trate de un bug, no veo por qué motivo aparecen los puntos negros cuando la imagen original no los tiene.
EDITADO: Empiezo a sospechar un posible motivo, pero no puedo asegurarlo. El tercer parámetro de la función sprite_add indica el color a hacer transparente. Quizás esto lo estás poniendo en true y el efecto sean los puntos negros. Lo que hace este parámetro es que la función toma el color del pixel de la esquina inferior izquierda, y en cualquier lugar de la imagen donde aparezca ese color, se elimina. No lo puedo asegurar, pero puedes probar a deshabilitar este parámetro y ver si esto soluciona los puntos
Cita de: penumbra en Agosto 13, 2015, 09:03:51 PM
Pero mencionaste que intentaste hacerlo con una lista, ¿qué código probaste ahí? Lo de los puntos negros no sé a qué se deberá. Quizás se trate de un bug, no veo por qué motivo aparecen los puntos negros cuando la imagen original no los tiene.
EDITADO: Empiezo a sospechar un posible motivo, pero no puedo asegurarlo. El tercer parámetro de la función sprite_add indica el color a hacer transparente. Quizás esto lo estás poniendo en true y el efecto sean los puntos negros. Lo que hace este parámetro es que la función toma el color del pixel de la esquina inferior izquierda, y en cualquier lugar de la imagen donde aparezca ese color, se elimina. No lo puedo asegurar, pero puedes probar a deshabilitar este parámetro y ver si esto soluciona los puntos
Exacto, era eso del "true" que tu dices penumbra.
Gracias como siempre, cierro nuevamente el tema
Saludos