TEST5
ウソザナのTEST3(自・敵移動)とTEST4(ステータス表示)を合わせてみました。
適当なフォルダに次のファイルを用意し、HSPでxana_test5.hspを実行してみて下さい。
- common.hsp (ここからゲット)
- xana_my.hsp (↓からゲット)自キャラモジュール
- xana_mon.hsp (↓からゲット)モンスターモジュール
- xana_screen.hsp (↓からゲット)画面表示用モジュール
- xana_test5.hsp (↓からゲット)テストスクリプト
- Xana_tile081213-2.PNG (DENZI部屋さんのところからゲット) ※XANADU風タイル(敵キャラ)をbmp保存して下さい
- Xana_tile060227-4.PNG (DENZI部屋さんのところからゲット) ※XANADU風タイル(自キャラ)をbmp保存して下さい
- Xana_tile070401-3.PNG (DENZI部屋さんのところからゲット) ※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