地牢生成随机物体, 开发完成; 随机道具池, 开发中
1 parent 6dd8b62 commit 062bc71c1f9ef04467cc5a9ad30dc870fecf4b2e
@小李xl 小李xl authored on 22 Jan 2024
Showing 7 changed files
View
2
■■■
DungeonShooting_Godot/resource/map/tileMaps/Test1/inlet/Start/Preinstall.json
[{"Name":"Preinstall1","Weight":100,"Remark":"","AutoFill":true,"WaveList":[[{"Position":{"X":39,"Y":8},"Size":{"X":0,"Y":0},"SpecialMarkType":1,"DelayTime":0,"MarkList":[]},{"Position":{"X":-16,"Y":-18},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":52,"Y":65},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"$RandomProp","Weight":100,"Attr":null,"Altitude":16,"VerticalSpeed":0}]}],[{"Position":{"X":59,"Y":-5},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":1,"MarkList":[{"Id":"$RandomGun","Weight":100,"Attr":null,"Altitude":16,"VerticalSpeed":0}]},{"Position":{"X":11,"Y":-46},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"$RandomProp","Weight":100,"Attr":null,"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":72,"Y":-39},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":2,"MarkList":[{"Id":"$RandomEnemy","Weight":100,"Attr":null,"Altitude":0,"VerticalSpeed":0}]}]]}]
[{"Name":"Preinstall1","Weight":100,"Remark":"","AutoFill":true,"WaveList":[[{"Position":{"X":39,"Y":8},"Size":{"X":0,"Y":0},"SpecialMarkType":1,"DelayTime":0,"MarkList":[]},{"Position":{"X":-16,"Y":-18},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"Altitude":8,"VerticalSpeed":0}]}]]}]
View
172
DungeonShooting_Godot/src/framework/common/SeedRandom.cs
/// <summary>
/// 返回指定区域内的随机坐标点, 该函数比较慢, 请谨慎调用
/// </summary>
/// <param name="polygonDataList">碰撞区域数据</param>
/// <param name="count">需要随机点的数量</param>
public Vector2[] GetRandomPositionInPolygon(List<NavigationPolygonData> polygonDataList, int count)
{
public Vector2[] GetRandomPositionInPolygon(List<Vector2> vertices, List<int[]> polygons, int count)
{
if (vertices.Count == 0 || polygons.Count == 0)
{
return Vector2.Zero.MakeArray(count);
}
var minX = int.MaxValue;
var maxX = int.MinValue;
var minY = int.MaxValue;
var maxY = int.MinValue;
var outCount = 0;
 
// 遍历多边形的顶点,找到最小和最大的x、y坐标
foreach (var navigationPolygonData in polygonDataList)
{
if (navigationPolygonData.Type == NavigationPolygonType.Out)
{
outCount++;
}
foreach (var vertex in navigationPolygonData.GetPoints())
{
if (vertex.X < minX)
foreach (var vertex in vertices)
{
if (vertex.X < minX)
{
minX = Mathf.CeilToInt(vertex.X);
}
else if (vertex.X > maxX)
{
maxX = Mathf.FloorToInt(vertex.X);
}
if (vertex.Y < minY)
{
minY = Mathf.CeilToInt(vertex.Y);
}
else if (vertex.Y > maxY)
{
maxY = Mathf.FloorToInt(vertex.Y);
}
}
 
var list = new List<Vector2>();
var tryCount = 0;
while (true)
{
if (tryCount >= 2000) //尝试2000次后放弃
{
while (list.Count < count)
{
minX = Mathf.CeilToInt(vertex.X);
list.Add(Vector2.Zero);
}
else if (vertex.X > maxX)
break;
}
 
tryCount++;
var point = new Vector2(RandomRangeInt(minX, maxX), RandomRangeInt(minY, maxY));
foreach (var ps in polygons)
{
var arr = new List<Vector2>();
foreach (var i in ps)
{
maxX = Mathf.FloorToInt(vertex.X);
arr.Add(vertices[i]);
}
if (vertex.Y < minY)
 
if (Utils.IsPointInPolygon(arr, point))
{
minY = Mathf.CeilToInt(vertex.Y);
}
else if (vertex.Y > maxY)
{
maxY = Mathf.FloorToInt(vertex.Y);
}
}
}
 
var list = new List<Vector2>();
while (true)
{
var flag = outCount == 0;
var point = new Vector2(RandomRangeInt(minX, maxX), RandomRangeInt(minY, maxY));
foreach (var navigationPolygonData in polygonDataList)
{
if (navigationPolygonData.Type == NavigationPolygonType.Out)
{
if (!flag && Utils.IsPointInPolygon(navigationPolygonData.GetPoints(), point))
tryCount = 0;
list.Add(point);
if (list.Count >= count)
{
flag = true;
return list.ToArray();
}
}
else
{
if (flag && Utils.IsPointInPolygon(navigationPolygonData.GetPoints(), point))
{
flag = false;
}
}
}
 
if (flag)
{
list.Add(point);
if (list.Count >= count)
{
return list.ToArray();
}
}
}
}
}
 
return list.ToArray();
}
}
View
DungeonShooting_Godot/src/framework/common/Utils.cs
View
DungeonShooting_Godot/src/framework/map/preinstall/RoomPreinstall.cs
View
DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs
View
DungeonShooting_Godot/src/game/activity/role/enemy/NoWeaponEnemy.cs
View
DungeonShooting_Godot/src/game/room/DungeonManager.cs