TEST3

自キャラとモンスターモジュールに、タイル同士の当たり判定を実装してみました。
キャラクターによっては当たっているように見えませんが、タイル判定ということでご了承ください。><


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

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

うまく起動するとこんな画面で自キャラを操作でき、モンスター10体が勝手に動きます。
キャラクターがいるところは進めません。

テスト方法

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

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


xana_test3.hsp

;
; プログラム  :「ウソザナ」を作ってみる TEST3
;
; 作成     :ふじぽん
;
; 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形式で利用します。
;
; 変更履歴
;  ver.1.0 2009/11/08 新規作成
;  ver.1.1 2009/11/13 モンスター5体移動
;  ver.1.2 2009/11/14 当たり判定(タイル)実装
;

; ライセンスに関する表示
#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_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	HO_LEFT			0					; 方向 左
	#const	global	HO_RIGHT		1					; 方向 右
	#const	global	HO_UP			2					; 方向 上
	#const	global	HO_DOWN			3					; 方向 下

#global

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

; 画面定義
screen sid_main, cx*9, cy*9: title "ウソザナ TEST3"		; 描画用
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					; 装備

; モンスター生成(10体)
repeat 10
	newmod mon, monster, cnt, cnt+16, rnd(9)*cx, rnd(9)*cy
loop

gsel sid_main
*main
	redraw 0: color 50,80,80: boxf						; 画面クリア

	; キー入力
	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: 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
			} 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

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 当たり判定(タイル)実装
;
#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, y: 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 当たり判定(タイル)実装
;

#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, y: 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 = (x + dx + cx*9) \ (cx*9)
		ny = (y + dy + cy*9) \ (cy*9)
		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