呃...圖文有關...應該
※文內問題已得到解套法了本來標題想加個進度展示的,不過敲完文發現沒提到半點邊,放棄
還有被白蓮騙進來的舉個手因為目前系統需要圖片測試,沒耐心畫的結果只好先去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 |