原作者為 nikles,本文由 highway★負(fù)責(zé)翻譯。

在玩過(guò) Environmental Station Alpha之后,我也想實(shí)現(xiàn) Hempuli(上句那個(gè)游戲的開(kāi)發(fā)者)在他的游戲做出的效果。我不知道該如何實(shí)現(xiàn),所有我不得不從頭開(kāi)始,思考不同的方法。

我對(duì) shader(譯注:著色器,如果你是初學(xué)者,還是敬而遠(yuǎn)之,對(duì)美術(shù)基礎(chǔ)和數(shù)學(xué)還有編程的要求挺高的)一竅不通,所以只能用 surface 了。我寫了一些代碼,然后立刻撞墻……我有點(diǎn)兒懵逼,就去yoyogames 的論壇上求助,看了其他人的評(píng)論之后,我終于想出一個(gè)相當(dāng)不錯(cuò)的解決辦法。

none.gif
實(shí)際代碼

在你的游戲控制 object(起名隨意,比如 oGame、oCont 之類的)的 create 事件中,寫下面的這些東西。

代碼:
?

  1. // 名字縮寫,方便后面用,要不然代碼太長(zhǎng),看著費(fèi)勁
  2. dw = display_get_width()
  3. dh = display_get_height()
  4. ?
  5. tearings_surface = surface_create(dw, dh) // 我們要把這個(gè)繪制到 surface
  6. tearings_y = 0
  7. band_num = 16 // 屏幕上要出現(xiàn)多少個(gè)橫條
  8. band_height = dh / band_num
  9. tearings_x_offset = 32 //你要怎樣水平移動(dòng)橫條
  10. tearing_speed = 4 // 修改這里可以加速/減速

復(fù)制代碼
I place the following code inside a draw_post event of my controller。下面這些東西寫在剛才那個(gè) object 的 draw_post 事件中。

代碼(已修正):

?

?

  1. // 如果 surface 不存在便創(chuàng)建它
  2. if !surface_exists(tearings_surface)
  3. tearings_surface = surface_create(display_get_width(), display_get_height())
  4. ?
  5. // 給 surface 設(shè)置目標(biāo)
  6. surface_set_target(tearings_surface)
  7. ?
  8. draw_clear_alpha(c_black, 0)
  9. ?
  10. // 我們將部分應(yīng)用 surface 繪制在撕裂 surface 上
  11. for (var current_band = 0; current_band < band_num * 2; current_band++)
  12. {
  13. 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)
  14. }
  15. ?
  16. // 始終重置目標(biāo) surface
  17. surface_reset_target()
  18. // 繪制實(shí)際 surface
  19. draw_surface_stretched(tearings_surface, -tearings_x_offset, 0, dw + tearings_x_offset * 2, dh)
  20. // 移動(dòng)撕裂
  21. tearings_y = (tearings_y + tearing_speed) % (band_height * band_num)
復(fù)制代碼
我的做法就是這樣~我還會(huì)再弄一個(gè)垂直撕裂的類似版本出來(lái)(水下關(guān)卡?沒(méi)準(zhǔn)兒~)希望這篇小文章對(duì)你有幫助。

關(guān)于 surface 的使用要注意:如果你不用的時(shí)候,請(qǐng)記住一定要釋放 surface,否則會(huì)引起內(nèi)存泄漏越來(lái)越卡或者可能崩潰。

via:indienova


銳亞教育

銳亞教育,游戲開(kāi)發(fā)論壇|游戲制作人|游戲策劃|游戲開(kāi)發(fā)|獨(dú)立游戲|游戲產(chǎn)業(yè)|游戲研發(fā)|游戲運(yùn)營(yíng)| unity|unity3d|unity3d官網(wǎng)|unity3d 教程|金融帝國(guó)3|8k8k8k|mcafee8.5i|游戲蠻牛|蠻牛 unity|蠻牛