2017/04/04(火) [n年前の日記]
#1 [ruby][dxruby] ドット絵を自動生成するスクリプトをRubyで移植してみたり
_zfedoran/pixel-sprite-generator
という、ドット絵っぽい何かを自動生成してくれるJavaScriptがあるのだけど、なんだか面白そうなので Ruby で移植して DXRuby から使ってみたり。
_mieki256/tinypixelspritegenerator
こんな感じのドット絵、っぽい何かが作れるようです。
生成時にガイド相当としてマスクパターンを渡すので、全自動じゃないあたりがちとアレですけど、それでも同じマスクパターンからこれだけ違うモノを生成してくれるので、何か使い道が…あるのかな。どうかな。どうなんだろう。
_mieki256/tinypixelspritegenerator
こんな感じのドット絵、っぽい何かが作れるようです。
生成時にガイド相当としてマスクパターンを渡すので、全自動じゃないあたりがちとアレですけど、それでも同じマスクパターンからこれだけ違うモノを生成してくれるので、何か使い道が…あるのかな。どうかな。どうなんだろう。
◎ 使い方。 :
_tinypixelspritegenerator.rb
をダウンロード。Rawと書かれたボタンを右クリックして「リンク先を保存」等で落とせるかと。
DXRuby がインストールされてる環境なら、ruby tinypixelspritegenerator.rb でひとまず動作確認はできるかと。
何かから呼び出して使いたい時は…。
二次元配列に [R, G, B, A] を入れて返すだけなので、配列から画像用クラスに変換する処理さえ書けば、DXRuby以外、例えば gosu 等でも使える、のではないかと。
DXRuby がインストールされてる環境なら、ruby tinypixelspritegenerator.rb でひとまず動作確認はできるかと。
何かから呼び出して使いたい時は…。
require 'dxruby'
require_relative 'tinypixelspritegenerator'
# 配列を DXRuby の Image に変換
# @param a [Array<Array>] 3次元配列
def array_to_image(a)
h = a.size
w = a[0].size
img = Image.new(w, h, [0, 0, 0, 0])
a.each_with_index do |row, y|
row.each_with_index do |rgb, x|
r, g, b, a = rgb
img[x, y] = [a, r, g, b]
end
end
return img
end
# マスクパターン
mask_spaceship = [
# 12x12
# "0" or " " = 透明部分
# "1" or "." = ランダムで、ボディ部分か透明部分になる
# "2" or "+" = ランダムで、境界線かボディ部分になる
# "3" or "*" = 常に境界線になる
'000000',
'000011',
'000013',
'000113',
'000113',
'001113',
'011122',
'011122',
'011122',
'011113',
'000111',
'000000',
]
# 文字列で指定されたマスクパターンを配列のマスクパターンに変換
mask = TinyPixelSpriteGenerator.convert_mask(mask_spaceship)
# ドット絵生成
p = TinyPixelSpriteGenerator.new(
mask, # マスクパターンの配列
mirror_x: true, # true で左右ミラーを有効
mirror_y: false, # true で上下ミラーを有効
colored: true, # 色付きにするか白黒にするか
edgebrightness: 0.3, # 境界線の明度。値が小さければ黒に近付く
colorvariations: 0.2, # 色付け時のバリエーション幅
brightnessnoise: 0.3, # 色付け時の明度差
saturation: 0.5, # 色付け時の彩度幅
seed: rand(65536) # ランダムシード。ここが同じなら同じドット絵ができる
)
# 得られたドット絵のパターン配列を DXRuby の Image に変換
img = array_to_image(p.pixel_data)
Window.loop do
break if Input.keyPush?(K_ESCAPE)
Window.draw(0, 0, img)
end
こんな感じですかね…。二次元配列に [R, G, B, A] を入れて返すだけなので、配列から画像用クラスに変換する処理さえ書けば、DXRuby以外、例えば gosu 等でも使える、のではないかと。
◎ アルゴリズム。 :
_Pixel Spaceships (Internet Archive)
で元々のアルゴリズムが紹介されてますが、簡単に説明すると、ざっくりとしたマスクパターンを渡して、ボディ部分をランダムに On/Off した後、境界線を作って縁取る、てな処理のようで。
しかしコレ、元々の画像を見ると、ボディとコクピット部分で色が分かれてるような…。自分の書いた版は、というかオリジナルのJavaScript版も、そこまで反映されてないな…。
色付けする時に、元々のマスクパターンを参照して、「ココはコクピット部分だから色を変えよう」みたいな処理をすればいいのかな。たぶん。まあ、そこらへんは宿題ってことで。
しかしコレ、元々の画像を見ると、ボディとコクピット部分で色が分かれてるような…。自分の書いた版は、というかオリジナルのJavaScript版も、そこまで反映されてないな…。
色付けする時に、元々のマスクパターンを参照して、「ココはコクピット部分だから色を変えよう」みたいな処理をすればいいのかな。たぶん。まあ、そこらへんは宿題ってことで。
[ ツッコむ ]
以上です。