public GameStartup() { const float dt = 1 / 60f; ClientSize = new Size(900, 720); DoubleBuffered = true; keys = new KeyState(); world = new EcsWorld(); worldEvents = new EcsWorld(); worldConstraints = new EcsWorld(); gameplayData = new GameplayData(new Vector2(0, -9.80665f)); physicsData = new PhysicsData(dt, 10, 4, 2); renderData = new RenderData(ClientSize.Width, ClientSize.Height, 60f); var sharedData = new SharedData(new PhysicsObjectsFactory(world, worldConstraints), gameplayData, physicsData, renderData, keys); gameplaySystems = new EcsSystems(world, sharedData); gameplaySystems .AddWorld(worldEvents, PhysicsWorldNames.Events) .AddWorld(worldConstraints, PhysicsWorldNames.Constraints) .Add(new InitEnvironment()) // .Add(new CreateSegments()) .Add(new Grabber()) .Inject() .Init(); physicsSystems = new EcsSystems(world, physicsData); physicsSystems .AddWorld(worldEvents, PhysicsWorldNames.Events) .AddWorld(worldConstraints, PhysicsWorldNames.Constraints) // force generators .Add(new ApplyStaticGravity()) // custom one .Add(new UpdateSprings()) // apply forces .Add(new IntegratePoses()) // update bounding volumes .Add(new UpdateCirclesBV()) .Add(new UpdateMeshesBV()) // broad phase .Add(new BroadPhase()) // narrow phase .Add(new ContactTesterCircleCircle()) .Add(new ContactTesterCircleMesh()) .Add(new ContactTesterCircleSegment()) .Add(new ContactTesterMeshSegment()) .Add(new ContactTesterCircleAABox()) // solver phase .Add(new DynamicDefaultContactSolver <Dynamic, Dynamic>()) .Add(new StaticDefaultContactSolver <Dynamic, Static>()) // physics systems internally use PhysicsData, // but you can inject your own data for custom force generators .Inject(gameplayData) .Init(); renderSystems = new EcsSystems(world, sharedData); renderSystems .AddWorld(worldEvents, PhysicsWorldNames.Events) .AddWorld(worldConstraints, PhysicsWorldNames.Constraints) .Add(new DrawVelocities()) .Add(new DrawSegments()) .Add(new DrawMeshes()) .Add(new DrawAABoxes()) .Add(new DrawSprings()) // .Add(new DrawBoundingBoxes()) .Add(new RenderMeshesMassCenter()) .Inject(renderData) .Init(); var timer = new Timer(); timer.Interval = 16; timer.Tick += GameLoop; timer.Start(); }