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
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
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:
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:
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.
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
Código [Seleccionar]
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
Código [Seleccionar]
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:
Código [Seleccionar]
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:
Código [Seleccionar]
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.