TEST5

ウソザナのTEST3(自・敵移動)とTEST4(ステータス表示)を合わせてみました。


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

  • common.hsp (ここからゲット)
  • xana_my.hsp (↓からゲット)自キャラモジュール
  • xana_mon.hsp (↓からゲット)モンスターモジュール
  • xana_screen.hsp (↓からゲット)画面表示用モジュール
  • xana_test5.hsp (↓からゲット)テストスクリプト
  • Xana_tile081213-2.PNGDENZI部屋さんのところからゲット) ※XANADU風タイル(敵キャラ)をbmp保存して下さい
  • Xana_tile060227-4.PNGDENZI部屋さんのところからゲット) ※XANADU風タイル(自キャラ)をbmp保存して下さい
  • Xana_tile070401-3.PNGDENZI部屋さんのところからゲット) ※XANADU風タイル(ステータス)をbmp保存して下さい

うまく起動するとこんな画面でFIRE ELEMENTとウソバトルできます。


テスト方法

  • 矢印キー で上下左右に移動します。
  • SPACEキーで装備を変更します。
  • TABキー で装備種別を変更します。
  • ESCキー で終了します。

ステータス表示モジュールと合わせるために、自キャラモジュール、モンスターモジュール、画面表示用モジュールも修正しているので、これらも忘れずにゲットしておいてください。
FILE ELEMENT のHitPointはランダムで表示させているだけで、死にませんw
しかも、アタック中は画面がチカチカして見にくいです><うーん


スクリプトは、今後も改良していく予定です。

xana_my.hsp

;
; モジュール定義:「ウソザナ」自キャラ用
; 作成     :ふじぽん
;
; モジュール名 :charactor
;
; モジュール変数:位置x,y, 方向ho, パターンpt, 移動計算用nx,ny
;
; Copyright   :http://d.hatena.ne.jp/fujiponXP
;
; 変更履歴
;  ver.1.0 2009/11/08 新規作成
;  ver.1.1 2009/11/14 当たり判定(タイル)実装
;  ver.1.2 2009/11/21 描画位置変更
;
#module charactor x, y, ho, pt, nx, ny

	; 画像セット
	#deffunc m_myPicset str fname
		buffer sid_myload: picload fname	; オリジナル画像用
		buffer sid_mycopy, 10*cx, cy		; gcopy用
		return

	; 変数初期化
	#modinit
		x = 8*cx: y = 4*cy: ho = 0: pt = 0
		gsel sid_mycopy: pos 8*cx, 0: gcopy sid_myload, 2*cx, 5*cy, cx, cy
		return

	; 装備
	#modfunc m_myEquip int p1, int p2, int p3, int p4

		gsel sid_mycopy: boxf
		pos 0   ,0: gcopy sid_myload, 2*cx, p1*cy, 8*cx, cy					; 体
		pos 9*cx,0: gcopy sid_myload, (3+(p1=1 | p1=4))*cx, 5*cy, cx, cy	; 死亡

		color 0, 133, 111: gmode 4, 8*cx, cy,255
		if p2 > 0 : pos 0, 0: gcopy sid_myload,  2*cx, (p2+12)*cy			; 頭
		if p3 > 0 : pos 0, 0: gcopy sid_myload, 12*cx, (p3- 1)*cy			; 盾
		if p4 > 0 : pos 0, 0: gcopy sid_myload, 12*cx, (p4+ 3)*cy			; 武器

		return

	; 描画
	#modfunc m_myDisp
		gsel sid_main: color 0, 133, 111: gmode 4, cx, cy,255
		pos x+16, y+16: gcopy sid_mycopy, (ho*2+pt)*cx, 0
		return

	; 移動計算
	#modcfunc m_myWalk int k
		key = k: dx = 0: dy = 0
		if key&1 :dx = -4: ho = HO_LEFT : key=0			; 左移動
		if key&4 :dx =  4: ho = HO_RIGHT: key=0			; 右移動
		if key&2 :dy = -4: ho = HO_UP   : key=0			; 上移動
		if key&8 :dy =  4: ho = HO_DOWN : key=0			; 下移動

		if (dx=0) and (dy=0) : nx = x: ny = y: return 0
		nx = (x + dx + cx*8) \ (cx*8)
		ny = (y + dy + cy*8) \ (cy*8)

		pt = (pt + 1) \ 2
		return 1

	; 当たり判定
	#modcfunc m_myHitcheck int px, int py
		ret = (abs(x - px) < cx) & (abs(y - py) < cy)
		return ret

	; 位置確定
	#modfunc m_myWalkcommit
		x = nx: y = ny
		return

	; 位置x
	#modcfunc m_myX
		return x

	; 位置y
	#modcfunc m_myY
		return y

	; 位置nx
	#modcfunc m_myNX
		return nx

	; 位置ny
	#modcfunc m_myNY
		return ny

	; 方向ho
	#modcfunc m_myHo
		return ho

