Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Tovidi en Octubre 10, 2015, 02:10:21 AM

Título: Necesito mantener una SURFACE en un cuarto permanente
Publicado por: Tovidi en Octubre 10, 2015, 02:10:21 AM
hola yo hago un dibujo en un cuarto , paso a otro y quiero volver y encontrar mi dibujo , AHHHHHHHHHHHHHHHHHHHHHHHH
Gracias
Título: Re:Necesito mantener una SURFACE en un cuarto permanente
Publicado por: Guacusio en Octubre 10, 2015, 02:59:51 AM
Si se borra al cambiar de room, intenta copiar la surface a un sprite y luego, al volver al room, redibujar el sprite en una nueva surface. También puedes guardarla en un buffer con buffer_get_surface y luego recuperarla con buffer_set_surface
Título: Re:Necesito mantener una SURFACE en un cuarto permanente
Publicado por: Tovidi en Octubre 10, 2015, 04:06:38 AM
hola y gracias con que comandos copio al sprite y recupero??
Título: Re:Necesito mantener una SURFACE en un cuarto permanente
Publicado por: penumbra en Octubre 10, 2015, 04:12:42 AM
Para copiar el contenido de la surface al sprite:
sprite_create_from_surface()

No hay una función que "recupere" la superficie a partir de un sprite, sino que tienes que dibujar el sprite en esa surface.

Tanto la surface como el sprite creado a partir de la surface deben borrarse de la memoria con la función apropiada al final del juego, de lo contrario se corre el riesgo de que el juego presente una fuga de memoria.
Título: Re:Necesito mantener una SURFACE en un cuarto permanente
Publicado por: Tovidi en Octubre 10, 2015, 04:32:19 AM
Y como hatias con la funcion buffer???
Porque probe y no pasa nada.
O con el problema que tengo cual seria la mas facil resolucion???
Título: Re:Necesito mantener una SURFACE en un cuarto permanente
Publicado por: Tovidi en Octubre 10, 2015, 03:20:27 PM
Hola necesito algun ejemplo del uso de las funciones pues no puedo  hacerlo
Título: Re:Necesito mantener una SURFACE en un cuarto permanente
Publicado por: Clamud en Octubre 10, 2015, 09:36:45 PM
Este es un ejemplo que usa background_create_from_surface, debes colocar el código en los lugares indicados:
[gml]
//Al iniciar
global.w = ; //anchura
global.h = ; //altura
global.sf = surface_create( global.w, global.h );
global.bg = -1; //no hay dibujo
surface_set_target( global.sf );
//...se dibuja en sf...

//Al cambiar de habitacion
global.bg = background_create_from_surface( global.sf,
0,0,global.w,global.h, false,false ); //guardar sf en bg
surface_reset_target();

//Al regresar a la habitacion
if not surface_exists( global.sf ) //si sf se ha borrado
{
    global.sf = surface_create( global.w, global.h ); //crear otra vez
    if background_exists( global.bg ) //si el dibujo se puede recuperar
    {
        surface_set_target( global.sf );
        draw_background( global.bg, 0,0 ); //dibujarlo en sf
        surface_reset_target();
       
        background_delete( global.bg ); //borrar bg
    }
}
[/gml]
Título: Re:Necesito mantener una SURFACE en un cuarto permanente
Publicado por: Guacusio en Octubre 10, 2015, 10:21:30 PM
Por cierto, intenté utilizar la función bufer_set_surface y al parecer no está operativa. encontré esto:

http://bugs.yoyogames.com/view.php?id=16812
http://bugs.yoyogames.com/view.php?id=17733
Título: Re:Necesito mantener una SURFACE en un cuarto permanente
Publicado por: Tovidi en Octubre 11, 2015, 03:30:44 AM
Hola chicos, probe todo como me  comentaron pero los dibujos al volver desaparecen
gracias por las molestias
Título: Re:Necesito mantener una SURFACE en un cuarto permanente
Publicado por: Killer en Octubre 11, 2015, 08:09:30 AM
Cita de: Guacusio en Octubre 10, 2015, 10:21:30 PM
Por cierto, intenté utilizar la función bufer_set_surface y al parecer no está operativa. encontré esto:

http://bugs.yoyogames.com/view.php?id=16812
http://bugs.yoyogames.com/view.php?id=17733

Raro, acabo de probarlas y funcionan correctamente, tambien a notar que los reportes que enlazas son de los primeros meses del año, asi que es probable que ya hayan sido solucionados.

Recuerda usar un buffer de almenos el tamaño minimo para que quepa la superficie, si se usan buffers del tipo Grow no van a aumentar su tamaño para que entre la superficie, debe ser del tamaño adecuado desde el principio.

