void GetSpeMapSetPos(List <string> speMapFXArr, string CMapLJFX, string cZXMapName, string newMapName) { for (int i = 0; i < speMapFXArr.Count; i++) { if (KeLianJieFX(speMapFXArr[i], CMapLJFX) != null) { //string _zb = GetZBByFX(cZXMapName,CMapLJFX); ////判断 其他方向没有 地图 //if (!IsOtherFXHasNoMap(speMapFXArr, speMapFXArr[i],_zb)) //{ // return; //} CreateMapImgByFX(cZXMapName, CMapLJFX, newMapName); return; } } //如果没有地方安置特殊数组 maxI++; string _newMapName = "map_" + cMapNum + "-" + (maxI + 1); if (GlobalMapDate.IsSpeMapByName(_newMapName)) { List <string> speMapFXList = GlobalMapDate.GetFXListByName(_newMapName); GetSpeMapSetPos(speMapFXList, CMapLJFX, cZXMapName, _newMapName); } else { CreateMapImgByFX(cZXMapName, CMapLJFX, _newMapName); } }
GameObject GetGKImgAndPosition(string _name, float px = 0, float py = 0) { GameObject gkImg = GlobalTools.GetGameObjectByName("gkImg"); gkImg.transform.parent = _canva.transform; gkImg.transform.position = new Vector2(px, py); gkImg.name = _name; string _zb = GetCurrentMapZBByName(_name); if (GlobalMapDate.IsSpeMapByName(_name)) { gkImg.GetComponent <gkImgTextTest>().GetText("<color=#ff1111>speMap</color> " + _zb); } else { gkImg.GetComponent <gkImgTextTest>().GetText("<color=#000000>speMap</color> " + _zb); } imgMapObjArr.Add(gkImg); return(gkImg); }
void CreateMapByKyFXArr(List <string> tempKyFXArr, string cZXMapName) { tempSpeMapList.Clear(); int createMapNums; for (int c = 0; c < tempKyFXArr.Count; c++) { maxI = GetMapZBArrMaxNum(mapZBArr); //maxI 取mapZBArr中的名字最大值 createMapNums = maxI + 1; int nums = GetNotUseNums(mapZBArr); if (nums != 1) { createMapNums = nums; } //print(" ----------->中心地图 名字 "+ cZXMapName+ " 创建了几个分支 "+ tempKyFXArr.Count+" 当前生成分支方向 "+ tempKyFXArr[c]); //如果大于最大的 并且中心地图不是特殊地图 数组数 直接跳出 没有分支了 特殊地图除外 if (createMapNums > MaxMapNums && !GlobalMapDate.IsSpeMapByName(cZXMapName)) { return; } else { //if(createMapNums > MaxMapNums) print("中心地图是特殊地图 " + cZXMapName + " 最大nums " + MaxMapNums + " createMapNums " + createMapNums); } //maxI = theMapArr.Count; //createMapNums = maxI+1; //获得名字 先查找名字是否被占用 string _newMapName = "map_" + cMapNum + "-" + createMapNums; //判断名字是否被占用?? 特殊地图会直接走完 不会超出数组长度 这里不需要判断 名字不会被占用? _newMapName = IsMapNameHasMapGetNewName(_newMapName); //如果是 特殊 数组 看看能不能连上 中心数组 不能的话怎么办? if (GlobalMapDate.IsSpeMapByName(_newMapName)) { //print(" ********** 新创建的 分支 地图是 特殊地图 " + _newMapName); //获取 特殊 数组的 方向 数组 //List<string> speMapFXList = GlobalMapDate.GetFXListByName(_newMapName); //只连特殊 数组了 可以 直接 return了 tempSpeMapList.Add(_newMapName); //CreateSpeMap(); //GetSpeMapSetPos(speMapFXList, tempKyFXArr[c], cZXMapName, _newMapName); continue; } //print("创建的 " + tempKyFXArr[c] + "分支 地图名字 " + _newMapName); //创建地图 生成名字 和坐标 存入两个数组 CreateMapImgByFX(cZXMapName, tempKyFXArr[c], _newMapName); } //如果有特殊 数组 记录特殊数组 位置 //if (IsTeShuMapLianzaiyiqi && tempSpeMapList.Count > 0) //{ // CreateSpeMap(); //} }
void CreateSpeMapByName(string speMapName) { //寻找适合位置 //获取特殊地图 方向数组 List <string> SpeMapFXArr = GlobalMapDate.GetFXListByName(speMapName); //1该方向上 有空位 2该空位 特殊地图的连接线可以连(先找特殊地图 普通地图 直接连 特殊地图的话看看是否能连 能连直接连 不能连就换位置) string mapName = FindLJSpeMapDeMap(SpeMapFXArr, speMapName); }
void OnTriggerEnter2D(Collider2D Coll) { //print(Coll.tag + " -- " + Coll.transform.tag); if (Coll.tag == "Player") { GetGC(); //这里判断 是否要进随机的大地图 小地图 //这里判断 地图类型 如果 特殊地图类型是 Boss CD 或者JY 就改为 自动地图(自动地图的,特殊地图) //Boss 有boss名 直接用boss名 没有 直接随机 全局记录 当前关卡 有boss 过关再次进入 要删除boss //另外生成一个 特殊地图的 信息列表 来匹配 特殊地图 是否有 有的话生成 特殊地图 //eg 12!boss^boss_test!db^2!qj^2!jqj^2!bg^2 等11!cundang 9!juqing^juqingjueseming print("*** ReMapName????? " + ReMapName + " GoScreenName " + GoScreenName); Globals.IsHitDoorStop = true; if (HitChangeGlobalMapType != 0) { Globals.mapTypeNums = HitChangeGlobalMapType; } GlobalMapDate.ClearGlobalCurrentMapMsg(); if (ReMapName == "" && IsSpeMap(GoScreenName)) { ReMapName = GlobalMapDate.CurrentSpelMapName; GlobalSetDate.instance.GetMapMsgByName(ReMapName, MenFX, DangQianMenWeizhi); //print("*** ReMapName "+ ReMapName); } else if (ReMapName != "") { print("说明是 从 特殊地图 跳到 随机里面 " + ReMapName + " MenFX " + MenFX); GlobalSetDate.instance.GetMapMsgByName(ReMapName, MenFX, DangQianMenWeizhi); //return; } else { GlobalSetDate.instance.GetInMenWeizhi(DangQianMenWeizhi); } if (Coll.transform.GetComponent <RoleDate>().isDie) { return; } ChangeScreen(); Coll.GetComponent <GameBody>().GetStand(); //查找地图数据 //if (!IsHitGo) return; } }
string IsMapNameHasMapGetNewName(string _mapName) { for (int i = 0; i < mapZBArr.Count; i++) { if (_mapName == mapZBArr[i].Split('!')[0] || GlobalMapDate.IsSpeMapByName(_mapName)) { _mapName = _mapName.Split('-')[0] + "-" + (int.Parse(_mapName.Split('-')[1]) + 1); return(IsMapNameHasMapGetNewName(_mapName)); } } return(_mapName); }
string GetMapNameByZB(string zb) { for (int i = 0; i < mapZBArr.Count; i++) { if (mapZBArr[i].Split('!')[1] == zb) { //判断 如果是特殊地图 if (GlobalMapDate.IsSpeMapByName(mapZBArr[i].Split('!')[0])) { return(mapZBArr[i].Split('!')[0]); } return(mapZBArr[i].Split('!')[0]); } } return(null); }
string IsSpeMapNewFZMapNameIsSpeName(string speFZMapName) { //判断名字是否被占用 if (GlobalMapDate.IsSpeMapByName(speFZMapName)) { if (!tempSpeMapList.Contains(speFZMapName)) { tempSpeMapList.Add(speFZMapName); } speFZMapName = speFZMapName.Split('-')[0] + "-" + (int.Parse(speFZMapName.Split('-')[1]) + 1); if (GlobalMapDate.IsSpeMapByName(speFZMapName)) { IsSpeMapNewFZMapNameIsSpeName(speFZMapName); } } speFZMapName = IsMapNameHasMapGetNewName(speFZMapName); return(speFZMapName); }
//根据坐标和方向 获取改位置的 地图名字(用于 判断该方向上是否有地图) 返回特殊地图的名字和信息 还有方位 string GetMapNameAndMsgByZBAndFX(string zb, string fx) { //string getMapName = ""; string _zb = GetNewZBByFX(zb, fx); for (int i = 0; i < mapZBArr.Count; i++) { if (mapZBArr[i].Split('!')[1] == _zb) { //判断 如果是特殊地图 if (GlobalMapDate.IsSpeMapByName(mapZBArr[i].Split('!')[0])) { return(mapZBArr[i] + "=" + fx); } } } return(null); }
string IsSpeMapAddMaxI(string newMapName) { //先判断 名字是否被占用 newMapName = IsMapNameHasMapGetNewName(newMapName); if (GlobalMapDate.IsSpeMapByName(newMapName)) { //要判断 数组中是否已经有该特殊数组了 if (!tempSpeMapList.Contains(newMapName)) { tempSpeMapList.Add(newMapName); } newMapName = newMapName.Split('-')[0] + "-" + (int.Parse(newMapName.Split('-')[1]) + 1); print("newMapName 1 " + newMapName); if (GlobalMapDate.IsSpeMapByName(newMapName)) { print("特殊地图 " + newMapName); return(IsSpeMapAddMaxI(newMapName)); } } //print("------生成的名字 "+newMapName); return(newMapName); }
string FindLJSpeMapDeMap(List <string> SpeMapFXArr, string speMapName) { string findFX = ""; //string findZB = ""; for (int i = mapZBArr.Count - 1; i >= 0; i--) { for (int j = 0; j < SpeMapFXArr.Count; j++) { //寻找放置方向 if (SpeMapFXArr[j] == "l") { findFX = "r"; } else if (SpeMapFXArr[j] == "d") { findFX = "u"; } else if (SpeMapFXArr[j] == "u") { findFX = "d"; } else if (SpeMapFXArr[j] == "r") { findFX = "l"; } string cMapName = mapZBArr[i].Split('!')[0]; string _cMapZB = mapZBArr[i].Split('!')[1]; //如果是特殊地图就跳出当前循环 if (GlobalMapDate.IsSpeMapByName(cMapName)) { break; } //根据 findFX 找到 适合的 地图 1.该方向上有空位 if (!IsHasMap(findFX, cMapName)) { //这里 要找 这个坐标 特殊地图 另外几个方向上 是否 有地图 有的话要判断是否允许连接 能连就连接 不能就另外找地方连 print(" 特殊地图 找到的 可以连接的 中心地图 名字 " + cMapName); //获取这个空位坐标 string _zb = GetZBByFX(findFX, cMapName); //这个坐标上面没有地图 这个坐标就是特殊地图 选的位置 //2.空位上 特殊地图的方向 没有特殊地图 //特殊地图的方向数组 List <string> SpeMapFXList = GlobalMapDate.GetFXListByName(speMapName); //查找方向上是否有 特殊地图 数组 有的话就跳过 if (IsFXHasSpeMap(_zb, SpeMapFXList)) { continue; //这里不能用break } //---------------------------------------------------------------找到可以放特殊地图的位置坐标 //找到院地图的OBJECY //如果 周围 连线路上 没有其他特殊地图 就安插这个特殊地图 //获取当前地图对象 _currentMap 根据坐标获取 地图块对象 GameObject _currentMap = GetMapImgObjByZB(_cMapZB); //创建地图的特殊地图块 GameObject speMapObj = CreateOutMap(_currentMap, findFX, speMapName, cMapName); print("------------------------------------------------------------------------------坐标 " + _zb); speMapObj.GetComponent <gkImgTextTest>().GetText("<color=#ff1111>speMap</color> " + _zb); //链接特殊地图块的各个方向 //获取 特殊地图方向数组 List <string> speMapFXArr = GlobalMapDate.GetFXListByName(speMapName); //获取这个特殊地图已经连接的方向 这个方向要剔除 string hasLianJieFX = SpeMapFXArr[j]; //获取剩余方向数组 在上面创建分支 如果遇到特殊地图 就将特殊数组存进临时数组 (计数 如果在特殊数组后开始 就连接上了) speMapFXArr = RemoveHasLJFXInFXList(speMapFXArr, hasLianJieFX); CreateSpeMapFZByFXList(speMapFXArr, speMapName, speMapObj); return(null); } } } return(null); }
//创建一个大关卡的地图 map1_1,map1_2... public void CreateCustomAllMap() { //有几个小地图组成? 最少10个 +随机 int n = (int)UnityEngine.Random.Range(0, 4); int mapsNum = 6 + n; //查找 是否有特别地图 以及特别地图位置编号 string[] smapArr; if (GlobalMapDate.IsHasSpecialMap()) { smapArr = GlobalMapDate.GetCSpeicalMapNameArr(); //print("特殊地图数组: "+smapArr.Length); //if (smapArr.Length!= 0){ // foreach(string ns in smapArr) // { // print("------特殊地图名字: "+ns); // } //} } for (int i = 0; i < mapsNum; i++) { mapName = "map_" + GlobalMapDate.CCustomStr; mapName += "-" + (i + 1); if (i == 0) { //首个地图 currentMap = GetGKImgAndPosition(mapName, 400, 200); mapZBArr.Add(mapName + "!0#0" + "!400#200"); theMapArr.Add(currentMap); currentMapNameZu = mapName; //创建分支 CreateMapFenZhi(i + 1, mapName); } else if (i == mapsNum - 1) { //最后一个地图 print("最后是哪个地图!!!!!!!!!!!!!!!!!!!!!!" + (i + 1)); } else { currentMap = GetCurrentMapObjZBByName(mapName); if (currentMap == null) { continue; } if (mapName != currentMap.name) { print("数据错误!!!!!!!!!!!!!!!"); return; } currentMapNameZu += "|" + mapName; CreateMapFenZhi(i + 1, mapName); } } //生成地图 要带入 门的方向 信息 找相对方向的门 右进左出 左进右出 给选择 右的 是 进场触发 碰到切换场景 记录 门的朝向 再生成对向的门 //先要有数据 再根据数据生成 地图 不要一上来就 生成地图 print(" 地图坐标list 长度: " + mapZBArr.Count); print(" 生成的地图数据 " + currentMapNameZu); }
//创建地图的分支 上下左右 void CreateMapFenZhi(int i, string cZXMapName) { List <string> tempKyFXArr = new List <string> { }; bool isSepMap = false; isSepMap = GlobalMapDate.IsSpeMapByName(cZXMapName); //判断是否是特殊地图 if (isSepMap) { print("特殊地图名字-------------------------------------------------------------> " + cZXMapName); //tempKyFXArr = GlobalMapDate.GetFXListByName(cZXMapName); //判断各个方向是否有地图 有的话连接 return; } else { //这个地图衍生几个方向 去探索 当i越大 多方向概率越小 //10 15 20 25 int fxNums = 1; int jl = (int)UnityEngine.Random.Range(0, 100); string[] jvArr = duozhiJL.Split('-'); //扩展几个边界 if (jl < int.Parse(jvArr[0]) * (100 - i) / 100) { fxNums = 3; } else if (jl < int.Parse(jvArr[1]) * (100 - i) / 100) { fxNums = 2; } //判断周围 看看是否坐标被占用 找出空位比较 空地 List <string> fxArr = new List <string> { "l", "u", "d", "r" }; int maxNum = 4; kyFXArr.Clear(); for (int c = 0; c < fxArr.Count; c++) { //查询该坐标是否已经有地图 if (IsHasMap(fxArr[c], cZXMapName)) { maxNum--; } else { kyFXArr.Add(fxArr[c]); } } //print("剩余方向数maxNum: " + maxNum + " 扩展方向数fxNums: " + fxNums); print("当前中心地图名字 " + cZXMapName); print("扩展数量------->fxNums: " + fxNums); foreach (var stu in kyFXArr) { //print(" kyFXArr: " + stu); } if (maxNum <= fxNums) { //如果最大的空位 小于扩展数 则直接用数组里面的位置来 生成地图 tempKyFXArr = kyFXArr; } else { //方向的比重 List <string> fxzhi = new List <string> { "l-5", "d-10", "u-15", "r-70" }; //随机选取方向 生成方向数组 tempKyFXArr = ChoseFXArr(fxzhi, kyFXArr, fxNums); } foreach (var stu2 in tempKyFXArr) { print(" -----------------------------> 可以扩展的方向: " + stu2); } } //获取最大地图的名字 maxI = theMapArr.Count; //maxI = int.Parse(theMapArr[theMapArr.Count-1].name.Split('-')[1]); CreateMapByKyFXArr(tempKyFXArr, cZXMapName); return; }
string FindLJSpeMapDeMap(List <string> _SpeMapFXArr, string speMapName) { string findFX = ""; List <string> SpeMapFXArr = new List <string> { }; //string findZB = ""; //print("speMapName "+ speMapName); for (int i = mapZBArr.Count - 1; i >= 0; i--) { SpeMapFXArr = _SpeMapFXArr; for (int j = SpeMapFXArr.Count - 1; j >= 0; j--) { //寻找放置方向 if (SpeMapFXArr[j] == "l") { findFX = "r"; } else if (SpeMapFXArr[j] == "d") { findFX = "u"; } else if (SpeMapFXArr[j] == "u") { findFX = "d"; } else if (SpeMapFXArr[j] == "r") { findFX = "l"; } string cMapName = mapZBArr[i].Split('!')[0]; string _cMapZB = mapZBArr[i].Split('!')[1]; //如果是特殊地图就跳出当前循环 特殊地图是不能增加连接的 因为 门数量固定了 if (GlobalMapDate.IsSpeMapByName(cMapName)) { break; } //根据 findFX 找到 适合的 地图 1.该方向上有空位 //1判断 该位置 是否有 地图了 2判断特殊 地图在该位置 各个方向 是否有地图 if (!IsHasMap(findFX, cMapName)) { //这里 要找 这个坐标 特殊地图 另外几个方向上 是否 有地图 有的话就 continue //print(" 特殊地图 找到的 可以连接的 中心地图 名字 " + cMapName); //获取这个空位坐标 string _zb = GetZBByFX(findFX, cMapName); //这个坐标上面没有地图 这个坐标就是特殊地图 选的位置 //除开一个 fx List <string> shengyuFXArr = SpeMapFXArr; //print("中心地图是 " + cMapName + " 找到的给特殊地图 " + speMapName + "可以用的 zb " + _zb + " 移除的方向是 " + SpeMapFXArr[j]); shengyuFXArr.Remove(SpeMapFXArr[j]); //print("剩余 几个方向: "+ shengyuFXArr.Count); //foreach(string fx in shengyuFXArr) //{ // print(fx); //} if (shengyuFXArr.Count != 0 && IsZXMapFXHasMap(shengyuFXArr, _zb)) { continue; } List <string> speMapFXArr = GlobalMapDate.GetFXListByName(speMapName); //print(speMapName+" 分支数量 " +speMapFXArr.Count); //print(cMapName+" fx "+ findFX+" j "+j+" length "+ shengyuFXArr.Count +" ??特殊地图名字 "+ speMapName); //print(" ?? "+ speMapFXArr[j]); //获取这个特殊地图已经连接的方向 这个方向要剔除 string hasLianJieFX = speMapFXArr[j]; //获取剩余方向数组 在上面创建分支 如果遇到特殊地图 就将特殊数组存进临时数组 (计数 如果在特殊数组后开始 就连接上了) speMapFXArr.Remove(hasLianJieFX); //获取中心地图信息 string zxMapMsg = GetMapMsgByName(cMapName); //跟新 地图信息 中心地图 新加一个地图 GXZXMapMsg(zxMapMsg, findFX, speMapName); //记录 特殊 地图信息 TianjiaNewMapMsgInMapArr(cMapName, findFX, speMapName, _zb); //创建分支数据 CreateSpeMapFZByFXList(speMapFXArr, speMapName); return(null); } } } return(null); }
public List <string> GetMaps() { for (var i = 1; i <= MaxMapNums; i++) { cMapName = "map_" + cMapNum + "-" + i; string cMapMsg = cMapName; if (i == 1) { cMapMsg = cMapName + "!" + _qishiZB; mapZBArr.Add(cMapMsg); //保留方向 入场 根据角色进场来 保留 如果角色进来是 右进 这里保留左 CreateMapFenZhi(i, cMapName); } else { if (GlobalMapDate.IsSpeMapByName(cMapName)) { CreateSpeMapByName(cMapName); } else { if (i == mapZBArr.Count) { CreateMapFenZhi(i, cMapName); } //要判断 地图数组里面 是否已经有了 地图i if (i == MaxMapNums) { //最后一个 地图 print("生成最后一个 地图"); //MapListMsgStr += "|" + cMapMsg; } else { //MapListMsgStr += "|"+cMapMsg; } } } } //多关卡 取到新的关卡参数 开始新一轮循环 //当前关卡有几个 分支 分支的 主要方向 //如果只有一个分支 就直接在最后的 地图上 num最大值 否则在中间开始找 两边随机 避开特殊地图 是否有指定 没有指定的 单独做个 数组**** //print(" mapZBArr "+ mapZBArr.Count); //for(var s=0;s< mapZBArr.Count; s++) //{ // print(s+" : "+mapZBArr[s]); //} Globals.mapZBArr = mapZBArr; //生成地图 ShengChengImgMap(); return(mapZBArr); }
//创建地图的分支 上下左右 void CreateMapFenZhi(int i, string cZXMapName) { List <string> tempKyFXArr = new List <string> { }; bool isSepMap = false; isSepMap = GlobalMapDate.IsSpeMapByName(cZXMapName); //判断是否是特殊地图 if (isSepMap) { //print("特殊地图名字-------------------------------------------------------------> " + cZXMapName); //tempKyFXArr = GlobalMapDate.GetFXListByName(cZXMapName); //判断各个方向是否有地图 有的话连接 kyFXArr.Clear(); kyFXArr = GlobalMapDate.GetFXListByName(cZXMapName); print(kyFXArr.Count); //foreach(string fx in kyFXArr) //{ // print(" 特殊地图fx "+fx); //} //获取 特殊地图的可用 方向 for (int s = 0; s < kyFXArr.Count; s++) { if (!IsHasMap(kyFXArr[s], cZXMapName)) { tempKyFXArr.Add(kyFXArr[s]); } } if (tempKyFXArr.Count == 0) { return; } } else { if (i == 1) { //保留方向 和 出口方向 tempKyFXArr.Add("r"); } else { //这个地图衍生几个方向 去探索 当i越大 多方向概率越小 //10 15 20 25 int fxNums = MapFenZhiJL(i); //判断周围 看看是否坐标被占用 找出空位比较 空地 List <string> fxArr = new List <string> { "l", "u", "d", "r" }; //List<string> fxArr = new List<string> { "l", "r" }; int maxNum = 4; kyFXArr.Clear(); for (int c = 0; c < fxArr.Count; c++) { //查询该坐标是否已经有地图 if (IsHasMap(fxArr[c], cZXMapName)) { maxNum--; } else { kyFXArr.Add(fxArr[c]); } } if (maxNum <= fxNums) { //如果最大的空位 小于扩展数 则直接用数组里面的位置来 生成地图 tempKyFXArr = kyFXArr; } else { //方向的比重 //List<string> fxzhi = new List<string> { "l-5", "d-10", "u-15", "r-70" }; //随机选取方向 生成方向数组 tempKyFXArr = ChoseFXArr(FXBiZhi, kyFXArr, fxNums); } } } //获取最大地图的名字 //maxI = theMapArr.Count; //maxI = int.Parse(theMapArr[theMapArr.Count-1].name.Split('-')[1]); CreateMapByKyFXArr(tempKyFXArr, cZXMapName); return; }