#global

xana_mon.hsp

;
; モジュール定義:「ウソザナ」モンスター用
; 作成     :ふじぽん
;
; モジュール名 :monster
;
; モジュール変数:
;                no      キャラno
;                x, y    現在位置
;                nx, ny  移動計算用
;                ho      方向
;                pt      パターン
;                sp      種類
;
; Copyright   :http://d.hatena.ne.jp/fujiponXP
;
; 変更履歴
;  ver.1.0 2009/11/13 新規作成
;  ver.1.1 2009/11/14 当たり判定(タイル)実装
;  ver.1.2 2009/11/21 描画位置変更, 移動範囲変更
;

#module monster no, x, y, nx, ny, ho, pt, sp

	; 画像セット
	#deffunc m_monPicset str fname
		buffer sid_monload: picload fname	; オリジナル画像読込み用
		buffer sid_moncopy, 4*cx, 20*cy		; gcopy用(20体分)
		return

	; 変数初期化
	#modinit int pno, int psp, int px, int py 
		no = pno: x = px*cx: y = py*cy: ho = HO_UP: pt = 0: sp = psp
		gsel sid_moncopy
		pos 0     ,no*cy: gcopy sid_monload, (sp\16)*2*cx, (sp/16)*cy, 2*cx, cy				; 左向き
		pos 4*cx-1,no*cy: gzoom -2*cx, cy, sid_monload, (sp\16)*2*cx, (sp/16)*cy, 2*cx, cy	; 右向き
		return

	; 描画
	#modfunc m_monDisp
		gsel sid_main: color 0, 143, 122: gmode 4, cx, cy, 255
		pos x+16, y+16: gcopy sid_moncopy, ((ho\2)*2+pt)*cx, no*cy
		return

	; 移動計算(ret=0 移動無 ret=1 移動有)
	#modcfunc m_monWalk
		nx = x: ny = y
		if rnd(3) : return 0
		if rnd(30)=1 : ho = m_monTurnright( ho )		; 方向変換

		dx = ((ho=HO_RIGHT) - (ho=HO_LEFT)) * 4
		dy = ((ho=HO_DOWN ) - (ho=HO_UP  )) * 4
		nx = limit(x + dx, cx, ((mapsizex-2)*cx))
		ny = limit(y + dy, cy, ((mapsizey-2)*cy))
		pt = (pt + 1) \ 2

		return 1

	; 当たり判定
	#modcfunc m_monHitcheck int px, int py
		return (abs(x - px) < cx) & (abs(y - py) < cy) 

	; 位置確定
	#modfunc m_monWalkcommit
		x = nx: y = ny
		return

	; 方向転換 右回り
	#defcfunc m_monTurnright int h

		switch h
			case HO_LEFT
				ret = HO_UP
				swbreak
			case HO_UP
				ret = HO_RIGHT
				swbreak
			case HO_RIGHT
				ret = HO_DOWN
				swbreak
			case HO_DOWN
				ret = HO_LEFT
				swbreak
		swend

		return ret

	; 位置x
	#modcfunc m_monX
		return x

	; 位置y
	#modcfunc m_monY
		return y

	; 位置nx
	#modcfunc m_monNX
		return nx

	; 位置ny
	#modcfunc m_monNY
		return ny

	; 方向ho
	#modcfunc m_monHo
		return ho

#global

xana_screen.hsp

