TEST8
「ウソザナ」TEST6 で作ったマップスクロールとTEST1(自キャラ移動)を合わせてみました。
少し自キャラ用モジュールに手を加えています。
適当なフォルダに次のファイルを用意し、HSPでxana_test8.hspを実行してみて下さい。
- common.hsp (ここからゲット)
- xana_screen.hsp (ここからゲット)画面表示用モジュール
- xana_test8.hsp (↓からゲット)テストスクリプト
- xana_my.hsp (↓からゲット)テストスクリプト
- Xana_tile060227-4.PNG (DENZI部屋さんのところからゲット) ※XANADU風タイル(自キャラ)をbmp保存して下さい
- Xana_tile091129-2.PNG (DENZI部屋さんのところからゲット) ※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