Ah, y otra cosa a notar es que las funciones buffer_get_surface y buffer_set_surface solo funcionan para Windows y PlayStation 4.
Título: Re:Necesito mantener una SURFACE en un cuarto permanente
Publicado por: Guacusio en Octubre 11, 2015, 08:52:19 AM
Cita de: Killer en Octubre 11, 2015, 08:09:30 AM
Cita de: Guacusio en Octubre 10, 2015, 10:21:30 PM
Por cierto, intenté utilizar la función bufer_set_surface y al parecer no está operativa. encontré esto:

http://bugs.yoyogames.com/view.php?id=16812
http://bugs.yoyogames.com/view.php?id=17733

Raro, acabo de probarlas y funcionan correctamente, tambien a notar que los reportes que enlazas son de los primeros meses del año, asi que es probable que ya hayan sido solucionados.

Recuerda usar un buffer de almenos el tamaño minimo para que quepa la superficie, si se usan buffers del tipo Grow no van a aumentar su tamaño para que entre la superficie, debe ser del tamaño adecuado desde el principio.

Ah, y otra cosa a notar es que las funciones buffer_get_surface y buffer_set_surface solo funcionan para Windows y PlayStation 4.

Uso un buffer tipo buffer_fast y de tamaño ancho*alto*4 (x4 porque cada pixel utiliza 4 bytes de memoria en formato RGBA) . El primer link que puse se derivó al caso del segundo ya que es el mismo tema. Si te fijas en el bug Nº17733 (el segundo link que envié), en el Issue History aparece que el último acontecimiento es del 17 de julio y no aparece el tema cerrado. En varias otras partes he encontrado que hay problemas con esa función, por ejemplo en este post del 6 de agosto se señala que la función buffer_set_surface aún no está implementada:

http://gmc.yoyogames.com/index.php?showtopic=672356

Es extraño pero ahora que vuelvo a probar el mismo código sí funciona y no hice ningún cambio. El código que podría aplicarse es este:

//guardado de la surface en un buffer
b=buffer_create(b*h*4,buffer_fast,1);//(b,h) = (ancho,alto) de la surface
buffer_get_surface(b,s,0,0,0);//s=id de la surface
surface_free(s);


//recuperación de la surface desde el buffer:
s=surface_create(w,h);
buffer_set_surface(b,s,0,0,0);
buffer_delete(b);

Título: Re:Necesito mantener una SURFACE en un cuarto permanente
Publicado por: Killer en Octubre 11, 2015, 10:08:31 AM
El tema al que enlazas usa como prueba de que la función no está implementada otro enlace a un post del 17 de Marzo, en dicho post usar la función tira un mensaje de error que específicamente dice que la función aún no está implementada, si tu GM no está dando dicho error entonces la función esta implementada pero estaba siendo usada incorrectamente.

En el mismo tema el usuario que dice que la función no está implementada luego se corrige a si mismo y pone un enlace a las notas de versión de GMS, donde señala que buffer_set_surface fue agregada en la versión 1.4.1598, el 10 de julio de este año, para windows y PS4.

EL hecho de que los reportes no han sido marcados como solucionados podría ser señal de intenciones para habilitar dicha funcionalidad para otras plataformas, o más probablemente mala administración de parte de Yoyo, que lamentablemente se ha vuelto cosa de esperar, algunos reportes que yo hice desde hasta hace año y medio fueron "asignados" y nunca más fueron actualizados.

No tengo malas intenciones al decirlo, pero varias veces he visto a gente diciendo que el GM no funciona como debería y la gran mayoría de las veces termina siendo error humano.
Título: Re:Necesito mantener una SURFACE en un cuarto permanente
Publicado por: fasst007 en Octubre 11, 2015, 05:00:08 PM
En las opciones settings del room, tilda la opción "persistent" entonces cuando vuelvas a ese room persistirá todo cual como lo dejaste antes de salir de el.

En el ejemplo que te pasé mantienes presionado el clic y arrastras para dibujar como en el paint. Presionando la tecla "P" te pasas a otro room que es el de Pausa, y nuevamente presionas "P" para volver y el dibujo del surface permanece intacto.

El único inconveniente es si te sales de la aplicación y vuelves o cosas así el surface se destruye.
Saludos
Título: Re:Necesito mantener una SURFACE en un cuarto permanente
Publicado por: Guacusio en Octubre 11, 2015, 05:53:36 PM
Cita de: Killer en Octubre 11, 2015, 10:08:31 AM
El tema al que enlazas usa como prueba de que la función no está implementada otro enlace a un post del 17 de Marzo, en dicho post usar la función tira un mensaje de error que específicamente dice que la función aún no está implementada, si tu GM no está dando dicho error entonces la función esta implementada pero estaba siendo usada incorrectamente.

En el mismo tema el usuario que dice que la función no está implementada luego se corrige a si mismo y pone un enlace a las notas de versión de GMS, donde señala que buffer_set_surface fue agregada en la versión 1.4.1598, el 10 de julio de este año, para windows y PS4.

