TEST8

「ウソザナ」TEST6 で作ったマップスクロールとTEST1(自キャラ移動)を合わせてみました。
少し自キャラ用モジュールに手を加えています。


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

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

うまく起動するとこんな画面でニセマップで自キャラを移動させることができます。
今回は、自キャラが端1タイル分のところまで来ないとマップスクロールしないようにしています。
当たり判定は実装していないので、空中を歩いたり、壁をぶち抜いて歩きます。(透明マント装備?w)


テスト方法

  • 矢印キー で自キャラが上下左右に4ドット単位で移動します。
  • ESCキー で終了します。


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

xana_test8.hsp

;
; プログラム  :「ウソザナ」を作ってみる TEST8
;
; 作成     :ふじぽん
;
; 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風タイル(ステータス)
;                     更新日    :2007年04月01日
;                     ファイル名:Xana_tile070401-3.png  ※BMP形式で利用します。
;
; 変更履歴
;  ver.1.0 2009/11/21 新規作成
;  ver.1.1 2009/11/22 TEST3(自・敵移動)+TEST4(ステータス表示)
;  ver.1.2 2009/12/09 TEST6 ニセマップスクロール
;  ver.1.3 2009/12/13 TEST6(マップスクロール)+TEST1(自移動)
;

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

; グローバル定数
#module

	; ウィンドウID
	#const	global	sid_main		0					; 描画用
	#const	global	sid_map			10					; マップ用
	#const	global	sid_myload		1					; 自キャラ読み込み用
	#const	global	sid_mycopy		11					; 自キャラgcopy用

	; 定数
	#const	global	cx				32					; キャラクターサイズX
	#const	global	cy				32					; キャラクターサイズY
	#const	global	wtime			30					; 描画待ち時間(ms)
	#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"									; 自キャラ用

; 画面生成
newmod scr, m_screen, "Xana_tile091129-2.bmp", 9, 9		; 画面表示用
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_scDraw		scr, 0

; 装備
;  服   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												; 装備種類

; 自キャラ生成
m_myPicset "Xana_tile060227-4.bmp"						; 自キャラ用
newmod my, charactor									
m_myEquip my, eq.0, eq.1, eq.2, eq.3					; 装備

; ニセマップ読込
buffer sid_map: picload "nisemap.bmp"

*start
gsel sid_main
redraw 0
gsel sid_map: m_mydisp my
gsel sid_main
gmode 1, 9*32, 9*32, 245
pos 16,16:	gcopy sid_map, mapx, mapy
redraw 1

*main
	await wtime

	; キー入力
	stick key,15,1

	; 移動計算
	ret = m_mywalk(my.0, key)

	; 移動確定
	m_myWalkcommit my

	if key&128 : end									; ESCで終了

	; マップスクロール処理
	myx=m_myX(my): myy=m_myY(my)
	if key&1 : if myx < mapx+32 : mapx = limit(mapx-4, 0, 20*32-32*9): goto *start
	if key&2 : if myy < mapy+32 : mapy = limit(mapy - 4, 0, 20*32-32*9): goto *start
	if key&4 : if mapx+7*32 < myx : mapx = limit(mapx + 4, 0, 20*32-32*9): goto *start
	if key&8 : if mapy+7*32 < myy : mapy = limit(mapy + 4, 0, 20*32-32*9): goto *start

	goto *start

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 描画位置変更
;  ver.1.3 2009/11/22 画像書換え方法変更(TEST5対策)
;  ver.1.4 2009/12/13 描画位置変更,移動範囲制限(TEST8対策)
;
#module charactor x, y, ho, pt, nx, ny, ox, oy, opt, oho

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

	; 変数初期化
	#modinit
		x = 4*cx: y = 4*cy: ox = -1
		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 0, 0, 10*cx-1, cy
		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

		; 表示変更の確認
		if (ox=x)*(oy=y)*(opt=pt)*(oho=ho) : return

		; 退避画像復元
		if ox > -1 {
			gsel sid_map: gmode 0, cx, cy
			pos ox, oy: gcopy sid_mycopy, 10*cx, 0
		}
	
		; 描画前画像退避
		gsel sid_mycopy: gmode 0, cx, cy
		pos 10*cx, 0: gcopy sid_map, x, y

		; 描画
		gsel sid_map: color 0, 133, 111: gmode 4, cx, cy,255
		redraw 1
		pos x, y: gcopy sid_mycopy, (ho*2+pt)*cx, 0
		redraw 0

		; 現情報退避
		ox = x: oy = y: opt = pt: oho = ho
		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 = limit(x + dx, cx, cx*18);(x + dx + cx*19) \ (cx*19)
		ny = limit(y + dy, cy, cy*18);(y + dy + cy*19) \ (cy*19)

		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