Hola a todos, estaba trabajando en mi juego (sí,sí...el mismo de hace 2 meses...xD) y tuve un problema:
En una room, yo creé un sprite de esta manera:
[gml]screen_save("imagen.png");
sprite_add("imagen.png",0,true,false,0,0);[/gml]
y lo almacené en una variable global, que después iría a guardarse en un .ini . pero el problema es que cuando voy a otra room, la cual es donde se lee el .ini y se dibuja en la pantalla, no me lee el sprite creado. Además, este sprite que creo necesita tener dos subimages, lo cual no sé hacer tampoco. Es decir que el sprite que quiero crear debe tener 2 subimágenes de dos capturas de pantalla diferentes en el mmismo sprite
Cita de: NiuWeb en Octubre 16, 2015, 06:39:29 AM
y lo almacené en una variable global
El error es que un sprite no se puede almacenar en una variable real. Son tipos de datos diferentes. Lo que se almacena en las variables es símplemente un número (índice). Ese índice apunta a un recurso gráfico (sprite), pero NO ES un sprite. Un sprite es un conjunto de pixeles que no puede guardarse símplemente en un número.
De la misma manera, la variable sprite_index almacena un simple índice que apunta a un sprite. Apunta, pero no es el sprite en si mismo, como un número telefónico apunta a un teléfono físico, pero NO ES el teléfono físico, es sólo un número. Esta es la razón de por qué en el INI no se guarda ningún sprite/imagen, se guarda un número real nada más.
Las únicas maneras de guardar sprites de manera permanente son usando las funciones como
screen_save()
sprite_save()
sprite_save_strip()
surface_save()
background_save()
Gracias por responder, me sirvió la función de sprite_save(), pero ¿Cómo, más o menos, se usa esta función? ¿de qué manera podría cargar el sprite que he guardado?
Cita de: NiuWeb en Octubre 16, 2015, 06:39:29 AM
En una room, yo creé un sprite de esta manera:
[gml]screen_save("imagen.png");
sprite_add("imagen.png",0,true,false,0,0);[/gml]
Aquí estás cargando un sprite en GM que está previamente guardado. No importa si la función screen_save se uso en la sesión actual o en una anterior, eso deja un sprite almacenado en disco y la funcion sprite_add lo está cargando, justamente. Obviamente, la función screen_save puede ir en algún evento (cuando necesites guardar un sprite) y la función sprite_add puede ir en otro evento (cuando quieras cargar el sprite)
Cita de: penumbra en Octubre 16, 2015, 07:06:21 AM
Cita de: NiuWeb en Octubre 16, 2015, 06:39:29 AM
En una room, yo creé un sprite de esta manera:
[gml]screen_save("imagen.png");
sprite_add("imagen.png",0,true,false,0,0);[/gml]
Aquí estás cargando un sprite en GM que está previamente guardado. No importa si la función screen_save se uso en la sesión actual o en una anterior, eso deja un sprite almacenado en disco y la funcion sprite_add lo está cargando, justamente.
mmm... la verdad no te entendí... ¿cómo así que el sprite está previamente guardado? Me gustaría me explicaras como usar la función sprite_save y como cargar el sprite que he creado con esta función, si no es mucho pedir XD :D
Creo que no te has percatado, pero con el código que has puesto, ya estás haciendo las dos cosas, tanto guardar un sprite como cargarlo.
La función screen_save("imagen.png") va a guardar un sprite en el directorio de trabajo de GM (saber su ubicación/ruta no es importante). Incluso si después cierras GM, esa imagen PNG queda ahí. La otra función, sprite_add("imagen.png",0,true,false,0,0) lo que realmente hace es CARGAR un sprite. ¿Qué sprite? Un sprite de nombre imagen.png que previamente se guardó en disco. Entonces, si te fijas, estás guardando y luego cargando.
Suponiendo que en mi juego tengo un botón que sirve para guardar una captura de pantalla, en el evento de click de ese botón usaría la primer función para guardar la imagen
[gml]screen_save("imagen.png")[/gml]
Ahora, al comenzar el juego, quiero que al entrar a la habitación 1 aparezca la imagen que previamente se guardó, si es que existe dicha imagen (el jugador pudo no haber guardado nada en la sesión anterior), entonces:
EVENTO ROOM START
[gml]
if file_exists("imagen.png")
picture = sprite_add("imagen.png",0,true,false,0,0) //Esto carga un sprite
[/gml]
EVENTO DRAW
[gml]
if (room == room1) and (picture > 0) //Comprobar que se está en la habitación 1 y que la variable picture apunta a un sprite válido
draw_sprite(picture, 0, 10, 10) // Dibujar el sprite que se guardó en la sesión anterior.
[/gml]
Cita de: NiuWeb en Octubre 16, 2015, 06:39:29 AM
Hola a todos, estaba trabajando en mi juego (sí,sí...el mismo de hace 2 meses...xD) y tuve un problema:
En una room, yo creé un sprite de esta manera:
[gml]screen_save("imagen.png");
sprite_add("imagen.png",0,true,false,0,0);[/gml]
y lo almacené en una variable global, que después iría a guardarse en un .ini . pero el problema es que cuando voy a otra room, la cual es donde se lee el .ini y se dibuja en la pantalla, no me lee el sprite creado. Además, este sprite que creo necesita tener dos subimages, lo cual no sé hacer tampoco. Es decir que el sprite que quiero crear debe tener 2 subimágenes de dos capturas de pantalla diferentes en el mmismo sprite
A mí aún no me queda claro por qué guardas un sprite de la pantalla en disco y luego lo cargas inmediatamente. Estoy suponiendo, entonces, que tu intención es usarlo durante la misma ejecución del juego y no durante otra; si ese es el caso, no veo la necesidad de guardar el índice en un ini.
Yo usaría
sprite_create_from_surface en vez de
screen_save para crear el sprite y poder agregarle subimágenes después con
sprite_add_from_surface:
Copiar la pantalla en un sprite:global.sprite=sprite_create_from_surface(application_surface,0,0,surface_get_width(application_surface),surface_get_height(application_surface),true,false,0,0);
Agregarle como subimagen la pantalla actual (en el otro room):sprite_add_from_surface(global.sprite,application_surface,0,0,surface_get_width(application_surface),surface_get_height(application_surface),true,false);
se supone que con screen_save ya la guardaste, mientras no la borres ahí estará siempre xD
Muchas gracias a todos XD al fin logré arreglar este problema, pero apareció otro: Los otros objetos no me leen el sprite que creé.
Me explico: primero creé el sprite así:
[gml]
screen= screen_save_part("tempfoto1.png",oDrawSpace.x,oDrawSpace.y,512,512);
screen_sprite= sprite_add("tempfoto1.png",0,false,false,0,0);
space = surface_create(32,32);
surface_set_target(space);
draw_sprite_stretched(screen_sprite,0,0,0,32,32);
surface_reset_target();
surface_save(space,"Foto1.png");
sprite_delete(screen_sprite);[/gml]
Y en otra room lo cargo:
[gml]
if file_exists("Foto1.png")
global.icon = sprite_add("Foto1.png",0,true,false,16,16); //Aquí creo un sprite, de la forma en la que lo necesito, en una variable GLOBAL
[/gml]
Pero entonces, cuando en otro objeto de LA MISMA room intento cargar el sprite de global.icon, me da un error que dice algo como: "...trying to load a non-existing sprite".
Aclaro, que si uso el sprite de global.icon en el MISMO OBJETO en donde lo creé, lo usa sin problema alguno.
¿El problema se debe a que el sprite solo se carga para un objeto? o ¿es algún otro error?...agradecería me explicaran XD XD
Puede ser que la variable global.icon aún no está actualizada cuando intentas leerla desde el otro objeto. Para poder dilucidarlo, se necesita como mínimo que indiques en qué eventos estás poniendo los códigos. Puede ser que la definición de global.icon esté en el evento create de un objeto, y en el evento create de otro objeto intentas leer esa variable, siendo que el evento create del segundo objeto ocurre antes que el del primero.
Cita de: Guacusio en Octubre 16, 2015, 10:36:40 PM
Puede ser que la variable global.icon aún no está actualizada cuando intentas leerla desde el otro objeto. Para poder dilucidarlo, se necesita como mínimo que indiques en qué eventos estás poniendo los códigos. Puede ser que la definición de global.icon esté en el evento create de un objeto, y en el evento create de otro objeto intentas leer esa variable, siendo que el evento create del segundo objeto ocurre antes que el del primero.
Ah, Oops!.... Cambié el evento del objeto que lee la variable global a una alarma, y me fuciona perfectamente..xD :D :D