/// <summary> /// Constructs a dictionary that maps a TileMap to a Physics2DServer-created StaticBody2D (RID). /// Is used for both the walls and ledges dictionaries. /// </summary> /// <param name="tileMaps">List of TileMaps.</param> /// <param name="worldSpace">RID of the World Space.</param> /// <returns>A Dictionary that maps TileMaps to an RID of a StaticBody2D.</returns> public static Dictionary<TileMap, RID> ConstructTileMapCollisionMap(this TileMapList tileMaps, RID worldSpace) { if (tileMaps is null) throw new ArgumentNullException(nameof(tileMaps)); var tileMapToSB2Ds = new Dictionary<TileMap, RID>(); foreach (TileMap tileMap in tileMaps.Values) { RID edgeSB2D = Physics2DServer.BodyCreate(); Physics2DServer.BodySetMode(edgeSB2D, Physics2DServer.BodyMode.Static); Physics2DServer.BodySetSpace(edgeSB2D, worldSpace); Physics2DServer.BodySetState(edgeSB2D, Physics2DServer.BodyState.Transform, Transform2D.Identity); Physics2DServer.BodySetCollisionLayer(edgeSB2D, LayersFuncs.GetLayersValue(Terrain)); Physics2DServer.BodySetCollisionMask(edgeSB2D, LayersFuncs.GetLayersValue(PlayerEntity, NpcEntity)); tileMapToSB2Ds.Add(tileMap, edgeSB2D); } return tileMapToSB2Ds; }
ConstructFloorPartitions(this TileMapList tileMaps, Dictionary <TileMap, RID> tileMapToFloorArea2Ds, PerimeterData perimData) { if (tileMaps is null) { throw new ArgumentNullException(nameof(tileMaps)); } if (tileMapToFloorArea2Ds is null) { throw new ArgumentNullException(nameof(tileMapToFloorArea2Ds)); } if (perimData is null) { throw new ArgumentNullException(nameof(perimData)); } var floorArea2DToPolygons = new Dictionary <RID, List <ConvexPolygonShape2D> >(); foreach (TileMap tileMap in tileMaps.Values) { RID area2dRID = tileMapToFloorArea2Ds[tileMap]; floorArea2DToPolygons[area2dRID] = new List <ConvexPolygonShape2D>(); Physics2DServer.AreaSetCollisionLayer(area2dRID, LayersFuncs.GetLayersValue(Terrain)); Physics2DServer.AreaSetCollisionMask(area2dRID, LayersFuncs.GetLayersValue(PlayerEntity, NpcEntity)); int maxTileGroups = perimData.GetMaxTileGroup(tileMap); for (int tileGroup = 0; tileGroup < maxTileGroups; tileGroup++) { int maxHoleGroups = perimData.GetMaxHoleGroup(tileMap, tileGroup); var allPerims = new List <Vector2> [maxHoleGroups]; for (int holeGroup = 0; holeGroup < maxHoleGroups; holeGroup++) { //put all perims (outer and hole) from one tile group into a single array of lists (gods help me) for partitioning EdgeCollection <TileEdge> edgeColl = perimData.GetEdgeCollection(tileMap, tileGroup, holeGroup); allPerims[holeGroup] = new List <Vector2>(edgeColl.GetSimplifiedPerim()); } List <ConvexPolygonShape2D> partitionedRectangles = _PartitionPolygonToRectangles(allPerims); foreach (ConvexPolygonShape2D shape in partitionedRectangles) { Physics2DServer.AreaAddShape(area2dRID, shape.GetRid()); GD.PrintS("added shape " + shape.GetRid().GetId() + " to area: " + area2dRID.GetId()); } floorArea2DToPolygons[area2dRID].AddRange(partitionedRectangles); } } return(floorArea2DToPolygons); }