TEST9
これまでに作ってきたモジュールを組み合わせてみました。
ほとんどのモジュールに手を加えているため、スクリプトの公開は長くなっています。;;
(ファイルアップロードを出来るようにするとよいのですが・・・すみません)
適当なフォルダに次のファイルを用意し、HSPでxana_test9.hspを実行してみて下さい。
- common.hsp (ここからゲット)
- xana_test9.hsp (↓からゲット)テストスクリプト
- xana_screen.hsp (↓からゲット)画面表示用モジュール
- xana_menu.hsp (↓からゲット)メニュー用モジュール
- xana_my.hsp (↓からゲット)自キャラ用モジュール
- xana_mon.hsp (↓からゲット)モンスター用モジュール
- Xana_tile060227-4.PNG (DENZI部屋さんのところからゲット) ※XANADU風タイル(自キャラ)をbmp保存して下さい
- Xana_tile081213-2.PNG (DENZI部屋さんのところからゲット) ※XANADU風タイル(敵キャラ)をbmp保存して下さい
- Xana_tile091129-2.PNG (DENZI部屋さんのところからゲット) ※XANADU風タイル(ステータス、他)をbmp保存して下さい
- Xana_tile081213-1.PNG (DENZI部屋さんのところからゲット) ※XANADU風タイル(マップ)をbmp保存して下さい
うまく起動するとこんな画面でミニ・マップ内を移動させることができます。
モンスターとのバトルはまだ出来ません。
テスト方法
- 矢印キー で上下左右に移動します。
- ESCキー でメニューを開いて終了選択できます。
自キャラとモンスターが重なり合うと、画面が崩れる事象が起きる場合があります。
(エンカウント処理を実装すれば解決できるので放置してます^^;)
また、モンスターの移動処理はまだ改良の余地ありです。
ウソザナ完成は、まだまだ、まだまだ先です。^^;
xana_test9.hsp
; ; プログラム :「ウソザナ」を作ってみる TEST9 ; ; 作成 :ふじぽん ; ; 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形式で利用します。 ; ; タイトル :XANADU風タイル(マップ) ; 更新日 :2008年12月22日 ; ファイル名:Xana_tile081213-1.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(自移動) ; ver.1.4 2009/12/20 これまでのモジュール(自キャラ、モンスタ、画面、メニュー、共通)を組み合わせてみる ; ; ライセンスに関する表示 #include "common.hsp" about_lisence ; 乱数発生の初期化 randomize ; 定数 #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 ; 方向 下 #const global sid_main 0 ; 描画用 #const global sid_monload 11 ; モンスター読み込み用 #const global sid_moncopy 12 ; モンスターgcopy用 ; モジュール読込 #include "xana_menu.hsp" #include "xana_screen.hsp" #include "xana_my.hsp" #include "xana_mon.hsp" ; 画面生成 newmod scr, m_screen, "Xana_tile091129-2.bmp", 9, 9 ; 画面表示用 m_scName scr, "Fujipon" m_scTitle scr, "UsoXanaFighter" 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 celload "Xana_tile081213-1.bmp",1: celdiv 1,cx,cy ; マップチップ newmod menu, m_menu ; メニュー ; マップ変数定義 dim MapData,9,9 dim MapAction,9,9 MapData(0,0)= 1,237, 29,159, 31,237,237,237, 1 MapData(0,1)= 1,237, 13, 55, 15,237,237,237, 1 MapData(0,2)= 1, 1, 1, 1, 1, 1, 1, 32, 1 MapData(0,3)= 1, 35, 36, 38, 39, 38, 39, 32, 1 MapData(0,4)= 50, 0, 0, 0, 0, 0, 0, 32, 50 MapData(0,5)= 1, 77, 60, 58, 32, 1, 1, 1, 1 MapData(0,6)= 1, 93, 41, 74, 32, 16, 37, 39, 1 MapData(0,7)= 1,105, 47, 90, 32, 16, 0, 18, 1 MapData(0,8)= 50, 1, 1, 1, 50, 1, 1, 1, 50 ; 0=自由移動 1:移動不可 5:落下 MapAction(0,0)=1,5,5,5,5,5,5,5,1 MapAction(0,1)=1,5,5,5,5,5,5,5,1 MapAction(0,2)=1,1,1,1,1,1,1,0,1 MapAction(0,3)=1,1,1,1,1,1,1,0,1 MapAction(0,4)=1,5,5,5,5,5,5,0,1 MapAction(0,5)=1,5,5,5,0,1,1,1,1 MapAction(0,6)=1,5,5,5,0,5,1,1,1 MapAction(0,7)=1,5,5,5,0,5,5,5,1 MapAction(0,8)=1,1,1,1,1,1,1,1,1 ; マップ描画 gsel sid_main for i,0,9 for j,0,9 pos j*cx+16,i*cy+16 celput 1,MapData(j,i) next next ; 装備 ; 服 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 = 2, 3, 1, 1 dim eqmax, 4: eqmax.0 = 5, 6, 5, 7 ; 変数設定 eqpos = 0 ; 装備種類 ; 自キャラ生成 newmod my, charactor, "Xana_tile060227-4.bmp", sid_main, 16, 16 m_myEquip my, eq.0, eq.1, eq.2, eq.3 ; 装備 m_myPos my, cx, cy, HO_RIGHT ; モンスター生成 m_monPicset "Xana_tile081213-2.bmp" ; モンスター用 newmod mon, monster, 0, 59, %0110, 16, 16 ; FireElement newmod mon, monster, 1, 16, %1010, 16, 16 ; Bat m_monPos mon.0, 2*cx, 6*cy, HO_RIGHT m_monPos mon.1, 1*cx, 4*cy, HO_RIGHT *start ; 描画 redraw 0 m_mydisp my.0 ; 自キャラ foreach mon m_mondisp mon.cnt ; モンスター loop redraw 1: await wtime ; 自キャラ stick key,255 ; キー入力 if key&128 : gosub *menu_open ; システムメニュー ret = m_myFall(my.0, MapAction) ; 落下判定 if ret = 0 : ret = m_myWalk(my.0, key, MapAction) ; 移動処理 if ret { check_x = m_myNX(my.0) check_y = m_myNY(my.0) foreach mon if m_monHitcheck(mon.cnt, check_x, check_y) : encount = 1: ret = 0 ; エンカウント(未実装) loop } if ret : m_myWalkcommit my.0 ; 移動確定 ; モンスター foreach mon: i=cnt ret = m_monFall(mon.i, MapAction) ; 落下判定 if ret = 0 : ret = m_monWalk(mon.i, MapAction) ; 移動処理 if ret { check_x = m_monX(mon.i) check_y = m_monY(mon.i) if m_myHitcheck(my.0, check_x, check_y) : encount = 1 ; エンカウント(未実装) foreach mon if i!=cnt and m_monHitcheck(mon.cnt, check_x, check_y) : m_monTurn mon.i loop } if ret : m_monWalkcommit mon.i ; 移動確定 loop ; エンカウント if encount { m_scMes scr, "Encount" encount = 0 } goto *start ; メイン操作不可、ダイアログ表示 *menu_open gsel 0: ws_set WS_DISABLED *menu_main sdim menustr menustr(0)="システムメニュー" menustr(1)="ゲームに戻る" menustr(2)="終了する" ret = m_menuDisp(menu, menustr, length(menustr)) if ret=0 or ret=1: goto *menu_close if ret=2 : end goto *menu_main ; メイン操作不可解除、ダイアログ非表示 *menu_close gsel 0,1: ws_reset WS_DISABLED return
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/12/06 オリジナル画像読込用SID, 表示サイズmapsize をモジュール変数として組み込み ; ver.1.2 2009/12/20 SYSMENUリセット追加 ; #module m_screen mespos, v_int, v_str, sid_load, mapsizex, mapsizey ;マクロ定義 #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, int px, int py dim v_int, 28, 4 ; 位置x, 色r,g,b sdim v_str, 28 ; 表示文字列 ; 変数設定 mespos = 0 sid_load = ginfo(25) mapsizex = px mapsizey = py ; 画面設定 screen sid_main, cx * (mapsizex + 7), cy * (mapsizey + 1), screen_fixedsize ws_reset WS_SYSMENU title "ウソザナ" buffer sid_load: picload chipfile ;マップ枠描画 gsel sid_main repeat ginfo_sy/16: y=cnt repeat ginfo_sx/16: x=cnt pos x*16,y*16: gcopy sid_load, 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 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 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 } redraw 0 m_scPrint C_WHITE, 1, 18 + msgpos, p1 redraw 1 msgpos += 1 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_scItmExp for i,0,(mapsizey+1)*2,1 for j,0,(mapsizex+7)*2,1 pos j*16, i*16: gcopy sid_scrload, 32, 0, 16, 16 next next color 0, 0, 0:boxf 1*16, 1*16, 6*16, 2*16 color 255,255,255:pos 1*16, 1*16: mes "Experience" color 0, 0, 0:boxf 1*16, 3*16, 4*16, 4*16 color 255,255,255:pos 1*16, 3*16: mes "WEPON" repeat 9 color 0, 0, 0:boxf (5+cnt*3)*16, 3*16, (7+cnt*3)*16, 4*16 color 255,255,255:pos (5+cnt*3)*16, 3*16: mes "000" loop repeat 8 color 0, 0, 0:boxf (5+cnt*3)*16, 5*16, (7+cnt*3)*16, 6*16 color 255,255,255:pos (5+cnt*3)*16, 5*16: mes "000" loop color 0, 0, 0:boxf 1*16, 7*16, 4*16, 8*16 color 255,255,255:pos 1*16, 7*16: mes "SCROLL" repeat 9 color 0, 0, 0:boxf (5+cnt*3)*16, 7*16, (7+cnt*3)*16, 8*16 color 255,255,255:pos (5+cnt*3)*16, 7*16: mes "000" loop repeat 8 color 0, 0, 0:boxf (5+cnt*3)*16, 9*16, (7+cnt*3)*16,10*16 color 255,255,255:pos (5+cnt*3)*16, 9*16: mes "000" loop color 0, 0, 0:boxf 1*16, 11*16, 4*16, 12*16 color 255,255,255:pos 1*16, 11*16: mes "ARMOR" repeat 9 color 0, 0, 0:boxf (5+cnt*3)*16, 11*16, (7+cnt*3)*16, 12*16 color 255,255,255:pos (5+cnt*3)*16, 11*16: mes "000" loop repeat 8 color 0, 0, 0:boxf (5+cnt*3)*16, 13*16, (7+cnt*3)*16,14*16 color 255,255,255:pos (5+cnt*3)*16, 13*16: mes "000" loop color 0, 0, 0:boxf 1*16, 14*16, 4*16, 15*16 color 255,255,255:pos 1*16, 14*16: mes "SHIELD" repeat 9 color 0, 0, 0:boxf (5+cnt*3)*16, 14*16, (7+cnt*3)*16, 15*16 color 255,255,255:pos (5+cnt*3)*16, 14*16: mes "000" loop repeat 8 color 0, 0, 0:boxf (5+cnt*3)*16, 16*16, (7+cnt*3)*16,17*16 color 255,255,255:pos (5+cnt*3)*16, 16*16: mes "000" loop return ; ボス画面 #modfunc m_scBossScr ; 塗り潰し for i,0,(mapsizey+1)*2,1 for j,0,(mapsizex+7)*2,1 pos j*16, i*16: gcopy sid_scrload, 32, 0, 16, 16 next next ; 背景 pos cx, 2*cy: gcopy sid_mapload, 0, 14*cy, 14*cx, 7*cy color 120,120,120: boxf cx, 16, cx+5*cx, 16+cy color 120,120,120: boxf cx+9*cx, 16, cx+14*cx, 16+cy 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_menu.hsp
; ; モジュール定義:「ウソザナ」ポップアップメニュー用 ; 作成 :ふじぽん ; ; モジュール名 :m_menu ; ; モジュール変数:画面ID...sid ; ; Copyright :http://d.hatena.ne.jp/fujiponXP ; ; 変更履歴 ; ver.1.0 2009/12/12 新規作成 ; ver.1.1 2009/12/20 初期設定で空き画面確保を追加, キー入力処理の待ち時間をawaitに変更 ; #module m_menu sid ; 定数定義 #define pointstr ">" ; ポインタ記号 #define wtime 5 ; キー入力待ち時間 ; 初期設定 #modinit sid = ginfo(25) ; 空き画面IDを使用する screen sid,,,screen_hide return ; ポップアップメニュー ; p_menu...メニュー配列(配列0はタイトル文字列) ; p_ymax...メニュー配列数 #modcfunc m_menuDisp array p_menu, int p_ymax ; 表示幅をメニュー文字列長から求める xmax = 8 ymax = p_ymax-1 for i,0,p_ymax l = strlen(p_menu(i)) if xmax < l: xmax = l next ; ポップアップ画面を設定する wposx = (ginfo_dispx - xmax*9 ) /2 wposy = (ginfo_dispy - ymax*22+5 ) /2 screen sid, xmax*9, ymax*22+5, screen_hide+screen_fixedsize+screen_tool,wposx,wposy ws_reset WS_SYSMENU title p_menu(0) color boxf font "",12,font_bold ; メニュー内容を描画する y=0 for i,0,ymax color 250,250,150: boxf 4,4+22*i, xmax*9-5, 4+18+22*i m_menuPrint (i=y), i, p_menu next key = 0 gsel sid,1 *main ; キー入力処理 stick key if key&2 { ; ↑キー:項目選択 m_menuPrint 0, y, p_menu y=(ymax+y-1)\ymax m_menuPrint 1, y, p_menu } if key&8 { ; ↓キー:項目選択 m_menuPrint 0, y, p_menu y=(y+1)\ymax m_menuPrint 1, y, p_menu } if key&32 : gsel sid,-1: return y+1 ; RETURNキー:決定 if key&128 : gsel sid,-1: return 0 ; ESCキー:キャンセル await wtime goto *main ; メニュー項目描画 ; p1...0:未選択 1:選択 ; p2...項目番号 ; p3...項目配列 #deffunc m_menuPrint int p1, int p2, array p3 if p1 { color 0,0,50: boxf 5,5+22*p2, xmax*9-6, 3+18+22*p2 color 250, 30, 30 pos 8,8+22*p2: mes pointstr } else { color: boxf 5,5+22*p2, xmax*9-6, 3+18+22*p2 color 255,255,255 } pos 24,8+22*p2: mes p3(p2+1) return #global
xana_my.hsp
; ; モジュール定義:「ウソザナ」自キャラ用 ; 作成 :ふじぽん ; ; モジュール名 :charactor ; ; モジュール変数: ; x , y , ho , pt 現在情報(位置,方向,パターン) ; ox, oy, oho, opt 旧情報(位置,方向,パターン) ; nx, ny 移動計算用 ; sid_load, sid_copy, sid_draw SID(画像読込用,gcopy用,描画用) ; basex, basey 描画基本座標(左上) ; ; 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対策) ; ver.1.5 2009/12/19 描画SID保持,描画位置指定,移動判定実装 ; #module charactor x, y, ho, pt, ox, oy, oho, opt, nx, ny, sid_load, sid_copy, sid_draw, basex, basey ; 初期設定 #modinit str fname, int p_draw, int p_basex, int p_basey ; 変数初期化 sid_draw = p_draw ; 描画用SID basex = p_basex basey = p_basey x = 0: y = 0: ho = 0: pt = 0: ox = -1 ; 画像セット sid_load = ginfo(25): buffer sid_load: picload fname ; オリジナル画像用SID sid_copy = ginfo(25): buffer sid_copy, 11*cx, cy ; gcopy用SID gsel sid_copy: pos 8*cx, 0: gcopy sid_load, 2*cx, 5*cy, cx, cy return ; 位置設定 #modfunc m_myPos int p1, int p2, int p3 x = p1 y = p2 nx = p1 ny = p2 ho = p3 return ; 装備 #modfunc m_myEquip int p1, int p2, int p3, int p4 gsel sid_copy: boxf 0,0,9*cx,cy pos 0 ,0: gcopy sid_load, 2*cx, p1*cy, 8*cx, cy ; 体 pos 9*cx,0: gcopy sid_load, (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_load, 2*cx, (p2+12)*cy ; 頭 if p3 > 0 : pos 0, 0: gcopy sid_load, 12*cx, (p3- 1)*cy ; 盾 if p4 > 0 : pos 0, 0: gcopy sid_load, 12*cx, (p4+ 3)*cy ; 武器 return ; 描画 #modfunc m_myDisp ; 表示変更の確認 if (ox=x)*(oy=y)*(opt=pt)*(oho=ho) : return ; 退避画像復元 if ox > -1 { gsel sid_draw: gmode 0, cx, cy pos ox+basex, oy+basey: gcopy sid_copy, 10*cx, 0 } ; 描画前画像退避 gsel sid_copy: gmode 0, cx, cy pos 10*cx, 0: gcopy sid_draw, x+basex, y+basey ; 描画 gsel sid_draw: color 0, 133, 111: gmode 4, cx, cy,255 pos x+basex, y+basey: gcopy sid_copy, (ho*2+pt)*cx, 0 ; 現情報退避 ox = x: oy = y: opt = pt: oho = ho return ; 移動計算 #modcfunc m_myWalk int k, array p_check 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: ny = y + dy pt = (pt + 1) \ 2 ; 判定位置算出 x1 = nx : y1 = ny ; 左上座標 x2 = x1+cx-1 : y2 = y1 ; 右上座標 x3 = x1 : y3 = y1+cy-1 ; 左下座標 x4 = x1+cx-1 : y4 = y1+cy-1 ; 右下座標 ; 左移動判定(MapActionのx1,y1またはx3,y3が1は移動不可) if ho=HO_LEFT : if p_check(x1/cx,y1/cy)=1 or p_check(x3/cx,y3/cy)=1 : return 0 ; 右移動判定(MapActionのx2,y2またはx4,y4が1は移動不可) if ho=HO_RIGHT : if p_check(x2/cx,y2/cy)=1 or p_check(x4/cx,y4/cy)=1 : return 0 ; 上移動判定(MapActionのx1,y1またはx2,y2が1は移動不可) if ho=HO_UP : if p_check(x1/cx,y1/cy)=1 or p_check(x2/cx,y2/cy)=1 : return 0 ; 下移動判定(MapActionのx3,y3またはx4,y4が1は移動不可) if ho=HO_DOWN : if p_check(x3/cx,y3/cy)=1 or p_check(x4/cx,y4/cy)=1 : return 0 return 1 ; 落下処理( 0=落下なし 1=落下 ) #modcfunc m_myFall array p_check ; 判定位置算出 x1 = x : y1 = y ; 左上座標 x2 = x1+cx-1 : y2 = y1 ; 右上座標 x3 = x1 : y3 = y1+cx-1 ; 左下座標 x4 = x1+cx-1 : y4 = y1+cx-1 ; 右下座標 ; 落下判定(MapActionのx3,y3またはx4,y4が5の場合) if p_check(x3/cx,(y3+1)/cx)=5 or p_check(x4/cx,(y4+1)/cx)=5 { ny = y+4 return 1 } return 0 ; 当たり判定 #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 ; sp 種類 ; type タイプ(%1000=浮遊 %0100=上下 %0010=左右 %0001=ランダム %0000=静止) ; x , y , ho , pt 現在情報(位置,方向,パターン) ; ox, oy, oho, opt 旧情報(位置,方向,パターン) ; nx, ny 移動計算用 ; basex, basey 描画基本座標(左上) ; ; 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 描画位置変更, 移動範囲変更 ; ver.1.3 2009/11/22 画像書換え方法変更(TEST5対策) ; ver.1.4 2009/12/20 落下処理追加, 移動判定処理追加, 方向反転処理追加 ; #module monster no, sp, type, x, y, ho, pt, ox, oy, opt, oho, nx, ny, basex, basey ; 画像セット #deffunc m_monPicset str fname buffer sid_monload: picload fname ; オリジナル画像読込み用 buffer sid_moncopy, 5*cx, 20*cy ; gcopy用(20体分) return ; 変数初期化 #modinit int pno, int psp, int p_type, int p_basex, int p_basey no = pno: sp = psp: ox = -1: type = p_type basex = p_basex: basey = p_basey 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_monPos int p1, int p2, int p3 x = p1: y = p2: nx = p1 :ny = p2: ho = p3 return ; 描画 #modfunc m_monDisp ; 表示変更の確認 if (ox=x)*(oy=y)*(opt=pt)*(oho=ho) : return ; 退避画像復元 if ox > -1 { gsel sid_main: gmode 0, cx, cy pos ox+basex, oy+basey: gcopy sid_moncopy, 4*cx, no*cy } ; 描画前画像退避 gsel sid_moncopy: gmode 0, cx, cy pos 4*cx, no*cy: gcopy sid_main, x+basex, y+basey ; 描画 gsel sid_main: color 0, 143, 122: gmode 4, cx, cy, 255 pos x+basex, y+basey: gcopy sid_moncopy, ((ho\2)*2+pt)*cx, no*cy ; 現情報退避 ox = x: oy = y: opt = pt: oho = ho return ; 移動計算(ret=0 移動無 ret=1 移動有) #modcfunc m_monWalk array p_check nx = x: ny = y pt = (pt + 1) \ 2 if (type & %1000) = 0 and (rnd(30)=1) : m_monTurn thismod ; 歩行タイプ 1/30で方向変換 if (type & %0111) = 0 : return 0 ; 静止タイプ 移動なし if (type & %1000) = 0 and (rnd(3)=0) : return 0 ; 歩行タイプ 1/ 3で移動なし nx = x + ((ho=HO_RIGHT) - (ho=HO_LEFT)) * 4 ny = y + ((ho=HO_DOWN ) - (ho=HO_UP )) * 4 ; 判定位置算出 x1 = nx : y1 = ny ; 左上座標 x2 = x1+cx-1 : y2 = y1 ; 右上座標 x3 = x1 : y3 = y1+cy-1 ; 左下座標 x4 = x1+cx-1 : y4 = y1+cy-1 ; 右下座標 ret = 1 ; 左移動判定(MapActionのx1,y1またはx3,y3が1は移動不可) if ho=HO_LEFT and (p_check(x1/cx,y1/cy)=1 or p_check(x3/cx,y3/cy)=1) : ret = 0 ; 右移動判定(MapActionのx2,y2またはx4,y4が1は移動不可) if ho=HO_RIGHT and (p_check(x2/cx,y2/cy)=1 or p_check(x4/cx,y4/cy)=1) : ret = 0 ; 上移動判定(MapActionのx1,y1またはx2,y2が1は移動不可) if ho=HO_UP and (p_check(x1/cx,y1/cy)=1 or p_check(x2/cx,y2/cy)=1) : ret = 0 ; 下移動判定(MapActionのx3,y3またはx4,y4が1は移動不可) if ho=HO_DOWN and (p_check(x3/cx,y3/cy)=1 or p_check(x4/cx,y4/cy)=1) : ret = 0 ; 衝突時の方向転換 if ret = 0 : m_monTurn thismod return ret ; 落下処理( 0=落下なし 1=落下 ) #modcfunc m_monFall array p_check ; 飛行タイプなら落下なし if type & %1000 : return 0 ; 判定位置算出 x1 = x : y1 = y ; 左上座標 x2 = x1+cx-1 : y2 = y1 ; 右上座標 x3 = x1 : y3 = y1+cx-1 ; 左下座標 x4 = x1+cx-1 : y4 = y1+cx-1 ; 右下座標 ; 落下判定(MapActionのx3,y3またはx4,y4が5の場合) if p_check(x3/cx,(y3+1)/cx)=5 or p_check(x4/cx,(y4+1)/cx)=5 { ny = y+4 return 1 } return 0 ; 方向転換 反転 #modfunc m_monTurn ; 上下左右タイプ if type & %0110 { switch ho case HO_LEFT ho = HO_RIGHT swbreak case HO_UP ho = HO_DOWN swbreak case HO_RIGHT ho = HO_LEFT swbreak case HO_DOWN ho = HO_UP swbreak swend } ; ランダムタイプ if type & %0001 { switch ho case HO_LEFT ho = HO_UP swbreak case HO_UP ho = HO_RIGHT swbreak case HO_RIGHT ho = HO_DOWN swbreak case HO_DOWN ho = HO_LEFT swbreak swend } ; 静止タイプ if (type & %0111)=0 : ho = rnd(3) return ret ; 当たり判定 #modcfunc m_monHitcheck int px, int py return (abs(x - px) < cx) & (abs(y - py) < cy) ; 位置確定 #modfunc m_monWalkcommit x = nx: y = ny return ; 位置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