創作內容

4 GP

[RGSS雜談] 程式去背

作者:未来ずら│2014-01-26 03:30:35│巴幣:8│人氣:579
呃...圖文有關...應該
※文內問題已得到解套法了



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


因為目前系統需要圖片測試,沒耐心畫的結果只好先去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




引用網址:https://home.gamer.com.tw/TrackBack.php?sn=2322253
Some rights reserved. 姓名標示-非商業性 2.5 台灣

相關創作

同標籤作品搜尋:RM|RGSS|製作日誌

留言共 2 篇留言

先行者
感覺您發的文都好有學問[e17]
我從來都不會去想這些反正它超自然嘛[e29](什麼鬼
結果還真的一點一點畫感覺有點可怕...(抹臉
萬一我的圖超級大不就 gg 了[e27]

01-26 09:53

未来ずら
我覺得只是因為朝比較冷門的方向發展的緣故(爆
其他程式是不是一點一點重算我真的不知道

不過處理效率絕對都比本文這個好(以前都是黑底綠底的時代不可能沒這問題)


只能說...還是少叫RM畫圖吧[e26]說明書也講很花時間了01-26 13:41

何不改完後存檔起來呢~?
存Bitmap的腳本google一下就有

02-06 14:03

未来ずら
Σ(゚д゚;) 哪哪泥,是有想過輸出但沒想到真的有人寫,立馬來google

02-06 16:07
我要留言提醒:您尚未登入,請先登入再留言

4喜歡★qootm2 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:[RGSS雜談] RPG... 後一篇:[RMXP RGSS] ...

追蹤私訊切換新版閱覽

作品資料夾

a86189642祝福
看到的人會變得幸福哦!看更多我要大聲說昨天15:05


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

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