//----------------------------------------------------------- // HSPLet で MapScrollを試してみるためのテスト // 将来的にはHSPLet用GFSとして拡張できるといいね(*゚ー゚) //----------------------------------------------------------- *api_init #uselib "winmm.dll" #cfunc timeGetTime "timeGetTime" *display_init // プレーン0: 表面 screen 0,,,0: cls 4 // プレーン1: キャラ絵用 buffer 1,,,0 picload "chrchip.bmp" // プレーン2: マップチップ用 buffer 2,,,0 picload "mapchip.jpg" mapchipX=ginfo_winx / 32 // セル数の格納 mapchipY=ginfo_winy / 32 // プレーン3: マップ構築用 buffer 3,672,512,0 cls 4 *dimension dim mapdata,256,256 //sdim mpd,150000 // マップファイル用(150kで十分) dim maptype,256 // マップタイプ(0:通過 1:移動不可) sdim maptypeData,256 // マップタイプのオリジナルデータ sdim mapBuff,270000 *gameinit mode=0: mapx=10*32: mapy=10*32: px=9*32: py=7*32 mapNumber=100: pl_storex=0: pl_storey=0 gosub *mapload // ついでに音楽も鳴らしておこう mmload "grass.mid",0,1 mmplay 0 // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // ■ mainloop: メインループ(stickの取得とmodeでの処理分けだけを記述) *mainloop redraw 2 gosub *refresh_picture gosub *getstick gosub *watchTime if (mode=0) : gosub *mode0 gosub *debugPrint redraw 1 await 20 goto *mainloop // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // ■ modeルーチン *mode0 gosub *drawmap gosub *mode0_stick gosub *playerprint return // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // ■ subroutine //---------------------------------------------------------------- // watchtime: FPS計測 *watchTime nowTime = timeGetTime() subTime = nowTime - beforeTime if (subTime!=0) :fpsTime = 1000 / subTime beforeTime = nowTime return //---------------------------------------------------------------- // debugPrint: FPS計測 *debugPrint gsel 0: color 255,255,128: font msgothic,14,1 pos 10,460: mes "FPS: "+fpsTime return //---------------------------------------------------------------- // getstick: stick情報の取得 *getstick stick ky,15,0 msx=mousex: msy=mousey return //---------------------------------------------------------------- // refresh_picture: とりあえず画面を真っ黒にする。必要ない事も多い *refresh_picture gsel 0: gmode 0 color 0,0,0: boxf 0,0,640,480 return //---------------------------------------------------------------- // playerprint: 主人公の表示 *playerprint gmode 2,32,32 pos px,py-32 gcopy 1,pl_storex*32,pl_storey*32,32,64 return //---------------------------------------------------------------- // mapload: マップの読み込み。マップタイプも同時に読み込む *mapload fileName = "MAP-"+mapNumber+".MAP" exist fileName if (strsize>0) { bload fileName,mapBuff,-1,34 for y,0,256,1 for x,0,256,1 posit= ((y*256)+x)*4 temp1= peek(mapBuff, posit) temp2= peek(mapBuff, posit+1) temp7 = temp2*mapchipX+temp1 mapdata(x,y)=temp7 next next } // マップタイプのロード notesel maptypeData noteload "maptype.dat" noteget mapline,0 if (notesize>=256) { temp1=256 } else { temp1=128 } for i,0,temp1,1 maptype(i) = int (strmid(mapline,i,1)) next return //---------------------------------------------------------------- // マップ作画と表への転送 *drawmap // celxおよびcelyの剰余はエラー対策というだけで本来不適 celx=abs(mapx/32): celxmod=mapx\32 cely=abs(mapy/32): celymod=mapy\32 gsel 3 for i,0,20+1,1 for j,0,15+1,1 mapnum = mapdata(celx+i,cely+j) chipcellX = mapnum \ mapchipX chipcellY = mapnum / mapchipX pos i*32,j*32 gcopy 2,chipcellX*32,chipcellY*32,32,32 next next // 転送する gsel 0: pos 0,0 gmode 0,32,32 gcopy 3,celxmod,celymod,640,480 return //---------------------------------------------------------------- // mode0_stick: 移動処理 *mode0_stick ax=0: ay=0 if (ky&8) { if mapy<32*255 : ay=8 } if (ky&1) { if mapx>0 : ax=-8 } if (ky&4) { if mapx<32*255 : ax=8 } if (ky&2) { if mapy>0 : ay=-8 } // この移動先が障害物ではないかどうかを調べる plx=(mapx+px+16+ax)/32 ply=(mapy+py+16+ay)/32 temp1=mapdata(plx,ply) if (mapType(temp1)!=1) { mapx+=ax: mapy+=ay } return