/// <summary> /// 响应鼠标的操作 /// </summary> public void Fire() { if (Start) { PhysicsWorld.RemoveObject(_elasticatedNet); DrawQueue.Remove(_elasticatedNet); } // 创建弹性网并加入到物理世界和绘制队列 _elasticatedNet = new ElasticatedNet( new Vector2D(40, 120).ToSimUnits(), Width, Height, GridSize, Factor ); DrawQueue.Add(_elasticatedNet); PhysicsWorld.AddObject(_elasticatedNet); // 拉扯弹性网 var net = _elasticatedNet.Net; for (int i = 0; i < Width; i++) { net[i, Height - 1].Velocity = new Vector2D(0, 0.1) * 4 * (i >= Width / 2 ? -1 : 1); net[i, Height - 1].InverseMass = 0; } Start = true; }
public ContactDemo(Image image) : base(image) { Settings.ContactIteration = 1; const int num = 5; for (int i = 0; i < num; i++) { var fB = PhysicsWorld.CreateFixedParticle((new Vector2D(160 + 40 * i, 0)).ToSimUnits()); var pB = PhysicsWorld.CreateParticle((new Vector2D(160 + 40 * i, 200)).ToSimUnits(), new Vector2D(0, 0), 2); var ball = new Ball { FixedParticle = fB, Particle = pB, R = 20 }; // 为质体绑定形状 ball.Particle.BindShape(new Circle(ball.R.ToSimUnits())); PhysicsWorld.CreateRope(200.ToSimUnits(), 0, fB, pB); DrawQueue.Add(ball); _ballList.Add(ball); } // 增加重力和空气阻力 PhysicsWorld.CreateGlobalZone(new ParticleGravity(new Vector2D(0, 40))); PhysicsWorld.CreateParticle(Vector2D.Zero, new Vector2D(1, 0), 1); Slot = 1 / 120.0; Start = true; }
public FluidDemo(Image image) : base(image) { // 创建液体容器 _water = new Water((int)image.Width, (int)image.Height); // 添加到绘制队列 DrawQueue.Add(_water); }
public void DrawQueueTest_CheckBasicAdd_NumberAndContentOfRequestsOK() { var messenger = Substitute.For <IFrameworkMessenger>(); IComparerCollection comparers = new ComparerCollection(); IDrawQueue queue = new DrawQueue(messenger, comparers, 32, 4, false); for (var n = 0; n < 10; n++) { var even = n % 2 == 0; var target = even ? CoordinateSpace.Screen : CoordinateSpace.World; var fill = even ? FillType.Coloured : FillType.Textured; if (n == 1) { fill = FillType.DualTextured; } var val = 0.1f * n; var colour = new Colour(val, val, val, val); var verts = new Vertex2D[] { new Vertex2D { Colour = Colour.White, Position = Vector2.Zero, TexCoord0 = Vector2.Zero, TexCoord1 = Vector2.One, TexWeighting = 0.9f } }; var indices = new int[] { 0, 1, 0 }; var texture0 = (ulong)n; var texture1 = (ulong)n; var texMode0 = TextureCoordinateMode.Mirror; var texMode1 = TextureCoordinateMode.Wrap; var depth = 0.05f * n; var layer = n; queue.Add( ref target, ref fill, ref colour, ref verts, ref indices, ref texture0, ref texture1, ref texMode0, ref texMode1, ref depth, ref layer); } Assert.Equal(10, queue.Data.NumRequests); var data = queue.Data; //Test values in single request Assert.Equal(CoordinateSpace.World, data.Targets[5]); Assert.Equal(FillType.Textured, data.Types[5]); Assert.Equal(0.5f, data.BaseColours[5].R, 5); Assert.Equal(0.9f, data.Vertices[data.FirstVertexPosition[5]].TexWeighting, 5); Assert.Equal(1, data.Indices[data.FirstIndexPosition[5] + 1]); Assert.Equal((ulong)5, data.Texture1[5]); Assert.Equal(0.25f, data.Depths[5], 5); Assert.Equal(5, data.Layers[5]); }
public void DrawQueueTest_CheckBasicClear_ConfirmZeroPostClear() { var messenger = Substitute.For <IFrameworkMessenger>(); IComparerCollection comparers = new ComparerCollection(); IDrawQueue queue = new DrawQueue(messenger, comparers, 32, 4, false); for (var n = 0; n < 10; n++) { var even = n % 2 == 0; var target = even ? CoordinateSpace.Screen : CoordinateSpace.World; var fill = even ? FillType.Coloured : FillType.Textured; if (n == 1) { fill = FillType.DualTextured; } var val = 0.1f * n; var colour = new Colour(val, val, val, val); var verts = new Vertex2D[] { new Vertex2D { Colour = Colour.White, Position = Vector2.Zero, TexCoord0 = Vector2.Zero, TexCoord1 = Vector2.One, TexWeighting = 0.9f } }; var indices = new int[] { 0, 1, 0 }; var texture0 = (ulong)n; var texture1 = (ulong)n; var texMode0 = TextureCoordinateMode.Mirror; var texMode1 = TextureCoordinateMode.Wrap; var depth = 0.05f * n; var layer = n; queue.Add( ref target, ref fill, ref colour, ref verts, ref indices, ref texture0, ref texture1, ref texMode0, ref texMode1, ref depth, ref layer); } Assert.Equal(10, queue.Data.NumRequests); queue.Clear(); Assert.Equal(0, queue.Data.NumRequests); }
public CircleDemo(Image image) : base(image) { // 初始化中心点 _centerObj = PhysicsWorld.CreateFixedParticle ( new Vector2D ( 250.ToSimUnits(), 200.ToSimUnits() ) ); // 注册绘制对象 DrawQueue.Add(this); }
public FireworksDemo(Image image) : base(image) { DrawQueue.Add(this); _dragZone = new RectangleZone ( 0.ToSimUnits(), (WorldHeight * 2 / 3.0).ToSimUnits(), 500.ToSimUnits(), 400.ToSimUnits() ); _dragZone.Add(_drag); _windZone = new RectangleZone ( 0.ToSimUnits(), (WorldHeight * 1 / 3.0).ToSimUnits(), 500.ToSimUnits(), (WorldHeight * 2 / 3.0).ToSimUnits() ); _windZone.Add(_wind); }
public RobDemo(Image image) : base(image) { Settings.ContactIteration = 20; _combinedParticle = new CombinedParticle(_vertexs, 3, 1, true); PhysicsWorld.AddObject(_combinedParticle); // 为顶点绑定形状 foreach (var vertex in _combinedParticle.Vertexs) { vertex.BindShape(new Circle(4.ToSimUnits())); } // 增加边缘 PhysicsWorld.CreatePolygonEdge(_edgePoints.ToArray()); // 增加重力 PhysicsWorld.CreateGravity(9.8); DrawQueue.Add(this); Start = true; }