Exemple #1
0
        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();
        }