mieki256's diary



2017/04/04(火) [n年前の日記]

#1 [ruby][dxruby] ドット絵を自動生成するスクリプトをRubyで移植してみたり

_zfedoran/pixel-sprite-generator という、ドット絵っぽい何かを自動生成してくれるJavaScriptがあるのだけど、なんだか面白そうなので Ruby で移植して DXRuby から使ってみたり。

_mieki256/tinypixelspritegenerator

こんな感じのドット絵、っぽい何かが作れるようです。

spaceship_24x24.png

生成時にガイド相当としてマスクパターンを渡すので、全自動じゃないあたりがちとアレですけど、それでも同じマスクパターンからこれだけ違うモノを生成してくれるので、何か使い道が…あるのかな。どうかな。どうなんだろう。

使い方。 :

_tinypixelspritegenerator.rb をダウンロード。Rawと書かれたボタンを右クリックして「リンク先を保存」等で落とせるかと。

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版も、そこまで反映されてないな…。

色付けする時に、元々のマスクパターンを参照して、「ココはコクピット部分だから色を変えよう」みたいな処理をすればいいのかな。たぶん。まあ、そこらへんは宿題ってことで。

以上です。

過去ログ表示

Prev - 2017/04 - Next
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project