「ウソザナ」TEST2

「ウソザナ」のモンスターモジュールを作ってみました。


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

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

うまく起動するとこんな画面で自キャラを操作でき、モンスター10体が勝手に動きます。
ただし、当たり判定はまだ未実装です。


テスト方法

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

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

xana_test2.hsp

;
; プログラム  :「ウソザナ」を作ってみる TEST2
;
; 作成     :ふじぽん
;
; 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 モンスター10体移動
;

; ライセンスに関する表示
#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 "ウソザナ TEST2"		; 描画用
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)							; 移動計算
	m_myWalkcommit my									; 移動確定
	m_mydisp my											; 表示

	; モンスター
	foreach mon
		ret = m_monWalk(mon.cnt)						; 移動計算
		m_monWalkcommit mon.cnt							; 移動確定
		m_mondisp mon.cnt								; 表示
	loop

	redraw 1
	await wtime
	goto *main

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 新規作成
;

#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

		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

	; 位置確定
	#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