実験3Dダンジョン
Denziさんがおもしろそうなドット絵を作っておられたので、ウソザナ製作の息抜きにガツっと作ってみました。
適当なフォルダに次のファイルを用意し、HSPで3D_dungeon.hspを実行してみて下さい。
テスト方法
- 矢印の左・右・下で方向(視点)を変えることができます。
- 矢印の上で前に進みます。
- 前に壁があると進めません。
- 終わるときは閉じるボタンをクリックして下さい。
扉の画像も用意されていますが、2時間でスクリプトを書いたのでそこまで実装できていません。^^;
このスクリプトは、時間があれば改版していきたいと思います。
3D_dungeon.hsp
; ; プログラム :「実験3Dダンジョン」を作ってみる ; ; 作成 :ふじぽん ; ; Copyright :http://d.hatena.ne.jp/fujiponXP ; ; 利用素材 : ; ; □ドット絵 :DENZI日記(http://d.hatena.ne.jp/Denzi/20091214) ; ファイル名:Denzi091214-1.PNG ※BMP形式で利用します。 ; ; 変更履歴 ; ver.1.0 2009/12/15 新規作成 ; ; ライセンスに関する表示 #include "common.hsp" about_lisence dim view,10 dim map,11,11 map(0,0)=1,1,1,1,1,1,1,1,1,1,1 map(0,1)=1,1,1,1,1,1,1,1,1,1,1 map(0,2)=1,1,0,1,0,0,0,0,0,1,1 map(0,3)=1,1,0,1,0,1,0,1,0,1,1 map(0,4)=1,1,0,0,0,1,0,1,1,1,1 map(0,5)=1,1,1,0,1,1,0,0,0,1,1 map(0,6)=1,1,0,0,0,1,0,1,0,1,1 map(0,7)=1,1,0,0,0,0,1,0,0,1,1 map(0,8)=1,1,0,0,1,0,0,0,1,1,1 map(0,9)=1,1,1,1,1,1,1,1,1,1,1 map(0,9)=1,1,1,1,1,1,1,1,1,1,1 color 61,97,97 ; 透明色 screen 0,6*32,2*32: title "3Dダンジョン": color: boxf buffer 1: picload "Denzi091214-1.bmp" ; 方向(ho) 0=← 1=↑ 2=→ 3=↓ x=2: y=2: ho=1 *main switch ho case 0 gosub *ho_left swbreak case 1 gosub *ho_up swbreak case 2 gosub *ho_right swbreak case 3 gosub *ho_down swbreak swend gosub *draw *keywait await 100 stick key,255 if key=0: goto *keywait if key&1: ho=(3+ho)\4 ; 左に向く if key&2: gosub *walk ; 前に進む if key&4: ho=(ho+1)\4 ; 右に向く if key&8: ho=(ho+2)\4 ; 後ろを向く goto *main *walk vx=x+(ho=2)-(ho=0) vy=y+(ho=3)-(ho=1) if map(vx,vy)=0 :x=vx: y=vy return *ho_left view(1)=map(x-2,y+1) view(2)=map(x-2,y ) view(3)=map(x-2,y-1) view(4)=map(x-1,y+1) view(5)=map(x-1,y ) view(6)=map(x-1,y-1) view(7)=map(x ,y+1) view(8)=map(x ,y ) view(9)=map(x ,y-1) return *ho_up view(1)=map(x-1,y-2) view(2)=map(x ,y-2) view(3)=map(x+1,y-2) view(4)=map(x-1,y-1) view(5)=map(x ,y-1) view(6)=map(x+1,y-1) view(7)=map(x-1,y ) view(8)=map(x ,y ) view(9)=map(x+1,y ) return *ho_right view(1)=map(x+2,y-1) view(2)=map(x+2,y ) view(3)=map(x+2,y+1) view(4)=map(x+1,y-1) view(5)=map(x+1,y ) view(6)=map(x+1,y+1) view(7)=map(x ,y-1) view(8)=map(x ,y ) view(9)=map(x ,y+1) return *ho_down view(1)=map(x+1,y+2) view(2)=map(x ,y+2) view(3)=map(x-1,y+2) view(4)=map(x+1,y+1) view(5)=map(x ,y+1) view(6)=map(x-1,y+1) view(7)=map(x+1,y ) view(8)=map(x ,y ) view(9)=map(x-1,y ) return *draw ; 123 ; 456 ; 789...8が自分の位置(2を向いている) gsel 0: redraw 0 ; 何もなし pos 0,0: gcopy 1, 16,64, 16,32 pos 16,0: gcopy 1, 16,64, 16,32 pos 32,0: gcopy 1, 16,64, 16,32 pos 48,0: gcopy 1, 16,64, 16,32 ; 1壁あり if view(1) { pos 16,0: gcopy 1, 0,64, 8,32 pos 0,0: gcopy 1,32,64, 16,32 } ; 3壁あり if view(3) { pos 40,0: gcopy 1, 8,64, 8,32 pos 48,0: gcopy 1,32,64, 16,32 } ; 2壁あり if view(2) { pos 16,0: gcopy 1,32,64, 16,32 pos 32,0: gcopy 1,32,64, 16,32 } ; 4壁あり if view(4) { pos 0,0: gcopy 1,64,64, 16,32 } ; 6壁あり if view(6) { pos 48,0: gcopy 1,96,64, 16,32 } ; 5壁あり if view(5) { pos 8,0: gcopy 1,80,64, 16,32 pos 24,0: gcopy 1,80,64, 16,32 pos 40,0: gcopy 1,80,64, 16,32 } ; 7壁あり if view(7) { pos 0,0: gcopy 1,48,64, 8,32 } ; 9壁あり if view(9) { pos 56,0: gcopy 1,120,64, 8,32 } redraw 1 return