;
; モジュール定義:「ウソザナ」画面表示用
; 作成     :ふじぽん
;
; モジュール名 :m_xana_screen
;
; モジュール変数:メッセージ表示Y位置mespos, 表示情報数値配列v_int, 表示情報文字列配列v_str
;
; Copyright   :http://d.hatena.ne.jp/fujiponXP
;
; 変更履歴
;  ver.1.0 2009/11/21 新規作成
;  ver.1.1 2009/11/22 画面描画指定追加
;
#module	m_screen mespos, v_int, v_str

	;マクロ定義
	#define	C_BLACK		  0,  0,  0
	#define	C_GLAY		120,120,120
	#define	C_RED		255,  0,  0
	#define	C_BLUE		  0,  0,255
	#define	C_WHITE		255,255,255
	#define C_FONT_SIZE	11

	; 変数初期化
	#modinit	str chipfile
		dim  v_int, 28, 4											; 位置x, 色r,g,b
		sdim v_str, 28												; 表示文字列

		; 変数設定
		mespos = 0

		; 画面設定
		screen sid_main, cx * (mapsizex + 7), cy * (mapsizey + 1): title "ウソザナ"
		buffer sid_scrload: picload chipfile

		;マップ枠描画
		gsel sid_main
		repeat ginfo_sy/16: y=cnt
			repeat ginfo_sx/16: x=cnt
				pos x*16,y*16: gcopy sid_scrload, 64, 0, 16, 16
			loop
		loop
		color C_BLACK : boxf 16 - 2, 16 - 2, cx * mapsizex + 16 + 2, cy * mapsizey + 16 + 2 
		color C_BLUE  : boxf 16    , 16    , cx * mapsizex + 16    , cy * mapsizey + 16

		; ステータス欄
		color C_BLACK: boxf (mapsizex*2+2)*16-2, 2, (mapsizex*2+13)*16+13, 19*16+13
		color C_GLAY : boxf (mapsizex*2+2)*16  , 4, (mapsizex*2+13)*16+11, 19*16+11

		; メッセージ欄
		color   0, 0, 0: boxf (mapsizex*2+2)*16+4, 7*32+4, (mapsizex*2+13)*16+8, 19*16+8
		color 255, 0, 0: boxf (mapsizex*2+2)*16+6, 7*32+6, (mapsizex*2+13)*16+6, 19*16+6
		color   0, 0, 0: boxf (mapsizex*2+2)*16+8, 7*32+8, (mapsizex*2+13)*16+4, 19*16+4

		; フォント設定
		font "Georgia", C_FONT_SIZE, font_bold

		m_ValueSet thismod,  2, 0, C_BLACK, "Hit Points"
		m_ValueSet thismod,  4, 0, C_BLACK, "Gold"
		m_ValueSet thismod,  6, 0, C_BLACK, "Food"
		m_ValueSet thismod,  8, 0, C_BLACK, "Experience"
		m_ValueSet thismod, 11, 0, C_BLACK, "Equipment"

		return

	; 表示情報セット
	#modfunc m_ValueSet int py, int px, int pr, int pg, int pb, str pv
		v_int.py.0 = px												; 表示X位置
		v_int.py.1 = pr												; 赤色 
		v_int.py.2 = pg												; 緑色 
		v_int.py.3 = pb												; 青色
		v_str.py   = pv												; 文字列
		return

	; 表示 flg(0:通常 1:戦闘)
	#modfunc	m_scDraw	int flg
		gsel sid_main
		redraw 0
		color C_GLAY
		boxf 20 * 16, 4, 30 * 16 + 27, 12 * 19 - 1
		repeat 17
			n = cnt + (cnt > 5) * 11 * flg
			m_scPrint v_int.n.1, v_int.n.2, v_int.n.3, v_int.n.0, cnt, v_str.n
		loop
		redraw 1
		return

	; メッセージ表示
	#modfunc	m_scMes	str p1
		redraw 1
		if msgpos > 4 {
			x = (mapsizex + 1) * 32 + 10: y = 7 * 32 + 10
			repeat 14
				pos x, y
				gcopy sid_main, x, y + 1, 10 * 16 + 7, 5 * 16 -6
				await 10
			loop
			msgpos = 4
		}
		m_scPrint C_WHITE, 1, 18 + msgpos, p1
		msgpos += 1
		redraw 0
		await 10

		return

	; 文字列表示
	#deffunc	m_scPrint	int pr, int pg, int pb, int px, int py, str ps
		x = px * C_FONT_SIZE + 10 * 32 + 4
		y = py * (C_FONT_SIZE+2) + 4

		; 影表示
		s = ps
		if (pr + pb + pg) > 0 {
			color C_BLACK
			repeat strlen(s)
				pos x + 2 + cnt * (C_FONT_SIZE+1), y + 1: mes strmid(s, cnt, 1)
			loop
		}

		; 文字表示
		color pr, pg, pb
		repeat strlen(s)
			c = strmid(s, cnt, 1)
			pos x + 0 + cnt * (C_FONT_SIZE+1), y: mes c
			pos x + 1 + cnt * (C_FONT_SIZE+1), y: mes c
		loop
		return

	; 名前
	#modfunc	m_scName	str ps
		m_ValueSet thismod,  0, 0, C_RED, ps
		return

	; 称号
	#modfunc	m_scTitle	str ps
		m_ValueSet thismod,  1, 0, C_WHITE, ps
		return

	; 体力
	#modfunc	m_scHitPoints	int p1
		m_ValueSet thismod,  3, 5, C_WHITE, strf("%07d", p1)
		return

	; 所持金
	#modfunc	m_scGold	int p1
		m_ValueSet thismod,  5, 5, C_WHITE, strf("%07d", p1)
		return

	; 食料
	#modfunc	m_scFood	int p1
		m_ValueSet thismod,  7, 5, C_WHITE, strf("%07d", p1)
		return

	; 攻撃経験値
	#modfunc	m_scExpAt	int p1
		m_ValueSet thismod,  9, 5, C_WHITE, strf("%07d", p1)
		return

	; 魔法経験値
	#modfunc	m_scExpMg	int p1
		m_ValueSet thismod, 10, 5, C_WHITE, strf("%07d", p1)
		return

	; 武器
	#modfunc	m_scWepon	str ps
		m_ValueSet thismod, 12, 0, C_RED, ps
		return

	; 魔法
	#modfunc	m_scMagic	str ps
		m_ValueSet thismod, 13, 0, C_RED, ps
		return

	; 装備
	#modfunc	m_scWear	str ps
		m_ValueSet thismod, 14, 0, C_RED, ps
		return

	; 盾
	#modfunc	m_scShield	str ps
		m_ValueSet thismod, 15, 0, C_RED, ps
		return

	; 道具
	#modfunc	m_scItem	str ps
		m_ValueSet thismod, 16, 0, C_RED, ps
		return

	; モンスター名
	#modfunc	m_scMonName	str ps
		for i, 17, 28, 1
			if i = 18 {
				m_ValueSet thismod, i, 0, C_BLACK, ps
			} else {
				m_ValueSet thismod, i, 0, C_BLACK, ""
			}
		next
		return

	; モンスター体力
	#modfunc	m_scMonHP	int p1, int p2
		m_ValueSet thismod, 19 + p1, 5, C_WHITE, strf("%07d", p2)
		return

