sample\game\mapedit.hsp » Plain Format
; 2Dマップ編集ツール ; ; パーツを組み合わせたマップを編集するための簡易ツールです。 ; [操作] ; マウス左クリック = 選択中のパーツを置く ; マウス右クリック = カーソル位置のパーツを選択する ; (パーツは、画面下のパーツリストでも選択できます) ; マップのスクロールは、カーソルキーで行なうことができます。 ; スペースキーを押しながら、左クリックドラッグでもスクロール可能。 ; ; 編集したマップは、ファイルに保存することができます。 ; データは、「ファイル名.map」に保存されます。 ; また、設定項目(option windowの内容)が「ファイル名.txt」に出力されます。 ; ツールでは、設定項目も含めてセーブ・ロードすることができます。 ; option windowでは、以下の内容を変更することができます。 ; (設定変更を行なう場合は、「初期化」ボタンを押してください) ; ; マップサイズ : 編集するマップの全体サイズ ; パーツサイズX,Y : パーツ1つあたりのサイズ ; パーツファイル : パーツの画像ファイル ; goto *boot ; 簡易的な2Dマップ管理するルーチン ; #deffunc mapinit int _p1, int _p2 ; マップ初期化 ; mapinit vx,vy ; (マップを初期化します) ; vx=表示Xサイズ、vy=表示Yサイズ ; cx=64:cy=64 ; パーツXYサイズ mapsx=32 ; マップ全体Xサイズ mapsy=32 ; マップ全体Yサイズ celname="mapbg.bmp" ; パーツ画像ファイル csrc=ginfo_newid ; パーツのあるウィンドウID buffer csrc mapvx=_p1:mapvy=_p2 ; 表示XYチップ数 vx=mapvx*cx:vy=mapvy*cy ; 画面内のマップ表示サイズ return #deffunc mapload str _p1 ; マップ読み込み ; (ファイルからマップを読み込みます) ; mapload "filename" ; (*.map)のファイルを読み込みます。 ; 付加情報(*.txt)がある場合は、それも読み込みます。 ; fn=_p1 minf=getpath(fn,1)+".txt" exist minf if strsize>0 : gosub *load_minf dim map,mapsx,mapsy mapx=0:mapy=0 ; マップ表示位置 bload fn,map return *load_minf ; 付属情報ファイル(txt)をロード ; notesel buf noteload minf i=0 noteget s1,i:i++ if s1!="$mapedit data" : dialog "付属情報が無効です" : return repeat if i>=notemax : break noteget s1,i:i++ noteget s2,i if s1="%mapsx" : mapsx = 0+s2 : i++ if s1="%mapsy" : mapsy = 0+s2 : i++ if s1="%celname" : celname = s2 : i++ if s1="%cx" : cx = 0+s2 : i++ if s1="%cy" : cy = 0+s2 : i++ loop return #deffunc mapsave str _p1 ; マップ保存 ; (ファイルにマップを保存します) ; mapsave "filename" ; (*.map)のファイルを保存します。 ; 付加情報(*.txt)も同時に保存します。 ; fn=_p1 bsave fn,map minf=getpath(fn,1)+".txt" ; 付属情報ファイル(txt)を保存 buf="$mapedit data\n" buf+="%mapsx\n"+mapsx+"\n" buf+="%mapsy\n"+mapsy+"\n" buf+="%celname\n"+celname+"\n" buf+="%cx\n"+cx+"\n" buf+="%cy\n"+cy+"\n" notesel buf notesave minf return #deffunc mapdraw int _p1, int _p2 ; マップ描画 ; (マップを描画します) ; mapdraw x,y ; (x,y=描画開始位置) ; gmode 0 xx=_p1:yy=_p2 ; マップを描き始める位置 repeat mapvy y=cnt pos xx,y*cy+yy repeat mapvx celput csrc,map(mapx+cnt,mapy+y) loop loop return ;------------------------------------------------------------------ *boot ; ; 簡易マップ編集ツール ; ttl="簡易マップ編集ツール" mapinit 11,9 ; マップ初期化 toolwin = ginfo_newid ; ツール用ウィンドウID screen 0,vx,vy+32 title ttl fname="" ; マップの配列変数初期化 dim map,mapsx,mapsy mapx=0:mapy=0 ; マップ表示位置 *start ; パーツ初期化 celload celname,csrc celdiv csrc,cx,cy ; パーツ分割を設定する mapcode=0 mpsx=cx/2:mpsy=cy/2 ; ミニパーツのサイズ gsel csrc x=ginfo_sx/cx:y=ginfo_sy/cy mpn=x*y ; ミニパーツの表示数 gsel 0 cls 1 parts_x=0:parts_y=mapvy*cy gosub *put_parts ; ツールウィンドウ screen toolwin,120,400,screen_tool title "option window" cls 1 ox=120:x=0:y=0 objsize ox,32 pos x,y button "保存",*cmd_save button "上書き",*cmd_save2 mes "" button "読み込み",*cmd_load new_sx = mapsx new_sy = mapsy new_celname = celname new_cx = cx new_cy = cy mes "" mes "マップサイズ:" x=ginfo_cx:y=ginfo_cy objsize 40,24 pos x+5,y:input new_sx pos x+54,y:mes "x" pos x+75,y:input new_sy pos x,y+26 objsize 100,24 mes "パーツ画像" input new_celname objsize 40,24 mes "パーツXサイズ" input new_cx mes "パーツYサイズ" input new_cy objsize 60,24 button "初期化",*cmd_clr gsel 0 handtool=0 *main redraw 0 ; 描画始め color 0,0,64 boxf 0,0,vx-1,vy-1 ; 背景を消す mapdraw 0,0 ; マップ表示 redraw 1 ; 描画終わり await 20 if ginfo_act!=0 : goto *main stick key,$11f ; キー入力 if key&1 : mapx- if key&4 : mapx+ if key&2 : mapy- if key&8 : mapy+ mapx=limit(mapx,0,mapsx-mapvx) mapy=limit(mapy,0,mapsy-mapvy) if key&$10 : goto *cmd_space handtool=0 if key&$100 : goto *cmd_put if key&$200 : goto *cmd_get goto *main *cmd_space if handtool : goto *cmd_hand1 if key&$100 { handtool=1 handx=ginfo_mx:handy=ginfo_my handmx=mapx:handmy=mapy } goto *main *cmd_hand1 if (key&$100)=0 { handtool=0 goto *main } x=ginfo_mx-handx y=ginfo_my-handy mapx=handmx-(x/cx) mapy=handmy-(y/cy) mapx=limit(mapx,0,mapsx-mapvx) mapy=limit(mapy,0,mapsy-mapvy) goto *main *cmd_put if mousey >=parts_y : goto *cmd_partssel x=mousex/cx:y=mousey/cy if y>=mapvy or x>=mapvx : goto *main map(mapx+x,mapy+y)=mapcode goto *main *cmd_partssel if mousex<parts_x : goto *main x=(mousex-parts_x)/mpsx if x<mpn : mapcode=x : gosub *put_parts goto *main *cmd_get x=mousex/cx:y=mousey/cy if y>=mapvy : goto *main mapcode=map(mapx+x,mapy+y) goto *main *cmd_save dialog "map",17,"マップファイル" if stat=0 : goto *main fname = refstr *cmd_save2 if fname="" : goto *main exname=getpath(fname,2) ; ファイル名の拡張子を取得 if exname="" : fname+=".map" ; 拡張子がなければ.mapを追加 title getpath(fname,8)+" - "+ttl mapsave fname goto *main *cmd_load dialog "map",16,"マップファイル" if stat=0 : goto *main fname = refstr title getpath(fname,8)+" - "+ttl mapload fname goto *start *cmd_clr dialog "設定を更新するとデータはクリアされます。続行していいですか?",2 if stat=7 : goto *main mapsx = new_sx mapsy = new_sy celname = new_celname cx = new_cx cy = new_cy dim map,mapsx,mapsy mapx=0:mapy=0 ; マップ表示位置 goto *start ;--------------------------------------------------------------------------- *put_parts ; パーツ一覧(ミニパーツ)表示 ; gmode 0 repeat mpn pos cnt*mpsx+parts_x, parts_y celput csrc,cnt,0.5,0.5 loop color 255,0,0 x=mapcode*mpsx+parts_x:y=parts_y line x+mpsx-1,y,x,y line x+mpsx-1,y+mpsy-1 line x,y+mpsy-1 line x,y return *putmes sysfont 17 pos 0,0:color 255,255,255 mes "カーソルキーでマップを移動させてください。" return