小屋創作

日誌2014-01-26 03:30

[RGSS雜談] 程式去背

作者:未来ずら

呃...圖文有關...應該
※文內問題已得到解套法了



本來標題想加個進度展示的,不過敲完文發現沒提到半點邊,放棄
還有被白蓮騙進來的舉個手


因為目前系統需要圖片測試,沒耐心畫的結果只好先去mugen挖某人的改造白蓮來try try
好啦一拆不得了,圖片全是沒去背的,mugen本身有過濾指定色的緣故所以執行時沒問題

嗯...沒辦法,有些根本是半透明跟黑底合再一起,而且圖片高達1900張↑
人工去背太耗時(不如繼續畫點圖

所以就把腦筋動到程式上了,剛好Bitmap有取得像素色修改的方法
把指定色去掉是沒問題,但是那種半透明的去找了很多資料,但全是兩張合成結果的算法
沒找到還原的(把算式移項的結果變成兩個未知數,無解)
硬著頭皮只好隨便用主色系的強度當透明度了,很意外的效果還不錯,該不會透明處理就是這麼回事吧?

只是...因為提供語法的限制,就算只想單純改像素的透明度,還是得進行一次上色
繪圖是很吃效能的行為,所以...
一張圖還好,但作為一個格鬥遊戲圖怎麼可能這麼少
剛也說了1900張1900張因為很多張所以要說兩遍
咳、未免誤會補充一下:
19xx張當中有1000多張都是時間很長的特效,人物只佔800多,而且還蠻多重複動作


ok,不管了,那麼開始叫程式去背吧,以下是遊戲過程中邊換圖邊去背的狀況...

噢對,處刑BGM是智代after的OP:Light colors
背景是LF2的獅子山森林

即時去背:

(界面很醜我知道,paint沒用進行式我知道)
嗯........誠如您所見,這效率非常、非----常之悲劇
你會看到每出現新動作(初次生成)速度就會變慢
好吧,那就如同前篇文所說:預先載入並且去背吧


...我相信你不會想看一個loading字樣在那閃一分半
一分半還只是處理一個角色的時間,兩個角色就要乘以2


不過結果就很順,玻璃破裂那段是故意調慢的:
                                
但還是不能用啊!每次都要等一分半,兩人還Double!



好,那原圖是什麼樣子?就是這樣子:

......不去背行嗎?






接下來...求助Time (已用別的方式解決)
下列是那個去背的運算,不知有無優化辦法
想說只要有辦法只改像素的alpha應該能大幅提升效率才是,問題是它就只能帶個Color進去...
※有試過用兩個變量代入get_pixel(x, y),發現物件 id 不同,似乎是拷貝過才丟給變量
 所以沒辦法在獲取像素後直接對它修改

class Bitmap
  
  attr_accessor :alpha_done   # 位圖處理過的標記,避免再度處理
  #--------------------------------------------------------------------------
  # ● 處理圖片透明
  #      key_color:作為透明色的顏色(Color物件)
  #      main_color:需要不透明漸變時,將以主色系的強度作為透明度(只吃 "r"、"g"、"b")
  #--------------------------------------------------------------------------
  def process_alpha(key_color, main_color = "n")
    # 慢慢處理整張圖
    for y in 0..self.height
      for x in 0..self.width

        # 取得該像素顏色
        src_color = get_pixel(x, y)
        
        # 只設定透明色沒透明漸變的話,如果該像素不是透明色就跳過
        next if main_color == "n" and (src_color != key_color)
        
        # 參照主色系設置不透明度
        red = src_color.red
        green = src_color.green
        blue = src_color.blue
        case main_color
        when "r"
          new_alpha = red
        when "g"
          new_alpha = green
        when "b"
          new_alpha = blue
        else
          new_alpha = 255
        end
        # 把指定色設為透明
        new_alpha = 0 if src_color == key_color  
        # 重設像素顏色
        new_color = Color.new(red, green, blue, new_alpha)
        set_pixel(x, y, new_color)
      end
    end
    # 標記設為true
    @alpha_done = true
  end  # def end
end # class end



※因 月影之狼 的回應得知可以靠其他腳本把 Bitmap 物件再輸出(用Marshal會爆炸)
去完背後另存一份就ok了,太感謝了


不過程式碼就留著吧, 搞不好有誰需要...


最後附錄是讀取處理,對像是Game_Actor(已移除一些不重要的分歧):
# loading圖生成
loading = Sprite.new
loading.bitmap = RPG::Cache.picture("loading2")
loading.z = 9999
# 預載角色所有動作圖
for pic_number in 1..Game_Motion::PICTURE_LIMIT
self.loading_picture(pic_number) # <= 註:Graphics.update放在這裡面
# 每過 12 畫格改變loading圖可見狀態
loading.visible = !loading.visible if Graphics.frame_count % 12 == 0
end
# loading圖釋放
loading.bitmap.dispose
loading.dispose




4

2

LINE 分享

相關創作

小紅娘大冒險 製作日誌64 隨機出現

小紅娘大冒險 製作日誌66 初版分鏡2

小紅娘大冒險 製作日誌67 戰鬥再調

留言

開啟 APP

face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】