#global

xana_test5.hsp

;
; プログラム  :「ウソザナ」を作ってみる TEST5
;
; 作成     :ふじぽん
;
; Copyright   :http://d.hatena.ne.jp/fujiponXP
;
; 利用素材   :
;
;     □ドット絵   :DENZI部屋(http://www3.wind.ne.jp/DENZI/diary/)
;                     タイトル  :XANADU風タイル(自キャラ)
;                     更新日    :2006年02月28日
;                     ファイル名:Xana_tile060227-4.png  ※BMP形式で利用します。
;
;                     タイトル  :XANADU風タイル(敵キャラ)
;                     更新日    :2008年12月22日
;                     ファイル名:Xana_tile081213-2.png  ※BMP形式で利用します。
;
;                     タイトル  :XANADU風タイル(ステータス)
;                     更新日    :2007年04月01日
;                     ファイル名:Xana_tile070401-3.png  ※BMP形式で利用します。
;
; 変更履歴
;  ver.1.0 2009/11/21 新規作成
;  ver.1.1 2009/11/22 TEST3(自・敵移動)+TEST4(ステータス表示)
;

; ライセンスに関する表示
#include "common.hsp"
about_lisence

; グローバル定数
#module

	; ウィンドウID
	#const	global	sid_main		0					; 描画用
	#const	global	sid_myload		1					; 自キャラ読み込み用
	#const	global	sid_monload		2					; モンスター読み込み用
	#const	global	sid_scrload		4					; 画面読み込み用
	#const	global	sid_mycopy		11					; 自キャラgcopy用
	#const	global	sid_moncopy		12					; モンスター読み込み用

	; 定数
	#const	global	cx				32					; キャラクターサイズX
	#const	global	cy				32					; キャラクターサイズY
	#const	global	wtime			50					; 描画待ち時間(ms)
	#const	global	mapsizex		9					; マップサイズX
	#const	global	mapsizey		9					; マップサイズY
	#const	global	HO_LEFT			0					; 方向 左
	#const	global	HO_RIGHT		1					; 方向 右
	#const	global	HO_UP			2					; 方向 上
	#const	global	HO_DOWN			3					; 方向 下

#global

; モジュール読み込み
#include "xana_screen.hsp"								; 画面表示用
#include "xana_my.hsp"									; 自キャラ用
#include "xana_mon.hsp"									; モンスター用

; 画面生成
newmod scr, m_screen, "Xana_tile070401-3.bmp"			; 画面表示用
m_myPicset  "Xana_tile060227-4.bmp"						; 自キャラ用
m_monPicset "Xana_tile081213-2.bmp"						; モンスター用

; 装備
;  服   0:ノーマル赤 1:ノーマル白 2:レーザーアーマー 3:ハーフプレート 4:フルプレート
;  頭   0:なし 1:フルヘルム 2:プレートヘルム 3:赤髪 4:白髪 5:茶髪
;  盾   0:なし 1:赤小 2:赤大 3:黒小 4:黒大
;  武器 0:なし 1:剣 2:槍 3:杖 4:斧 5:弓 6:鈍器
dim eq   , 4: eq.0    = 0, 0, 0, 0
dim eqmax, 4: eqmax.0 = 5, 6, 5, 7

; 変数設定
eqpos = 0												; 装備種類

; 自キャラ生成
newmod my, charactor									
m_myEquip my, eq.0, eq.1, eq.2, eq.3					; 装備

; モンスター生成(9体 No.59)
repeat 9
	newmod mon, monster, cnt, 59, rnd(7)+1, rnd(7)+1
loop

m_scName		scr, "Fujipon"
m_scTitle		scr, "NoviceFighter"
m_scHitPoints	scr, 1250
m_scGold		scr, 12500
m_scFood		scr, 7845
m_scExpAt		scr, 1000
m_scExpMg		scr, 0
m_scWepon		scr, "Dagger"
m_scMagic		scr, "Needle"
m_scWear 		scr, "Cloth"
m_scShield		scr, "Gloves"
m_scItem 		scr, "Spectacles"

m_scMonName		scr, "Fire-Element"
repeat length(mon)
	m_scMonHP	scr, cnt, 100
loop
m_scDraw		scr, 1

gsel sid_main
*main
	redraw 0: color 0,0,255: boxf 16, 16, mapsizex * cx + 16, mapsizey * cy + 16	; 画面クリア

	; キー入力
	stick key,15,1
	if key&128 : end									; ESCで終了
	if key&1024 : eqpos = (eqpos + 1) \ 4				; TABで種類を変更
	if key&16 {											; SPACEで装備を変更
		eq.eqpos = (eq.eqpos + 1) \ eqmax.eqpos
		m_myEquip my, eq.0, eq.1, eq.2, eq.3
	}

	; 自キャラ
	ret = m_mywalk(my.0, key)							; 移動計算
	if ret {
		nx = m_myNX(my.0): ny = m_myNY(my.0)
		foreach mon
			if m_monHitcheck(mon.cnt, nx, ny) > 0 {
				ret = 0
				at = rnd(10)
				m_scMes		scr, "Hit-"+at
				m_scMonHP	scr, cnt, 100-at
				m_scDraw	scr, 1
				break
			}
		loop
		if ret : m_myWalkcommit my						; 移動確定
	}
	m_mydisp my											; 表示

	; モンスター
	foreach mon: n = cnt
		ret = m_monWalk(mon.n)							; 移動計算
		if ret {
			nx = m_monNX(mon.n): ny = m_monNY(mon.n)
			if m_myHitcheck(my.0, nx, ny) > 0 {
				ret = 0
				m_scMes scr, "DMG-"+rnd(10)
			} else {
				foreach mon
					if (cnt != n) & (m_monHitcheck(mon.cnt, nx, ny) > 0) : ret = 0
				loop
			}
		}
		if ret : m_monWalkcommit mon.cnt				; 移動確定
		m_mondisp mon.n									; 表示
	loop

	redraw 1
	await wtime
	goto *main