Hola buenas!
Me gustaría conseguir que el jugador principal cuando ande, pues que eche por diferentes ángulos pintura, y que pinte lo que hay de fondo(no el background, si no diferentes objetos creados).
Lo explico mas en detalle, la idea es de tener el objeto player que es el principal y que cuando valla hacia la izquierda o hacia la derecha automáticamente valla pintando,ya que los objetos que hay creados no se deberían ver. Es decir, cuando inicia la room tu solo verías el personaje y el fondo, pero en esa room tienes diferentes objetos que son los que vas poniendo de pared,obstáculos... y son los que cuando el personaje valla andando a la vez que pasa los va pintando.
Me gustaría darle ese toque,si alguien sabe como lograrlo seria perfecto ;)

La idea fácil seria crear un objeto que es el que pinta y que cada vez que ande de lado a lado o salte, la valla creando hacia los lados, y que pinte los objetos que no se ven.

Muchas gracias :)


#1 Julio 30, 2018, 04:21:16 AM Ultima modificación: Julio 30, 2018, 04:28:12 AM por BssString
Hola Peludo

Espero que te encuentres bien, no entendí muy bien lo que intentas hacer, pero te explicaré la lógica que pense:
Debes tener 2 surfaces, una para que dibuje los bloques que se pueden pintar y otra con la pintura, luego debes superponer ambas capas donde el alpha coincide.
Para esto, Crea dos objetos, uno es el controlador que dibujará las surfaces en tu juego, el otro objeto es el bloque que pintarás, debe tener sprite y tener la casilla "Visible" desmarcada.
En el CREATE EVENT del objeto controlador debes declarar las surfaces
sur_tinta = surface_create(room_width,room_height)
sur_bloques = surface_create(room_width,room_height)

Como todo recurso dinámico, debe ser eliminado cuando ya no es necesario.
En el GAME END EVENT del objeto controlador debes eliminar las surfaces
if surface_exists(sur_tinta) surface_free(sur_tinta)
if surface_exists(sur_bloques) surface_free(sur_bloques)

Finalmente, donde ocurre la magia es en el evento de dibujo, colocaré cada línea con comentario para que entiendas su función.
En el DRAW EVENT del objeto controlador debes colocar:
surface_set_target(sur_bloques)           //Comienzas a dibujar en la surface que debe dibujar los bloques
draw_set_colour_write_enable(false,false,false,true)           //Eso hace que los próximos eventos de dibujo no dibujen los canales, rojo, verde, ni azul, sólo dibujará el canal alpha, esto es con el fin de que el color del bloque no interfiera con el color de la tinta
with obj_block draw_self()           //Esto dibuja el bloque en nuestra surface de bloques (sólo el alpha) para crear pixeles de "destino"
draw_set_colour_write_enable(true,true,true,true)             //Esto elimina la configuración anterior para que los próximos dibujos se dibujen con normalidad

draw_set_blend_mode_ext(bm_dest_alpha, bm_src_alpha)
/*El primer valor del blending mode, "bm_dest_alpha", hace que los colores del pixel a dibujar (o sea de la tinta), se multipliquen por
el alpha del destino, entonces si voy a dibujar tinta en un lienzo en blanco, no dibujaré nada, pero en cambio, si existe un bloque ahí, entonces sí dibujaré la tinta encima del bloque.
El segundo valor "bm_src_alpha", hace que los pixeles del destino (el bloque) se multipliquen por el alfa del pixel fuente, entonces sólo dibuja el bloque si hay tinta encima de él, eso evita que el bloque se dibuje como un cuadrado negro*/

draw_surface(sur_tinta,0,0)           //Esta línea superpone la surface "tinta" sobre la surface "bloques", aplicando los efectos "fuente" y "destino" del blending mode.
surface_reset_target()            //Esta línea es obligatoria después de usar el set target, es para hacer que el juego vuelva a dibujar sobre la application surface
draw_set_blend_mode(bm_normal)         //Esto regresa el blending mode a la normalidad
draw_surface(sur_bloques,0,0)         //Esto dibuja los bloques pintados en tu juego


Obviamente no verás ningún efecto si tu surface "Tinta" está vacía, esa la llenas como a ti te plazca...
Para probar si el código funciona, coloca esto en el STEP EVENT del objeto controlador:
draw_set_colour(c_red)
surface_set_target(sur_tinta)
draw_circle(mouse_x,mouse_y,12,false)
surface_reset_target()
draw_set_colour(c_black)

Eso llenará la surface TINTA con un círculo rojo en la ubicación del mouse, sólo es para que pruebes si el código funciona.

Edit: Si estás usando views por tener una room muy grande, tienes que crear las surfaces del tamaño de la view y ajustar las coordenadas finales donde dibujarás la surface a las coordenadas de la view.

Comentanos como te va.

hola buenas, he estado inactivo lo siento... ;(
He estado revisando el codigo y por lo que veo simplemente cuando mueves el raton va dibujando, pero lo que quiero es algo mas complicado, igual no es tan facil entender mi idea.
Veamos un ejemplo, seria tener un jugador y una room negra, en la que no se ve nada. Pero en esa room colacamos objetos, al estilo plataforma(mario bros....) y lo que quiero lograr es que el objeto jugador cuando valla hacia adelante pues nose si se podra pero que dispare o eche gotas y que eso haga que pinte los objetos colocados en la room, para asi ver lo que realmente hay.
En resumen, un jugador que si anda expulsa un obj_color por asi decir, que ese hace que pinte el objeto bloque colocado en la room. Y si es posible el obj_Color pues ponerle un sprite y hacer el efecto de que sale del jugador.

Haber si alguien puede ayudarme

Muchas gracias de antemano!!  :) :)

Creo que se refiere al efecto como en este juego:

Hola peludo

Algo parecido a lo que muestra 3dgeminis es lo que había entendido, pero la mecánica de ese juego está bien trabajada y bien pulida, el ejemplo que yo te muestro es lo básico, tu lo debes adaptar a lo que necesitas.

Para conseguir un efecto similar, no es mucho de mi código lo que debes cambiar, el código del mouse ya lo hace casi todo.

En vez de dibujar con el mouse sobre la surface de tinta, crea un objeto de tinta que salga del player cada vez que haces algún movimiento o incluso cuando el player colisiona contra algún muro.
Ese objeto de tinta que tu creas, al colisionar con algún bloque se debe destruir y se debe dibujar a si mismo sobre la surface tinta, incluso hace que el objeto ese viva 2 o 4 steps más después que colisiona antes de destruirse para que pinte sobre el bloque que colisionó y parezca un efecto como de rastro de tinta.

Saludos

Hola Peludo, para esta mecanica no hay tanto lio, eso es algo sencillo, lo dificil son las animaciones si te das cuenta cada vez que finaliza una animacion por ejemplo cuando salta en el aire, a lo que termina la animacion salen las gotas a los lados, para el dibujo es algo facil solo tienes que adaptar el codigo que muy claro te lo dejo BssString  XD ya despues si te preocupas por las animaciones