実験3Dダンジョン

Denziさんがおもしろそうなドット絵を作っておられたので、ウソザナ製作の息抜きにガツっと作ってみました。


適当なフォルダに次のファイルを用意し、HSPで3D_dungeon.hspを実行してみて下さい。

  • common.hsp (ここからゲット)
  • 3D_dungeon.hsp (↓からゲット)
  • Denzi091214-1.PNGDenziさんのところからゲット)※BMPで保存して下さい

うまく起動するとこんな画面でテストできます。


テスト方法

  • 矢印の左・右・下で方向(視点)を変えることができます。
  • 矢印の上で前に進みます。
  • 前に壁があると進めません。
  • 終わるときは閉じるボタンをクリックして下さい。


扉の画像も用意されていますが、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