作者:nikles
翻译:highway★
在玩过 Environmental Station Alpha之后,我也想实现Hempuli(上句那个游戏的开发者)在他的游戏做出的效果。我不知道该如何实现,所有我不得不从头开始,思考不同的方法。
我对shader(译注:着色器,如果你是初学者,还是敬而远之,对美术基础和数学还有编程的要求挺高的)一窍不通,所以只能用surface了。我写了一些代码,然后立刻撞墙……我有点儿懵逼,就去yoyogames的论坛上求助,看了其他人的评论之后,我终于想出一个相当不错的解决办法。
实际代码
在你的游戏控制object(起名随意,比如oGame、oCont之类的)的create事件中,写下面的这些东西
代码:
// 名字缩写,方便后面用,要不然代码太长,看着费劲 dw = display_get_width() dh = display_get_height() tearings_surface = surface_create(dw, dh) // 我们要把这个绘制到surface tearings_y = 0 band_num = 16 // 屏幕上要出现多少个横条 band_height = dh / band_num tearings_x_offset = 32 //你要怎样水平移动横条 tearing_speed = 4 // 修改这里可以加速/减速
I place the following code inside a draw_post event of my controller.下面这些东西写在刚才那个object的draw_post事件中。
代码(已修正):
// 如果surface不存在便创建它 if !surface_exists(tearings_surface) tearings_surface = surface_create(display_get_width(), display_get_height()) // 给surface设置目标 surface_set_target(tearings_surface) draw_clear_alpha(c_black, 0) // 我们将部分应用surface绘制在撕裂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) } // 始终重置目标surface surface_reset_target() // 绘制实际surface draw_surface_stretched(tearings_surface, -tearings_x_offset, 0, dw + tearings_x_offset * 2, dh) // 移动撕裂 tearings_y = (tearings_y + tearing_speed) % (band_height * band_num)
我的做法就是这样~我还会再弄一个垂直撕裂的类似版本出来(水下关卡?没准儿~)希望这篇小文章对你有帮助。
关于surface的使用要注意:如果你不用的时候,请记住一定要释放surface,否则会引起内存泄漏越来越卡或者可能崩溃。
转载预定~哈哈哈~
@顺子:永久随意转载~
@highway★ :如果surface存在便创建它……好像那句注释漏了个不
@顺子:打漏了…… 已编辑~ 多谢顺哥提醒
还有draw_post事件是什么?是以前版本的draw的别的叫法?
@顺子:好吧,可能是那个post-draw事件……会在draw gui之前触发
第二块代码不完整……是不是从evernote贴过来的时候丢了?
@顺子:第二段好像作者改过一次
@顺子:果然是复制过来格式是乱的,然后莫名其妙换行就没了…一段… 注释颜色……字体加粗格式什么都没有了,哎
@highway★ :现在好像可以了
surface一般都被我拿来创建鼠标cursor :D
表面效率都是感人的 这么多像素的处理 上shader 不过不会就是没办法的事情()