public void Unmask(BattleMapMonster monster) { BattleMapTile centerTile = holder.BattleMap.BattleMapTiles[monster.X, monster.Y]; // 視界のタイルセットを取得 List <BattleMapTile> set = MapUtils.GetRangeTileList(centerTile, monster.BattleStatus.View); BattleMapTileMaskGroup maskGroup = holder.BattleMap.BattleMapTileMaskGroup[monster.GetTeamIndex()]; foreach (BattleMapTile bmt in set) { // マスクを取得 BattleMapTileMask mask = maskGroup.BattleMapTileMask[bmt.X, bmt.Y]; // すでにマスク解除されているならなにもしない if (mask.Mask == false) { continue; } mask.Mask = false; mask.GameObject.SetActive(false); mask.GameObjectShadow.SetActive(false); // オブジェクトが存在しない場合 // オブジェクトを描画 BattleMapObjectSet bmoSet = holder.BattleMap.BattleMapObjectSets[bmt.X, bmt.Y]; if (bmoSet == null) { mapObjectGenerator.DecoreteMapTile(bmt); } } }
/// <summary> /// マップタイルを装飾 /// </summary> /// <param name="bmt"></param> public void DecoreteMapTileByDropdown(BattleMapTile bmt) { //// ドロップダウンから装飾のタイプを取得 MapTileType mapTileType = GetDecorationTypeByDropdown(); DecoreteMapTile(bmt, bmt.MapTileType); }
/// <summary> /// タイル間の座標をキューに追加 /// </summary> /// <param name="queue"></param> /// <param name="monster"></param> /// <param name="bmt1"></param> /// <param name="bmt2"></param> private void EnqueuePosition(Queue <Vector2> queue, BattleMapMonster monster, BattleMapTile bmt1, BattleMapTile bmt2) { float tmpX = bmt2.GameObject.transform.position.x - bmt1.GameObject.transform.position.x; float diffX = tmpX / (float)MOVE_COUNT_PER_TILE; float tmpY = bmt2.GameObject.transform.position.y - bmt1.GameObject.transform.position.y; float diffY = tmpY / (float)MOVE_COUNT_PER_TILE; BattleMapMonsterPositionCalculator calculator = new BattleMapMonsterPositionCalculator(); for (int i = 0; i < MOVE_COUNT_PER_TILE - 1; i++) { float x = bmt1.GameObject.transform.position.x + (diffX * (i + 1)); float y = bmt1.GameObject.transform.position.y + (diffY * (i + 1)); Vector2 pos = calculator.CalculateMonsterPosition(monster, x, y); queue.Enqueue(pos); } // 最後は目的地 Vector2 lastPos = calculator.CalculateMonsterPosition(monster, bmt2); queue.Enqueue(lastPos); }
/// <summary> /// 範囲の描画 /// </summary> /// <param name="bmt"></param> /// <param name="tileSet"></param> private static void DrawRangeTile(BattleMapTile bmt, HashSet <BattleMapTile> tileSet, Action <BattleMapTile, int> iconInstaller) { BattleMapTileJointInfo jointInfo = bmt.JointInfo; foreach (MapTileJointPositionType jointPositionType in Enum.GetValues(typeof(MapTileJointPositionType))) { BattleMapTile jointTile = jointInfo.GetJointTile(jointPositionType); bool isDraw = false; // はじっこは描写 if (jointTile == null) { isDraw = true; } else { // 移動可能タイルに存在しない場合は描写 if (tileSet.Contains(jointTile) == false) { isDraw = true; } } // 描写 if (isDraw == true) { iconInstaller(bmt, (int)jointPositionType * 60); } } }
/// <summary> /// 相手を選択 /// </summary> /// <param name="monster"></param> private void SelectOpponent(BattleMapMonster monster) { BattleMapActionStatus actionStatus = holder.BattleMapStatus.BattleMapActionStatus; MonsterSkill skill = actionStatus.SelectedSkill; // ステータスを移動 statusGenerator.ShowStatus( actionStatus.TargetMonster, BattleMapStatusPanelType.SKILL1, BattleMapStatusPanelPositionType.ON_RESERVE); statusGenerator.SetSkill(skill); // 相手のステータスを表示 statusGenerator.ShowStatusReserve(monster, BattleMapStatusPanelType.SKILL1); // 距離を計算 BattleMapTile from = holder.BattleMap.GetByMonster(actionStatus.TargetMonster); BattleMapTile to = holder.BattleMap.GetByMonster(monster); int range = MapUtils.GetRange(from, to); // カウンタースキルを取得 MonsterSkill counterSkill = monster.GetCounterSkill(range); statusGenerator.SetSkillReserve(counterSkill); // ステータスの更新 actionStatus.BattleMapActionStatusType = BattleMapActionStatusType.CONFIRM_OPPONENT_SELECT; actionStatus.OpponentMonster = monster; actionStatus.CounterSkill = counterSkill; }
/// <summary> /// 移動の終了 /// </summary> private void FinishMove() { BattleMapMonster monster = holder.BattleMapStatus.BattleMapMoveStatus.TargetMonster; // マーカーを削除 mapIconGenerator.UninstallMonsterMarker(monster); // モンスターを移動 BattleMapTile endTile = holder.BattleMapStatus.BattleMapMoveStatus.GetEndMapTile(); monster.X = endTile.X; monster.Y = endTile.Y; // モンスターのリセット // 傾き、移動で位置がずれるため monsterGenerator.ResetMonsterGameObject(monster); // sortingOrderを再設定 monsterGenerator.SetMonsterSortingOrder(monster); // マーカーを作り直す mapIconGenerator.InstallMonsterMarker(monster); // 移動パスの削除 moveProcessor.ClearFlameAndPath(); // ステータスの削除 holder.BattleMapStatus.BattleMapMoveStatus = null; // 現在のチームの選択されているコマンド BattleMapCommand command = holder.GetCurrentCommand(); command.Count = command.Count - 1; }
/// <summary> /// マップを作成 /// </summary> /// <returns></returns> public BattleMap Create(int[,] map) { BattleMap battleMap = new BattleMap(map); int sizeX = map.GetLength(0); int sizeY = map.GetLength(1); battleMap.BattleMapTiles = new BattleMapTile[sizeX, sizeY]; battleMap.BattleMapObjectSets = new BattleMapObjectSet[sizeX, sizeY]; for (int x = 0; x < sizeX; x++) { for (int y = 0; y < sizeY; y++) { BattleMapTile bmt = new BattleMapTile(x, y, map[x, y]); battleMap.BattleMapTiles[x, y] = bmt; } } // 隣接するタイルを設定 SetJointTile(battleMap); // マスクを作成 CreateMask(battleMap); return(battleMap); }
private Vector3 CreateCenterPosition() { BattleMapMonster fromMonster = holder.BattleMapMonsters.MonsterList[0]; BattleMapTile from = holder.BattleMap.GetByMonster(fromMonster); BattleMapMonster toMonster = holder.BattleMapMonsters.MonsterList[1]; BattleMapTile to = holder.BattleMap.GetByMonster(toMonster); Vector3 pos1 = fromMonster.GameObject.transform.position; Vector3 pos2 = toMonster.GameObject.transform.position; Vector3 center = Vector3.Lerp(pos1, pos2, 0.5f); center.z = -10; // ズーム Camera camera = cameraController.GetCamera(); Vector3 screenPoint = camera.WorldToScreenPoint(center); Debug.Log("center:" + center); Debug.Log("spoint:" + screenPoint); return(center); }
public BattleMapTile(int x, int y, int type) { X = x; Y = y; MapTileType = ConvertType(type); MapTileViewType = ConvertViewType(MapTileType); Name = BattleMapTile.CreateName(x, y); }
/// <summary> /// 枠、水色を設定 /// </summary> /// <param name="bmt"></param> /// <param name="rotate"></param> public void InstallFrameAque(BattleMapTile bmt, int rotate) { GameObject iconGo = prefabHolder.InstantiateFrameAqua(); iconGo.transform.Rotate(new Vector3(0, 0, -rotate)); InstallIcon(bmt, BattleMapIconType.FRAME_AQUA, iconGo); }
/// <summary> /// モンスターのマーカーを設定 /// </summary> /// <param name="battleMapMonster"></param> public void InstallMonsterMarker(BattleMapMonster battleMapMonster) { BattleMapTile bmt = holder.BattleMap.BattleMapTiles[battleMapMonster.X, battleMapMonster.Y]; GameObject iconGo = prefabHolder.InstantiateCircle(battleMapMonster.Team.TeamColor); InstallIcon(bmt, BattleMapIconType.MONSTER_MAKER, iconGo); }
/// <summary> /// パスリストの処理 /// </summary> /// <param name="bmt"></param> /// <param name="movableTileList"></param> /// <param name="pathList"></param> /// <param name="currentPath"></param> /// <param name="moveCount"></param> private void ProcessPathList( BattleMapTile targetTile, List <BattleMapTile> movableTileList, List <string> pathList, string currentPath, int moveCount) { // 終点なら終了 BattleMapTile startTile = holder.BattleMapStatus.BattleMapMoveStatus.StartMapTile; if (targetTile == startTile) { currentPath += targetTile.X + "," + targetTile.Y + "-" + moveCount; pathList.Add(currentPath); return; } // 移動可能かどうか if (movableTileList.Contains(targetTile) == false) { return; } // 該当タイルに別モンスターがいたら侵入不可 BattleMapMonster monster = holder.BattleMapStatus.BattleMapMoveStatus.TargetMonster; BattleMapMonster anotherMonster = holder.BattleMapMonsters.GetMonster(targetTile.X, targetTile.Y); if (anotherMonster != null && monster != anotherMonster) { return; } // 移動コストを取得 MapTileType tileType = targetTile.MapTileType; int cost = monster.BattleStatus.BattleMapMonsterMoveCost.GetMoveCost(tileType); // 侵入不可の場合 if (cost < 0) { return; } // タイルのコストごとに移動力を減少 moveCount = moveCount - cost; // 移動力がなくなったら終了 if (moveCount <= 0) { return; } // パスに追加 currentPath += targetTile.X + "," + targetTile.Y + "_"; // タイルごとの処理 foreach (BattleMapTile jointTile in targetTile.JointInfo.GetJointTileList()) { ProcessPathList(jointTile, movableTileList, pathList, currentPath, moveCount); } }
/// <summary> /// 範囲の描画 /// </summary> /// <param name="skill"></param> /// <param name="monster"></param> private void DrawRange(MonsterSkill skill, BattleMapMonster monster) { BattleMapTile bmt = holder.BattleMap.GetByMonster(monster); // 範囲の取得 List <BattleMapTile> list = MapUtils.GetRangeTileList(bmt, skill.Range); // 描画 MapUtils.DrawRangeTile(new HashSet <BattleMapTile>(list), iconGenerator.InstallFrameAque); }
public GameObject InstantiateMaskShadow(BattleMapTile bmt) { GameObject go = Instantiate(maskShadow01Prefab) as GameObject; go.name = "maskShadow_" + bmt.X + "_" + bmt.Y; go.transform.position = bmt.GetMapTilePosition(); go.GetComponent <SpriteRenderer>().sortingOrder = SORTING_ORDER_MASK_SHADOW; return(go); }
/// <summary> /// 選択ステータスを設定 /// </summary> /// <param name="startTile"></param> /// <param name="monster"></param> /// <param name="movableTileList"></param> private void SetSelectedStatus(BattleMapTile startTile, BattleMapMonster monster, List <BattleMapTile> movableTileList) { // ステータスを設定 BattleMapMoveStatus moveStatus = new BattleMapMoveStatus(); moveStatus.BattleMapMoveStatusType = BattleMapMoveStatusType.SELECTED; moveStatus.TargetMonster = monster; moveStatus.MapTileMovableList = movableTileList; moveStatus.StartMapTile = startTile; holder.BattleMapStatus.BattleMapMoveStatus = moveStatus; }
private void Create(BattleMapTile bmt, BattleMapObjectSet bmoSet, IMapObjectSimpleCreatorHelper helper) { foreach (string point in helper.GetPointList()) { string[] strs = point.Split(','); int posX = int.Parse(strs[0]); int posY = int.Parse(strs[1]); BattleMapObject bmo = CreateBattleMapObject(bmt, posX, posY, helper); bmoSet.BattleMapObjectList.Add(bmo); } }
/// <summary> /// モンスターのGameObjectをリセットする /// </summary> /// <param name="monster"></param> public void ResetMonsterGameObject(BattleMapMonster monster) { Destroy(monster.GameObject); BattleMapTile bmt = holder.BattleMap.GetByMonster(monster); GameObject newGo = GetMonsterGameObject(bmt, monster.BattleStatus.MonsterType); monster.GameObject = newGo; // 位置の調整 ConditionMonsterPosition(bmt, monster); }
public GameObject Instantiate(BattleMapTile bmt) { GameObject prefab = PrefabUtils.GetPrefab(this, bmt.MapTileViewType.ToString().ToLower()); GameObject go = Instantiate(prefab) as GameObject; go.name = bmt.Name; go.transform.position = bmt.GetMapTilePosition(); go.GetComponent <SpriteRenderer>().sortingOrder = SORTING_ORDER; return(go); }
public void Load() { // ファイルを読み込み string path = inputFieldFilePath.text; StreamReader reader = new StreamReader(path, Encoding.GetEncoding(ENCODING)); bool first = true; BattleMapTile[,] tiles = null; while (reader.EndOfStream == false) { string line = reader.ReadLine(); // 最初の行はヘッダ if (first) { string[] strs = line.Split(new string[] { SEP }, StringSplitOptions.None); int x = int.Parse(strs[0]); int y = int.Parse(strs[1]); tiles = new BattleMapTile[x, y]; first = false; } // 以降は一行ずつ読み込み else { BattleMapTile bmt = new BattleMapTile(); bmt.FromFileString(line, SEP); tiles[bmt.X, bmt.Y] = bmt; } } reader.Close(); // 現在のタイルをクリア ClearTile(); // 読み込まれたタイルを設定 holder.BattleMap.BattleMapTiles = tiles; holder.BattleMap.BattleMapObjectSets = new BattleMapObjectSet[tiles.GetLength(0), tiles.GetLength(1)]; // タイルを描画 DrawTiles(tiles); Debug.Log("Load Successful!"); }
/// <summary> /// マップタイルを交換する /// </summary> /// <param name="bmt"></param> /// <param name="viewType"></param> private void ChangeMapTile(BattleMapTile bmt, MapTileViewType viewType) { bmt.MapTileViewType = viewType; // 既存のGameObjectを破棄 Destroy(bmt.GameObject); // 新規にGameObjectを作成 GameObject go = prefabHolder.Instantiate(bmt); bmt.GameObject = go; // マップ上にオブジェクトを設置 mapObjectGenerator.DecoreteMapTile(bmt); }
/// <summary> /// 指定された距離のタイル取得 /// </summary> /// <param name="centerTile"></param> /// <param name="range"></param> /// <returns></returns> public static List <BattleMapTile> GetRangeTileList(BattleMapTile centerTile, int range) { HashSet <BattleMapTile> tileSet = new HashSet <BattleMapTile>(); // このタイルを移動可能に追加 tileSet.Add(centerTile); // タイルごとの処理 foreach (BattleMapTile jointTile in centerTile.JointInfo.GetJointTileList()) { CheckRange(jointTile, range, tileSet); } return(new List <BattleMapTile>(tileSet)); }
/// <summary> /// 移動チェック /// </summary> /// <param name="monster"></param> /// <param name="targetTile"></param> /// <param name="moveCount"></param> /// <param name="movableTileSet"></param> private void CheckMove( BattleMapMonster monster, BattleMapTile targetTile, int moveCount, HashSet <BattleMapTile> movableTileSet) { // 該当タイルに別モンスターがいたら侵入不可 BattleMapMonster anotherMonster = holder.BattleMapMonsters.GetMonster(targetTile.X, targetTile.Y); if (anotherMonster != null && monster != anotherMonster) { return; } // マスクしてあったら侵入不可 BattleMapTileMaskGroup group = holder.BattleMap.BattleMapTileMaskGroup[monster.GetTeamIndex()]; BattleMapTileMask mask = group.BattleMapTileMask[targetTile.X, targetTile.Y]; if (mask.Mask) { return; } // 移動コストを取得 MapTileType tileType = targetTile.MapTileType; int cost = monster.BattleStatus.BattleMapMonsterMoveCost.GetMoveCost(tileType); // 侵入不可の場合 if (cost < 0) { return; } // このタイルを移動可能に追加 movableTileSet.Add(targetTile); // タイルのコストごとに移動力を減少 moveCount = moveCount - cost; // 移動力がなくなったら終了 if (moveCount <= 0) { return; } // タイルごとの処理 foreach (BattleMapTile jointTile in targetTile.JointInfo.GetJointTileList()) { CheckMove(monster, jointTile, moveCount, movableTileSet); } }
/// <summary> /// 移動可能範囲の表示 /// </summary> public void ShowMovable(BattleMapMonster monster) { // 現在地 BattleMapTile startTile = holder.BattleMap.BattleMapTiles[monster.X, monster.Y]; // 移動可能なタイルを取得 HashSet <BattleMapTile> movableTileSet = GetMovableTileSet(startTile, monster); // 範囲の描画 MapUtils.DrawRangeTile(movableTileSet, iconGenerator.InstallFrameAque); // マーカーを強調表示 iconController.HighlightMarker(monster); // 選択ステータスを設定 SetSelectedStatus(startTile, monster, new List <BattleMapTile>(movableTileSet)); }
/// <summary> /// タイル間の距離を取得 /// </summary> /// <param name="from"></param> /// <param name="to"></param> /// <returns></returns> public static int GetRange(BattleMapTile from, BattleMapTile to) { int max = 500; // 距離内にあるかひたすら計算 for (int i = 1; i < max; i++) { List <BattleMapTile> list = GetRangeTileList(from, i); if (list.Contains(to)) { return(i); } } return(-1); }
/// <summary> /// ステータスを表示する /// </summary> /// <param name="bmt"></param> public void ShowStatus(BattleMapTile bmt) { Initialize(); // モンスターがいれば表示 BattleMapMonster monster = holder.BattleMapMonsters.GetMonster(bmt); if (monster != null) { ShowStatus(monster); } else { HideStatus(); } }
/// <summary> /// モンスターの位置の調整 /// </summary> /// <param name="bmt"></param> /// <param name="bmm"></param> private void ConditionMonsterPosition(BattleMapTile bmt, BattleMapMonster bmm) { BattleMapMonsterPositionCalculator calculator = new BattleMapMonsterPositionCalculator(); Vector2 position = calculator.CalculateMonsterPosition(bmm, bmt); GameObject monsterGo = bmm.GameObject; monsterGo.transform.position = position; // 傾けた回数だけ傾ける // 一度に傾けるとずれる for (int i = 0; i < holder.BattleMapSetting.TiltCount; i++) { tiltController.Tilt(monsterGo, BattleMapCameraController.TITL_ANGLE); } }
/// <summary> /// アイコンを設定 /// </summary> /// <param name="bmt"></param> /// <param name="iconType"></param> /// <param name="iconGo"></param> private void InstallIcon(BattleMapTile bmt, BattleMapIconType iconType, GameObject iconGo) { BattleMapIcon icon = new BattleMapIcon(); icon.BattleMapIconType = iconType; icon.X = bmt.X; icon.Y = bmt.Y; Vector3 pos = bmt.GameObject.transform.position; iconGo.transform.position = pos; icon.GameObject = iconGo; BattleMapIcons icons = holder.BattleMapIcons; icons.Add(icon); }
/// <summary> /// 移動可能なタイルのセットを取得 /// </summary> /// <param name="currentTile"></param> /// <param name="monster"></param> /// <returns></returns> private HashSet <BattleMapTile> GetMovableTileSet(BattleMapTile currentTile, BattleMapMonster monster) { HashSet <BattleMapTile> movableTileSet = new HashSet <BattleMapTile>(); // 移動力 int moveCount = monster.BattleStatus.MoveCount; // このタイルを移動可能に追加 movableTileSet.Add(currentTile); // タイルごとの処理 foreach (BattleMapTile jointTile in currentTile.JointInfo.GetJointTileList()) { CheckMove(monster, jointTile, moveCount, movableTileSet); } return(movableTileSet); }
/// <summary> /// パスのリストを作成 /// </summary> /// <param name="bmt"></param> /// <returns></returns> private List <string> CreatePathList(BattleMapTile bmt) { List <string> pathList = new List <string>(); // 移動可能タイル List <BattleMapTile> movableTileList = holder.BattleMapStatus.BattleMapMoveStatus.MapTileMovableList; // パス string path = bmt.X + "," + bmt.Y + "_"; // 移動力 int moveCount = holder.BattleMapStatus.BattleMapMoveStatus.TargetMonster.BattleStatus.MoveCount; foreach (BattleMapTile jointTile in bmt.JointInfo.GetJointTileList()) { ProcessPathList(jointTile, movableTileList, pathList, path, moveCount); } return(pathList); }
/// <summary> /// 距離のチェック /// </summary> /// <param name="targetTile"></param> /// <param name="range"></param> /// <param name="tileSet"></param> private static void CheckRange( BattleMapTile targetTile, int range, HashSet <BattleMapTile> tileSet) { // このタイルを追加 tileSet.Add(targetTile); // 距離を減少 int tmpRange = range - 1; // 距離がなくなったら終了 if (tmpRange <= 0) { return; } // タイルごとの処理 foreach (BattleMapTile jointTile in targetTile.JointInfo.GetJointTileList()) { CheckRange(jointTile, tmpRange, tileSet); } }