マップエディタ

DXRubyMapを使ったらどんなもんが作れるのだろう、と思って、ちょっとためしていた。
マップ素材はこちらから頂いた。
First Seed Materialさま
http://www.tekepon.net/fsm/


これが作ってみたマップ。右クリックで選択、左クリックで置く。


左Shiftでチップ選択モード。


数字の1と2でレイヤ表示のon/off切り替え、右下の文字をクリックするとチップを置くレイヤが切り替わる


マップエディタが使いやすいかといわれるとイマイチなのだが、だいたいDXRubyはこういう実用ツールに向くライブラリではないからしょうがない。
っていうかDirectXでツールとかないわー
でもそれ以前にきちんと作る気がないから論外だ。ユーザーインターフェースとかちゃんと考えればかなりマシにはなるはず。ウィンドウを2個とかは作れないけど。
データ出力機能が無いわコメントは無いわというゴミのよーなプログラムだけどソースを置いておこう。
DXRubyMapはプロジェクトWebからダウンロードできる。
チップは右と下に余分なのが表示されるが、消すのが面倒だったゴミだ。
パブリックドメインにしとくから好きなようにいじって使うなり晒すなり自由にどうぞ。
あと、ウィンドウは1600*960という無茶なサイズになってるから、画面が狭い人はscaleを1とかにするとよい。
データ出力とかアンドゥとか当たり判定設定とかスクロールとかチップファイルを複数読むとかできるようにしたら、それなりに簡単なマップエディタにはなるんじゃないかしらん。

#!ruby -Ks
# 簡易マップエディタ
require 'dxruby'
require 'dxrubymap'

map = [Array.new(30) {[nil]*40}, Array.new(30) {[nil]*40}]
mapchip = Array.new(16) {|i| Array.new(30) {|j| i * 30 + j}}

image = Image.loadToArray("town01_a.png", 30, 16)
scale = 2

Window.width = 800
Window.height = 480
Window.scale = scale

waku = Image.new(16,16,[255,255,255,255]).box(1,1,14,14,[0,0,0,0])
select = 0
sizex = 1
sizey = 1
selectx = 0
selecty = 0
flag = 0

font = Font.new(12)
layers = [true, true]
selectlayer = 0

Window.loop do
  mx = Input.mousePosX / scale
  my = Input.mousePosY / scale

  if Input.keyPush?(K_1) then
    layers[0] = !layers[0]
  elsif Input.keyPush?(K_2) then
    layers[1] = !layers[1]
  end

  if Input.keyDown?(K_LSHIFT) then # チップ選択モード
    MapSystem.map = mapchip
    MapSystem.image = image
    MapSystem.sizex = 30
    MapSystem.sizey = 16
    MapSystem.draw(0,0,0)

    if mx < 40*16 and mx >= 0 and my < 30*16 and my >= 0 then
      if Input.mousePush?(M_RBUTTON) then
        selectx = mx / 16 
        selecty = my / 16
        flag = 0
      end
      if Input.mouseDown?(M_RBUTTON) and flag == 0 then
        sizex = mx / 16 - selectx + 1
        sizey = my / 16 - selecty + 1
        (0..sizey-1).each do |y|
          (0..sizex-1).each do |x|
            Window.draw((selectx + x) * 16, (selecty + y) * 16, waku, 2)
          end
        end
      end
    end
  else                             # マップ編集モード
    if mx < 40*16 and mx >= 0 and my < 30*16 and my >= 0 then
      if Input.mousePush?(M_RBUTTON) then
        selectx = mx / 16 
        selecty = my / 16
        flag = 1
      end
      if Input.mouseDown?(M_RBUTTON) and flag == 1 then
        sizex = mx / 16 - selectx+1
        sizey = my / 16 - selecty+1
        (0..sizey-1).each do |y|
          (0..sizex-1).each do |x|
            Window.draw((selectx + x) * 16, (selecty + y) * 16, waku, 2)
          end
        end
      end
      if Input.mouseDown?(M_LBUTTON) then
        (0..sizey-1).each do |y|
          (0..sizex-1).each do |x|
            if flag == 0 then
              map[selectlayer][my / 16 + y][mx / 16 + x] = mapchip[selecty + y][selectx + x]
            else
              map[selectlayer][my / 16 + y][mx / 16 + x] = map[selectlayer][selecty + y][selectx + x]
            end
          end
        end
      end
    end
    if mx >= 640 and Input.mousePush?(M_LBUTTON) then
      for i in 0..1 do
        if my > 400+i*12 and my < 400+i*12+11 then
          selectlayer = i
        end
      end
    end
    for i in 0..1 do
      if layers[i] then
        MapSystem.map = map[i]
        MapSystem.image = image
        MapSystem.sizex = 40
        MapSystem.sizey = 30
        MapSystem.draw(0,0,i)
      end
      Window.drawFont(640,400+i*12,"Layer" + i.to_s + (layers[i] ? " on " : " off") + (selectlayer == i ? " selected" : ""), font)
    end
  end

  break if Input.keyPush?(K_ESCAPE)
end

しかしマップの素材とエディタがあっても、マップそのものを作るのは大変だ。
RPGとか作ってる人はすごいことをしているのだと思った。