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版も、そこまで反映されてないな…。
色付けする時に、元々のマスクパターンを参照して、「ココはコクピット部分だから色を変えよう」みたいな処理をすればいいのかな。たぶん。まあ、そこらへんは宿題ってことで。
[ ツッコむ ]
以上です。