After playing Environmental Station Alpha, I decided I wanted to implement the screen tearing effect Hempuli is using in his game. I didn’t know how he achieved it so I had to start from scratch and think about different approaches.
Knowing nothing about shaders, I was left with surfaces. I jotted down some code and immediately hit a wall; after asking around in the yoyogames forums, reading other’s comments, I could finally come up with a pretty decent solution.
Actual Code
I wrote the code so it could be easily hackable. This goes into the create event of your game controller object.
// handy shorter names dw = display_get_width() dh = display_get_height() tearings_surface = surface_create(dw, dh) // We'll draw on this surface tearings_y = 0 band_num = 16 // How many bands you want on screen band_height = dh / band_num tearings_x_offset = 32 // How much you want to displace the bands horizontally tearing_speed = 4 // Change this to speed up/slow down the tearings
I place the following code inside a draw_post event of my controller.
// Create surface if it doesn't exits if !surface_exists(tearings_surface) tearings_surface = surface_create(display_get_width(), display_get_height()) // Let's set the target to our surface surface_set_target(tearings_surface) draw_clear_alpha(c_black, 0) // We draw parts of our application surface on tearings surface for (var current_band = 0; current_band < band_num * 2; current_band++) { draw_surface_part(application_surface, 0, band_height * current_band - tearings_y, dw, band_height, sin( (degtorad(360) / band_num ) * current_band) * tearings_x_offset , band_height * current_band - tearings_y) } // Always reset the target surface surface_reset_target() // Draw the actual surface draw_surface_stretched(tearings_surface, -tearings_x_offset, 0, dw + tearings_x_offset * 2, dh) // Move the Tearings tearings_y = (tearings_y + tearing_speed) % (band_height * band_num)
That's it.
And this is how I make that effect. I will implement a similar version for vertical tearings (for underwater levels? maybe?). Hope you find it useful.
A note about surfaces: remember to free the surfaces if you don’t need them anymore, otherwise it will lead to memory leaks.
If you enjoyed this post, share it, subscribe to mail updates or leave a comment to let me know!
I really appreciate it.
I really appreciate it.