private void AddEdgeMarker() { var mw = MapFullBounds.Width; var mh = MapFullBounds.Height; var ex = 2 * GDConstants.TILE_WIDTH; var rn = new FRectangle(-ex, -ex, mw + 2 * ex, ex); var re = new FRectangle(+mw, -ex, ex, mh + 2 * ex); var rs = new FRectangle(-ex, +mh, mw + 2 * ex, ex); var rw = new FRectangle(-ex, -ex, ex, mh + 2 * ex); var dn = new MarkerCollisionBorder { Side = FlatAlign4.NN }; var de = new MarkerCollisionBorder { Side = FlatAlign4.EE }; var ds = new MarkerCollisionBorder { Side = FlatAlign4.SS }; var dw = new MarkerCollisionBorder { Side = FlatAlign4.WW }; var bn = BodyFactory.CreateBody(GetPhysicsWorld(), ConvertUnits2.ToSimUnits(rn.Center), 0, BodyType.Static, dn); var be = BodyFactory.CreateBody(GetPhysicsWorld(), ConvertUnits2.ToSimUnits(re.Center), 0, BodyType.Static, de); var bs = BodyFactory.CreateBody(GetPhysicsWorld(), ConvertUnits2.ToSimUnits(rs.Center), 0, BodyType.Static, ds); var bw = BodyFactory.CreateBody(GetPhysicsWorld(), ConvertUnits2.ToSimUnits(rw.Center), 0, BodyType.Static, dw); var fn = FixtureFactory.AttachRectangle(ConvertUnits.ToSimUnits(rn.Width), ConvertUnits.ToSimUnits(rn.Height), 1, Vector2.Zero, bn, dn); var fe = FixtureFactory.AttachRectangle(ConvertUnits.ToSimUnits(re.Width), ConvertUnits.ToSimUnits(re.Height), 1, Vector2.Zero, be, de); var fs = FixtureFactory.AttachRectangle(ConvertUnits.ToSimUnits(rs.Width), ConvertUnits.ToSimUnits(rs.Height), 1, Vector2.Zero, bs, ds); var fw = FixtureFactory.AttachRectangle(ConvertUnits.ToSimUnits(rw.Width), ConvertUnits.ToSimUnits(rw.Height), 1, Vector2.Zero, bw, dw); }
private World CreateRayWorld(LevelBlueprint lvl) { var world = new World(Vector2.Zero); ConvertUnits.SetDisplayUnitToSimUnitRatio(GDConstants.PHYSICS_CONVERSION_FACTOR); foreach (var elem in lvl.AllCannons) { if (elem.Diameter < 0.01f) { throw new Exception("Invalid Physics"); } var body = BodyFactory.CreateBody(world, ConvertUnits.ToSimUnits(new Vector2(elem.X, elem.Y)), 0, BodyType.Static, elem); FixtureFactory.AttachCircle(ConvertUnits.ToSimUnits(elem.Diameter / 2f), 1, body, Vector2.Zero, elem); } foreach (var elem in lvl.BlueprintGlassBlocks) { if (elem.Width < 0.01f) { throw new Exception("Invalid Physics"); } if (elem.Height < 0.01f) { throw new Exception("Invalid Physics"); } var body = BodyFactory.CreateBody(world, ConvertUnits.ToSimUnits(new Vector2(elem.X, elem.Y)), 0, BodyType.Static, elem); FixtureFactory.AttachRectangle(ConvertUnits.ToSimUnits(elem.Width), ConvertUnits.ToSimUnits(elem.Height), 1, Vector2.Zero, body, elem); } foreach (var elem in lvl.BlueprintVoidCircles) { if (elem.Diameter < 0.01f) { throw new Exception("Invalid Physics"); } var body = BodyFactory.CreateBody(world, ConvertUnits.ToSimUnits(new Vector2(elem.X, elem.Y)), 0, BodyType.Static, elem); FixtureFactory.AttachCircle(ConvertUnits.ToSimUnits(elem.Diameter / 2f), 1, body, Vector2.Zero, elem); } foreach (var elem in lvl.BlueprintVoidWalls) { if (elem.Length < 0.01f) { throw new Exception("Invalid Physics"); } var body = BodyFactory.CreateBody(world, ConvertUnits.ToSimUnits(new Vector2(elem.X, elem.Y)), 0, BodyType.Static, elem); FixtureFactory.AttachRectangle(ConvertUnits.ToSimUnits(elem.Length), ConvertUnits.ToSimUnits(VoidWallBlueprint.DEFAULT_WIDTH), 1, Vector2.Zero, body, elem); body.Rotation = FloatMath.DegRad * elem.Rotation; } foreach (var elem in lvl.BlueprintBlackHoles) { if (elem.Diameter < 0.01f) { throw new Exception("Invalid Physics"); } var body = BodyFactory.CreateBody(world, ConvertUnits.ToSimUnits(new Vector2(elem.X, elem.Y)), 0, BodyType.Static, elem); FixtureFactory.AttachCircle(ConvertUnits.ToSimUnits(elem.Diameter * 0.5f * 0.3f), 1, body, Vector2.Zero, elem); } foreach (var elem in lvl.BlueprintPortals) { if (elem.Length < 0.01f) { throw new Exception("Invalid Physics"); } var body = BodyFactory.CreateBody(world, ConvertUnits.ToSimUnits(new Vector2(elem.X, elem.Y)), 0, BodyType.Static, elem); FixtureFactory.AttachRectangle(ConvertUnits.ToSimUnits(elem.Length), ConvertUnits.ToSimUnits(PortalBlueprint.DEFAULT_WIDTH), 1, Vector2.Zero, body, elem); body.Rotation = FloatMath.DegRad * (elem.Normal + 90); } foreach (var elem in lvl.BlueprintMirrorBlocks) { if (elem.Width < 0.01f) { throw new Exception("Invalid Physics"); } if (elem.Height < 0.01f) { throw new Exception("Invalid Physics"); } var body = BodyFactory.CreateBody(world, ConvertUnits.ToSimUnits(new Vector2(elem.X, elem.Y)), FloatMath.ToRadians(elem.Rotation), BodyType.Static, elem); FixtureFactory.AttachRectangle(ConvertUnits.ToSimUnits(elem.Width), ConvertUnits.ToSimUnits(elem.Height), 1, Vector2.Zero, body, elem); } foreach (var elem in lvl.BlueprintMirrorCircles) { if (elem.Diameter < 0.01f) { throw new Exception("Invalid Physics"); } var body = BodyFactory.CreateBody(world, ConvertUnits.ToSimUnits(new Vector2(elem.X, elem.Y)), 0, BodyType.Static, elem); FixtureFactory.AttachCircle(ConvertUnits.ToSimUnits(elem.Diameter / 2f), 1, body, Vector2.Zero, elem); } if (lvl.WrapMode == LevelBlueprint.WRAPMODE_SOLID) { var mw = lvl.LevelWidth; var mh = lvl.LevelHeight; var ex = 2 * GDConstants.TILE_WIDTH; var rn = new FRectangle(-ex, -ex, mw + 2 * ex, ex); var re = new FRectangle(+mw, -ex, ex, mh + 2 * ex); var rs = new FRectangle(-ex, +mh, mw + 2 * ex, ex); var rw = new FRectangle(-ex, -ex, ex, mh + 2 * ex); var dn = new MarkerCollisionBorder { Side = FlatAlign4.NN }; var de = new MarkerCollisionBorder { Side = FlatAlign4.EE }; var ds = new MarkerCollisionBorder { Side = FlatAlign4.SS }; var dw = new MarkerCollisionBorder { Side = FlatAlign4.WW }; var bn = BodyFactory.CreateBody(world, ConvertUnits.ToSimUnits(rn.VecCenter), 0, BodyType.Static, dn); var be = BodyFactory.CreateBody(world, ConvertUnits.ToSimUnits(re.VecCenter), 0, BodyType.Static, de); var bs = BodyFactory.CreateBody(world, ConvertUnits.ToSimUnits(rs.VecCenter), 0, BodyType.Static, ds); var bw = BodyFactory.CreateBody(world, ConvertUnits.ToSimUnits(rw.VecCenter), 0, BodyType.Static, dw); var fn = FixtureFactory.AttachRectangle(ConvertUnits.ToSimUnits(rn.Width), ConvertUnits.ToSimUnits(rn.Height), 1, Vector2.Zero, bn, dn); var fe = FixtureFactory.AttachRectangle(ConvertUnits.ToSimUnits(re.Width), ConvertUnits.ToSimUnits(re.Height), 1, Vector2.Zero, be, de); var fs = FixtureFactory.AttachRectangle(ConvertUnits.ToSimUnits(rs.Width), ConvertUnits.ToSimUnits(rs.Height), 1, Vector2.Zero, bs, ds); var fw = FixtureFactory.AttachRectangle(ConvertUnits.ToSimUnits(rw.Width), ConvertUnits.ToSimUnits(rw.Height), 1, Vector2.Zero, bw, dw); } return(world); }