//------------------------- // 0. 別ソース結合 //------------------------- #include "@Cloud.hsp" #include "hspda.as" //========================================================== // 1. 画面関連の定数を設定する //========================================================== #const win_x 400 // 画面Xサイズ #const win_y 400 // 画面Yサイズ tip.0 = 32 // チップのサイズ tip.1 = tip / 2 // チップの1/2のサイズ tip.2 = tip / 4 // チップの1/4のサイズ tip.3 = tip / 4-1 // チップの1/4-1のサイズ(Z座標の補正に使用) #define tip_sx tip.0 // チップのXサイズ #define tip_sy tip.1 + tip.3 // チップのYサイズ #const max_x 10 // マップ配列X #const max_y 10 // マップ配列Y #const max_z 10 // マップ配列Z sx = 180 // 描写開始X座標 sy = 185 // 描写開始Y座標 //========================================================== // 2. スクリーン関係の設定 //========================================================== screen 0, win_x, win_y buffer 1 : picload "map_tip.bmp" buffer 2 : picload "Cloud.bmp" buffer 3 : picload "chr.bmp" buffer 4 : picload "kazari.bmp" gsel 0 // 描写先をスクリーン0に戻しておく a = gettime(6) : randomize a // ランダム初期化 title "sample013" // タイトル font "", 11 // フォント //========================================================== // 3. マップデータを用意 //========================================================== //--------------------------------------------- // 3-1. 使用する変数を初期化 //--------------------------------------------- dim map_data, max_x, max_y, max_z dim data // マップデータを読み込むための変数 notesel data // バッファを割り当てる noteload "map_data.txt" // 外部のマップデータを読み込み //--------------------------------------------- // 3-2. map_data(x, y, z)に読み込んだデータを渡す //--------------------------------------------- x = 0 y = 0 z = 0 repeat max_z repeat max_y // テキストの何行目を読み取っているか noteget b.0, y + (z * max_y) a.0 = 0 repeat max_x // [,]で区切られた[b.0]のデータを[max_x]分だけ読み込む getstr b.1, b.0, a.0, ',' a.0 += strsize // インデックスを次に // もし[ n ]という文字を読み込んだ場合 // 現在の行はデータ無しとみなし、次の行を読み込む if b.1 = "n" { x++ break } // str型の[ b.1 ]をint型の[ a.1 ]に代入 a.1 = int(b.1) // マップデータに代入 map_data(x, y, z) = a.1 x++ loop y++ : x=0 loop z++ : x=0 : y=0 loop dim data // 3-3. メモリ開放 //========================================================== // 4. ユニットのデータを用意 //========================================================== #const max_chr 10 // とりあえず5人に設定 dim cx, max_chr // X座標 dim cy, max_chr // Y座標 dim cz, max_chr // Z座標 dim cdx, max_chr // ウィンドウ上の描写先X dim cdy, max_chr // ウィンドウ上の描写先Y dim cdz, max_chr // ウィンドウ上の描写先Z // ユニットの座標を用意 cx.0 = 0,4,1,4,2, 0,8,9,8,0 cy.0 = 0,2,3,4,7, 4,0,0,4,8 cz.0 = 4,3,3,1,0, 3,3,3,0,2 gosub *sort_pos // 最初にソートしておく dim pr, 10, max_chr // パラメータ用配列 #define class pr. 0. c #define hp pr. 1. c #define mhp pr. 2. c #define atk pr. 3. c #define def pr. 4. c #define spd pr. 5. c #define act pr. 6. c // ユニットのパラメータを用意 repeat 5//max_chr c = cnt class = rnd(5) mhp = 20 + rnd(3)*10 hp = mhp loop // ユニットID5番以降ははオブジェクト「木」 repeat 5, 5 c = cnt class = 5 loop // どのユニットが選択されているかフラグ sel = -1 //========================================================== // 5. 雲の初期設定 //========================================================== // 現在の雲の最大数 = cloud_max.0 // 変更したい雲の最大数 = cloud_max.1 Cloud_set 40 cloud_max.0 = stat pos 140, 5 : input cloud_max.1, 40,20 pos 190, 5 : button "変更", *Cloud_chenge// 変更用のボタン //////////////////////////////////////////////////////////// // 6. メインルーチン //////////////////////////////////////////////////////////// *main redraw 0 wait 5 //----------------------------------- // 6-1. アニメーションカウンタの処理 //----------------------------------- anime.0++ : if anime.0 > 2 : anime.0 = 0 anime.1++ : if anime.1 > 7 : anime.1 = 0 gosub *key_ctrl // キーチェック gosub *map_draw // マップ描写 gosub *map_info // マップ情報表示 gosub *chr_draw // キャラクターの描写 Cloud_draw // 雲の描写 redraw 1 goto *main // //////////////////////////////////////////////////////////// //========================================================== // 7. キーコントロール //========================================================== *key_ctrl stick key, 15 switch key case 1 sx -= 2 swbreak case 2 sy -= 2 swbreak case 4 sx += 2 swbreak case 8 sy += 2 swbreak swend return //========================================================== // 8. マップ描写 //========================================================== *map_draw //----------------------------------- // 8-1. 画面クリア //----------------------------------- color 0,0, 70 boxf color 255, 255, 255 gmode 2// コピーモード2に変更 //----------------------------------- // 8-2. 四辺の飾り //----------------------------------- pos 0, 0 : gcopy 4, 0, 0, 144, 136 pos win_x-144, 0 : gcopy 4, 144, 0, 144, 136 pos 0, win_y-136 : gcopy 4, 0, 136, 144, 136 pos win_x-144, win_y-136 : gcopy 4, 144, 136, 144, 136 //----------------------------------- //----------------------------------- // 8-3. マップデータの有無と描写処理 //----------------------------------- x = 0// ループに使用する変数 y = 0 z = 0 repeat max_z // Z座標用ループ repeat max_y // Y座標用ループ repeat max_x // X座標用ループ //------------------------------------ // 8-4. 座標の計算 //------------------------------------ if map_data(x, y, z) > 0 { a.0 = -(x * tip.1) + (y * tip.1)// 描写X座標 a.1 = (x * tip.2) + (y * tip.2) - (z * tip.3)// 描写Y座標 pos sx + a.0, sy + a.1 //--------------------------------- // 視認不可のマップチップか判別する //--------------------------------- a.5 = 0 // 描写フラグ if x < max_x-1 : a.2 = map_data(x+1, y, z) : else : a.5=1 if y < max_y-1 : a.3 = map_data(x, y+1, z) : else : a.5=1 if z < max_z-1 : a.4 = map_data(x, y, z+1) : else : a.5=1 // これらの条件を満たしていないチップを描写する if a.2>0 && a.3>0 && a.4>0 && a.5=0 : else { // サブルーチンでマップチップを描写 gosub *tip_draw } } //------------------------------------ // 8-5. カーソル描写のためのマウス座標チェック //------------------------------------ if map_data(x, y, z) > 0 { gosub *mouse_check } //------------------------------------ // 8-6. ユニットの描写先座標を計算 //------------------------------------ repeat max_chr if cx.cnt=x && cy.cnt=y && cz.cnt=z { cdx.cnt = -(x * tip.1) + (y * tip.1)// 描写X座標 cdy.cnt = (x * tip.2) + (y * tip.2) - (z * tip.3)// 描写Y座標 // オブジェクト毎にZ座標を調整する c = cnt if class = 5 { cdz.cnt = -79 + tip.1 } else { cdz.cnt = -60 + tip.1 } } loop x++ loop y++ : x = 0 loop z++ : x=0 : y=0 loop //----------------------------------- // 8-7. コメント //----------------------------------- pos 5, 5 : mes "雲の数を変更できます。\n現在、"+cloud_max.0+"個" pos 10, ginfo_winy -50 mes "右クリックでユニット選択" mes "左クリックでユニット移動が可能です" mes "sx : "+sx+", sy : "+sy+"" mes "十字キーでマップの描写開始位置を操作できます" return //========================================================== // 9 . マップチップ描写 //========================================================== *tip_draw switch map_data(x, y, z) // 地面 case 1 gcopy 1, 0,0, tip_sx, tip_sy swbreak // 水 case 2 gcopy 1, 32+(anime*tip.0),0, tip_sx, tip_sy // Z座標が0ならば、水しぶき(仮)を描写 if z = 0 { // 同じ計算を何回もしないよう計算しておく a.2 = sx + a.0 a.3 = sy + a.1 + tip.3 // アニメーションカウンタが2以上の時に描写 if anime.1 >= 2 { // 左端 pos a.2 -tip.2+2, a.3 gcopy 1, 160+16*(anime.1-2), 0, 16,16 // 右端 pos a.2 +tip.1+6, a.3 gcopy 1, 160+16*(anime.1-2), 0, 16,16 } // アニメーションカウンタが1以上の時に描写 if anime.1 >= 1 { // 真ん中 pos a.2 +tip.2+2, a.3 + 8 gcopy 1, 160+16*(anime.1-1), 0, 16,16 } // 左 pos a.2 +2, a.3 + 4 gcopy 1, 160+16*anime.1, 0, 16,16 // 右 pos a.2 +tip.2+8, a.3 + 4 gcopy 1, 160+16*anime.1, 0, 16,16 } swbreak swend return //========================================================== // 10. マップ上マウス座標 //========================================================== *mouse_check a.0 = z + 1// z座標確認用 // 配列データは無いので戻る if a.0 > max_z-1 : return // もし上(z+1)にマップデータがある場合は戻る if map_data(x, y, a.0) > 0 : return a.0 = -(x * tip.1) + (y * tip.1) + sx// 始点X座標 a.1 = sy + (x * tip.2) + (y * tip.2) - (z * tip.3)// 始点Y座標 a.2 = sx -(x * tip.1) + (y * tip.1) + tip.0// 終点X座標 a.3 = sy + (x * tip.2) + (y * tip.2) - (z * tip.3) + 17// 終点Y座標 // 指定範囲内にマウスカーソルがあるか判定する if mousex > a.0 && mousey > a.1 && mousex < a.2 && mousey < a.3 { mx = x my = y mz = z } return //========================================================== // 11. ユニット描写 //========================================================== *chr_draw repeat max_chr pos sx + cdx.c_turn(cnt) +2 , sy + cdy.c_turn(cnt) + cdz.c_turn(cnt) c = c_turn(cnt) // 選択ユニットのクラスを判別 switch class // ロード case 0 gcopy 3, 58,36, 27,60 swbreak // ナイト case 1 gcopy 3, 58,36, 27,60 swbreak // 戦士 case 2 gcopy 3, 58,36, 27,60 swbreak // 剣士 case 3 gcopy 3, 29,36, 27,59 swbreak // アーチャー case 4 gcopy 3, 58,36, 27,60 swbreak // 「木」 case 5 gcopy 1, 33,24, 32,79 swbreak swend loop return //========================================================== // x, y, z の座標値を描写優先ポイントとして合計し // 全ユニットをソートして描写する順番を決める //========================================================== *sort_pos dim a, max_chr repeat max_chr a.cnt += 1 * cx.cnt a.cnt += 1 * cy.cnt a.cnt += 1 * -cz.cnt loop sortval a, 0 dim b repeat max_chr sortget b, cnt c_turn.cnt = b// 描写する順番を保持 mes ""+a.cnt+"" loop return //========================================================== // 12. マップ情報 //========================================================== *map_info //--------------------------------------------- // 12-1. マップカーソル描写 //--------------------------------------------- a.0 = -(mx * tip.1) + (my * tip.1) + sx// 始点X座標 a.1 = sy + (mx * tip.2) + (my * tip.2) - (mz * tip.3)// 始点Y座標 pos a.0, a.1 gcopy 1, 128,tip.1*(anime.1/4), tip.0, tip.1 // マップデータの説明 pos ginfo_winx - 60, 20 mes ""+mx+","+my+","+mz+"" //--------------------------------------------- // 12-2. マップデータの種類を判別 //--------------------------------------------- switch map_data(mx, my, mz) case 1 mes "平地" gcopy 1, 0,0, tip_sx, tip_sy swbreak case 2 mes "水" gcopy 1, 32+(anime*tip.0),0, tip_sx, tip_sy swbreak swend //--------------------------------------------- // 12-3. キャラクターがマップ上いるか判別 //--------------------------------------------- repeat max_chr if mx=cx.cnt && my=cy.cnt && mz=cz.cnt { pos ginfo_winx - 60, 80 c = cnt if class = 5 { mes "「木」" } else : mes "ユニット"+cnt+"" // 右クリックで選択 //stick key, 256 if key=512 && sel=-1 && class<5 { sel = cnt } } loop // 選択フラグが-1じゃなければ表示 if sel != -1 { color boxf 20, 340, 360, 390 color 255, 255, 255 c = sel// インデックスを割り当てる // ユニット名表示 pos 25, 345 mes "ユニット"+sel+"" // 選択ユニットのクラスを判別 switch class case 0 : mes "ロード" : swbreak case 1 : mes "ナイト" : swbreak case 2 : mes "戦士" : swbreak case 3 : mes "剣士" : swbreak case 4 : mes "アーチャー" : swbreak swend // 格パラメータを表示 pos 80, 345 mes "HP "+hp+" / "+mhp+"" } // ユニット選択中に左クリックで指定座標に移動 if key=256 && sel!=-1 { // 既に他のユニットがいる座標には移動できない a.0 = 0 // 移動フラグを用意 repeat max_chr if cnt = sel : continue// 自分の処理は飛ばす if cx.cnt=mx && cy.cnt=my && cz.cnt=mz { a.0 = 1 // 移動フラグOFF・移動できない dialog "移動できません", 1 } loop // 選択されたユニットは移動可能なので座標を代入 if a.0 = 0 { cx.sel = mx cy.sel = my cz.sel = mz sel = -1 // ユニットの座標値を補正 gosub *sort_pos } } return //========================================================== // 雲の数を変更して初期化 //========================================================== *Cloud_chenge Cloud_set cloud_max.1 goto *main