mieki256's diary



2013/12/27(金) [n年前の日記]

#2 [dxruby][game] 昔のPCは色んな文字があったなと

大昔の、8bitパソコンって、各メーカが勝手に色んな文字をツッコんでたなと思い返したり。

_SHARP MZシリーズ には、「大」みたいな、人を表す文字があって、あらゆるゲームで大活躍してた。90度ずつ回転した4パターンがあったから、倒れてる人を示したり、頭から落ちていく人を示したり、やられた時はグルグル回って表現したり。他にヘビみたいなマークもあって、コレはえてして敵キャラだった記憶も。

_ NEC PC-8001 は、トランプのマークが活躍してた気がする。ハートを取ると得点ゲット。クラブは、木。ダイヤは、触ったらアウトの壁。必然的にスペードは自機を担当、みたいな。

_ナショナル(今の Panasonic) JR-100 は、ちょっと違ってて。ユーザが自分の好きな文字デザインを登録することができた。ベーマガ(マイコンBASICマガジン)の、JR-100のページだけ、見るからに楽しそうな画面になってて。「JR-100、いいなあ…」と羨ましかったっけ。

てなことを思い返しているうちに。今の各種ゲームライブラリでも、フォントを使ってドット絵っぽいのを作れたりしないかな、とバカ妄想を。

結局、スクリプトソース内にちょこっと記述を増やすだけでそれらしいドット画像をバーンと表示できないかな、という話なんですけど。

フォントで画像モドキを作ってみたり。 :

フォントを重なっていったらそれっぽい画像にならないかなと。Ruby + DXRuby で実験。

_makedotimg.rb
# フォントで画像を作ってみる

require 'dxruby'

w, h = 80, 80
font = Font.new(72, "Courier New")

srand(0)
Window.bgcolor = [00, 64, 255]

init_fg = true
imgs = []

Window.loop do
  break if Input.keyPush?(K_ESCAPE)

  init_fg = true if Input.keyPush?(K_SPACE)

  if init_fg
    # 画像作成
    imgs = []
    32.times do |i|
      img = Image.new(w, h)
      strs = []
      xw = w / 2
      6.times do |j|
        c = (rand(126-32) + 33).chr
        x = rand(xw)
        y = rand(xw)
        img.drawFont(x, y, c, font)
        strs.push([x, y, c])
      end
      imgs.push(img)
      # p strs
    end
    init_fg = false
  end

  # 描画
  x, y = 0, 0
  imgs.each do |img|
    Window.draw(x, y, img)
    x += w + 8
    if x + img.width > 640
      x = 0
      y += w + 8
    end
  end
end
実行結果
  • スペースキーで再作成。

うーん。ビミョー。いや、ビミョーどころじゃなく、厳しい。

もっとも、文字の選択と位置調整を手作業で指定していければ、それらしい組み合わせが作れそうな気もしたり。以下のような事例もあることだし…。

_ドラえもんの特殊顔文字はどういうしくみでできているか|Colorless Green Ideas

ただ、それでスクリプト中に記述するデータ量が少なくなるかと言うと、そこはちょっと読めないなと…。

JR-100方式。 :

ビットパターンで画像を作るだけでもそれっぽくなるのではと思えてきたので実験。

_makebitpat.rb
# ビットパターンを作成、あるいは描画
#
# ビットパターンデータをダンプ
# ruby makebitpat.rb hoge.png
#
# ビットパターンを描画
# ruby makebitpat.rb
#

require 'dxruby'

if ARGV[0]
  # ビットパターンをダンプ
  fn = ARGV[0]
  img = Image.load(fn)
  w, h = img.width, img.height
  dt = []
  h.times do |y|
    d = 0
    w.times {|x| d |= (1 << x) if img[x, y][0] > 128}
    dt.push(d)
  end
  p dt
  exit
end

# 与えられたデータから画像を作成する
def make_image_from_bitpat(dt)
  w = h = dt.length
  img = Image.new(w, h)
  h.times do |y|
    w.times {|x| img[x, y] = C_WHITE if ((dt[y] >> x) & 0x01) != 0}
  end
  return img
end

# ビットパターンデータ
data = [
  [2016, 2064, 2640, 6744, 6168, 2064, 2064, 2016, 2064, 6168, 10260, 18450, 20466, 1632, 576, 7224],
  [0, 2016, 2064, 2640, 23130, 22554, 18450, 18450, 10212, 6168, 2064, 2064, 4080, 1632, 576, 7224]
]

# 画像を作成
imgs = []
data.each {|d| imgs.push(make_image_from_bitpat(d))}

Window.minFilter = Window.magFilter = TEXF_POINT
Window.resize(320, 240)

cnt = 0
Window.loop do
  break if Input.keyPush?(K_ESCAPE)
  Window.drawScale(32, 32, imgs[(cnt >> 4) & 0x01], 4, 4)
  cnt += 1
end
ビットパターンで画像作成

DXRuby は色配列を渡すことで画像作成もできるのだけど、それだと配列の個数が多くなりそうで…。白黒のビットバターンだけにすれば、記述するデータ量も減らせそうだなと。 _JR-100の画面を見てると、それでも結構イケそうな気もしてくるし。

データをダンプするには以下のような感じで。
> ruby makebitpat.rb bitpat0.png
[2016, 2064, 2640, 6744, 6168, 2064, 2064, 2016, 2064, 6168, 10260, 18450, 20466, 1632, 576, 7224]

文字列をコピーして、上記のソースに貼り付けて、以下を実行すれば表示できる。
ruby makebitpat.rb

以上です。

過去ログ表示

Prev - 2013/12 - 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 31

カテゴリで表示

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


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

Powered by hns-2.19.6, HyperNikkiSystem Project