マップエディタ
DXRubyMapを使ったらどんなもんが作れるのだろう、と思って、ちょっとためしていた。
マップ素材はこちらから頂いた。
First Seed Materialさま
http://www.tekepon.net/fsm/
これが作ってみたマップ。右クリックで選択、左クリックで置く。
数字の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とか作ってる人はすごいことをしているのだと思った。