;hsp3.21 ;obstacle.as screen 0,640,480,1 palette 16,0,0,255: palette 17,0,255,0: palette 18,176,0,0 palette 19,0,191,0: palette 20,1,1,1,1 dot=4 ;移動単位(ドット数) fsize=32: scrwid=640/fsize: scrheit=480/fsize mapwid=scrwid: mapheit=scrheit num=fsize/dot interval=128/num ;CPUが200MHzならdot=2: interval=0で同じくらい ;CPUが2.8MHzなら、dotは4以上でないとダメ ;ロケットの画像 ;通常は「buffer 2: picload "char.bmp"」とかで終わり ;単純にmesで書くと、なぜかはみ出すので、ワンクッション置いている buffer 2,fsize,fsize*4,1 #if 0 ;hsp3はフルカラーモード画面からパレットモード画面にgcopyすると、 ;gmode 2 が効かなくなるらしい buffer 3,fsize*2,fsize*2 #else buffer 3,fsize*2,fsize*2,1 #endif font "webdings",fsize s="a" boxf: color 0,0,255: poke s,0,$F9: pos 0,0: mes s gsel 2: pos 0,0: gcopy 3,0,0,fsize,fsize ;上向き gsel 3: color: boxf: color 0,0,255: poke s,0,$F8: pos 0,0: mes s gsel 2: pos 0,32: gcopy 3,0,0,fsize,fsize ;右向き gsel 3: color: boxf: color 0,0,255: poke s,0,$FA: pos 0,0: mes s gsel 2: pos 0,64: gcopy 3,0,0,fsize,fsize ;下向き gsel 3: color: boxf: color 0,0,255: poke s,0,$F7: pos 0,0: mes s gsel 2: pos 0,96: gcopy 3,0,0,fsize,fsize ;左向き ;マップキャラの画像 ;これも通常は「buffer 3: picload "mapchar.bmp"」とかで終わり buffer 3,fsize*4,fsize,1 font "webdings",fsize: color 0,255,0: boxf color 176,0,0: pos fsize,0: mes "M" ;山 1 color 0,191,0: pos fsize*2,0: mes "P" ;木 2 color 1,1,1: pos fsize*3,0: mes "S" ;町 3 ;マップ dim map,mapwid,mapheit ;0:平地 1:山 2:木 3:建物 ;ここから後は通常は「bload "map.dat",map」とかで終わり。 ; 0 1 2 3 4 5 6 7 8 910 1 2 3 4 5 6 7 8 9 map.0. 0=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 map.0. 1=1,3,2,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1 map.0. 2=1,0,2,0,2,0,0,0,0,0,0,1,1,1,1,1,1,1,0,1 map.0. 3=1,0,2,0,2,2,0,0,0,0,0,0,1,1,1,1,1,0,0,1 map.0. 4=1,0,0,0,2,2,2,0,0,0,0,0,0,1,1,1,1,0,0,1 map.0. 5=1,2,2,2,2,2,2,0,0,0,0,0,0,0,1,1,1,0,0,1 map.0. 6=1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1 map.0. 7=1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1 map.0. 8=1,1,0,0,0,0,0,2,2,0,0,0,2,2,0,0,0,2,2,1 map.0. 9=1,1,0,0,0,0,2,2,2,2,0,0,0,2,0,2,0,0,2,1 map.0.10=1,1,1,0,0,0,0,2,2,2,2,0,0,0,0,0,0,0,0,1 map.0.11=1,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,1 map.0.12=1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 map.0.13=1,1,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,1 map.0.14=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;ロケットを消すためにマップのみの画像を用意する buffer 4,mapwid*fsize,mapheit*fsize,1 color 1,1,1: boxf y=0 repeat mapheit repeat mapwid gx=map.cnt.y*fsize: gy=0 pos cnt*fsize,y*fsize: gcopy 3,gx,gy,fsize,fsize loop: y++ loop ;ウィンドウの表示 wid=scrwid*fsize: heit=scrheit*fsize screen 0,wid,heit,1,(ginfo_dispx-wid)/2,(ginfo_dispy-heit)/2 ;マップ表示 pos 0,0: gcopy 4,0,0,wid,heit ;ロケットの初期表示 cx=9: cy=7 ;ロケットのマップ座標 dir=0 ;ロケットの向き 0:上 1:右 2:下 3:左 pos cx*fsize,cy*fsize: gmode 2: gcopy 2,0,0,fsize,fsize ;ループ repeat: await stick c,15,1: flg=0 if c==1 { ;左 dx=-1: dy=0: flg=1: dir=3 } else { if c==2 { ;上 dx=0: dy=-1: flg=1: dir=0 } else { if c==4 { ;右 dx=1: dy=0: flg=1: dir=1 } else { if c==8 { ;下 dx=0: dy=1: flg=1: dir=2 } } } } if flg { mgx=cx*fsize: mgy=cy*fsize ex=cx+dx: ey=cy+dy if map.ex.ey==0 { ;進めるとき repeat num: await interval redraw 2 ;ロケットを消す gmode 0: pos mgx,mgy: gcopy 4,mgx,mgy,fsize,fsize ;ロケットを描く mgx+=dx*dot: mgy+=dy*dot gmode 2: pos mgx,mgy: gcopy 2,0,dir*fsize,fsize,fsize redraw 1 loop cx=ex: cy=ey } else { ;進めないとき(向きを変える) redraw 2 ;ロケットを消す gmode 0: pos mgx,mgy: gcopy 4,mgx,mgy,fsize,fsize ;ロケットを描く gmode 2: pos mgx,mgy: gcopy 2,0,dir*fsize,fsize,fsize redraw 1 } } loop