EL hecho de que los reportes no han sido marcados como solucionados podría ser señal de intenciones para habilitar dicha funcionalidad para otras plataformas, o más probablemente mala administración de parte de Yoyo, que lamentablemente se ha vuelto cosa de esperar, algunos reportes que yo hice desde hasta hace año y medio fueron "asignados" y nunca más fueron actualizados.

No tengo malas intenciones al decirlo, pero varias veces he visto a gente diciendo que el GM no funciona como debería y la gran mayoría de las veces termina siendo error humano.

Normalmente hago muchas pruebas antes de concluir que hay un bug, pero en este caso tienes razón, nunca me salió el mensaje de error donde se indica que la función no está implementada; debo haber cometido un error en alguna parte y por eso no me funcionaba, aunque no logré identificar cuál   :-X

Sé que no tienes malas intenciones al decir que hay gente que lo primero que hace al ver que su código no funciona es culpar a GM. Sin embargo, no sé si sea la gran mayoría. En cada versión nueva existe un no despreciable listado de bugs corregidos en las release notes y a mi me pasó que usando la última versión encontré un bug que, luego de un poco de investigación, resultó estar en proceso de solución por parte de yoyo (me pasó con la función surface_copy en android que funcionaba incorrectamente); otras veces me he topado con funciones que no trabajan como corresponde al compilar con el yoyo compiler, por ejemplo los haptics effects que no funcionan, y luego de investigar descubrí que Yoyo lo justifica por "no tener la licencia" (cosa rara que tenga la licencia para la versión sin su compilador y no la tenga para el yoyo compiler), además de no mencionarlo en ninguna parte del manual (http://bugs.yoyogames.com/view.php?id=12723). De hecho, parece que este último caso es otro de los que quedarán archivados eternamente como te pasó a ti ya que hace 2 años no tiene cambios.
Título: Re:Necesito mantener una SURFACE en un cuarto permanente
Publicado por: Tovidi en Octubre 11, 2015, 05:56:28 PM
Gracias a todos como siempre esto que estoy realizando debera funcionar en ios y android, voy a experimentar y a fijarme donde cometo un error pues el surface se graba porque ocupa la memoria pero no se plasma en el draw
Título: Re:Necesito mantener una SURFACE en un cuarto permanente
Publicado por: fasst007 en Octubre 11, 2015, 07:51:04 PM
Ya te solucioné el problema!! Particularmente me ha gustado la idea de penumbra de guardar el surface en un sprite porque me parece que podría dar una mayor flexibilidad.

Por lo tanto hice un proyecto tomando esta idea para dar un ejemplo del funcionamiento. El mismo consta con dos rooms que no son persistentes (ya no es necesario).

Al arrancar el juego aparece la pizarra de un paint y al hacer clic arrastrando se dibujan líneas. Con "P" se pasa al room del pausa y en este momento es cuando se guarda el surface en el sprite y se libera la memoria del surface, luego con otra vez "P" se retorna al room del dibujo y se crea nuevamente el surface con la imagen del sprite y posteriormente se libera la memoria del sprite.

Si bien el ejemplo es para windows (únicamente por la cuestión de que se necesita teclear la tecla "P" y "S") debería andar para android simplemente cambiando el evento del release de la tecla "P" y "S" por otra cosa. 

Saludos.
Título: Re:Necesito mantener una SURFACE en un cuarto permanente
Publicado por: Tovidi en Octubre 12, 2015, 05:14:37 PM
Gracias a todos, pero todos los problemas residían en el tratamiento de la surface como una variable global para poder trabajar con ella mas fluidamente, el cual funcionaba muy bien para muchas cosas pero no para la que necesitaba ahora.
Igualmente quiero aprovechar y agradecer a cada uno de los que me han tratado de ayudar como siempre lo hacen, esta MUY BUENO, pertenecer a una comunidad tan abierta, y con el afán de compartir conocimientos, ESE HECHO ES INIGUALABLE, saber que uno cuenta con amigos, y digo amigos, porque asi los considero.
GRACIAS A TODOS Y UN GRAN ABRAZO
Título: Re:Necesito mantener una SURFACE en un cuarto permanente
Publicado por: Clamud en Octubre 12, 2015, 08:13:20 PM
Estaba pensando que tal vez creas superficies nuevas cada vez que entras a la room de dibujo, entonces no se podía recuperar el dibujo porque la variable hacía referencia a una superficie diferente. Revisa que no suceda eso, porque estarías llenando la memoria con superficies que no usas. Puedes escribir algo así para verificarlo:
[gml]
if( variableSuperficie > 0 )
show_error( "Creando superficies innecesarias", false );
[/gml]
Título: Re:Necesito mantener una SURFACE en un cuarto permanente
Publicado por: Tovidi en Octubre 13, 2015, 02:26:42 PM
Gracias CLAMUD ya esta solucionado dirijo todas las acciones al objeto que maneja las surface y las trato como una variable local, igualmente lo que me llamo la atencion es que la variable global, se comportaba como no esperaba.
Gracias