예제 #1
0
        /// <inheritdoc />
        public override void Draw(GameTime gameTime)
        {
            Game.Background = Color.Black;
            GraphicsDevice.DepthStencilState = DepthStencilState.Default;

            Floor.Draw(FloorWorld, Camera.View, Camera.Projection);
            BoxesWorld.ForEach(boxWorld => Box.Draw(boxWorld, Camera.View, Camera.Projection));
            SpheresWorld.ForEach(sphereWorld => Sphere.Draw(sphereWorld, Camera.View, Camera.Projection));

            base.Draw(gameTime);
        }
예제 #2
0
        /// <inheritdoc />
        public override void Draw(GameTime gameTime)
        {
            Game.Background = Color.Black;
            GraphicsDevice.DepthStencilState = DepthStencilState.Default;

            TilingEffect.Parameters["WorldViewProjection"].SetValue(FloorWorld * Camera.View * Camera.Projection);
            Floor.Draw(TilingEffect);
            BoxesWorld.ForEach(boxWorld => Box.Draw(boxWorld, Camera.View, Camera.Projection));
            SpheresWorld.ForEach(sphereWorld => Sphere.Draw(sphereWorld, Camera.View, Camera.Projection));

            Game.SpriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.Opaque, SamplerState.PointClamp, DepthStencilState.Default, RasterizerState.CullCounterClockwise);
            Game.SpriteBatch.DrawString(SpriteFont, "Launch spheres with the 'Z' key.", new Vector2(GraphicsDevice.Viewport.Width - 400, 0), Color.White);
            Game.SpriteBatch.End();

            base.Draw(gameTime);
        }
예제 #3
0
        protected override void Draw(GameTime gameTime)
        {
            // Aca deberiamos poner toda la logia de renderizado del juego.
            GraphicsDevice.Clear(Color.Black);
            //Box.Draw(FloorWorld, Camera.View, Camera.Projection);
            createStage();
            Efecto.Parameters["View"].SetValue(Camera.View);
            Efecto.Parameters["Projection"].SetValue(Camera.Projection);

            GraphicsDevice.RasterizerState = new RasterizerState {
                CullMode = CullMode.None
            };

            Skybox.Draw(Camera.View, Camera.Projection, Camera.Position);


            float tiempoTranscurrido = (float)gameTime.TotalGameTime.TotalSeconds;

            //ObstaculoCubo.Draw(tiempoTranscurrido, Camera.View, Projection);
            SpheresWorld.ForEach(sphereWorld => Sphere.Draw(sphereWorld, Camera.View, Camera.Projection));

            SpriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.Opaque,
                              SamplerState.PointClamp, DepthStencilState.Default, RasterizerState.CullCounterClockwise);
            SpriteBatch.DrawString(SpriteFont, PositionE.ToString(), new Vector2(GraphicsDevice.Viewport.Width - 400, 0), Color.White);
            SpriteBatch.DrawString(SpriteFont, "\"R\" para REINICIAR", new Vector2(10, 0), Color.White);
            var sphereBody  = Simulation.Bodies.GetBodyReference(SphereHandles[0]);
            var stringSalto = "SALTO";

            if (puedoSaltar)
            {
                SpriteBatch.DrawString(SpriteFont, stringSalto,
                                       new Vector2(0, 30), Color.CornflowerBlue);
            }
            else
            {
                SpriteBatch.DrawString(SpriteFont, stringSalto, new Vector2(0, 30), Color.DarkGray);
            }
            SpriteBatch.End();
        }
예제 #4
0
        /// <inheritdoc />
        public override void Update(GameTime gameTime)
        {
            // In the demos, we use one time step per frame. We don't bother modifying the physics time step duration for different monitors so different refresh rates
            // change the rate of simulation. This doesn't actually change the result of the simulation, though, and the simplicity is a good fit for the demos.
            // In the context of a 'real' application, you could instead use a time accumulator to take time steps of fixed length as needed, or
            // fully decouple simulation and rendering rates across different threads.
            // (In either case, you'd also want to interpolate or extrapolate simulation results during rendering for smoothness.)
            // Note that taking steps of variable length can reduce stability. Gradual or one-off changes can work reasonably well.
            Simulation.Timestep(1 / 60f, ThreadDispatcher);
            Camera.Update(gameTime);

            if (Game.CurrentKeyboardState.IsKeyDown(Keys.Z) && CanShoot)
            {
                CanShoot = false;
                // Create the shape that we'll launch at the pyramids when the user presses a button.
                var radius      = 0.5f + 5 * (float)Random.NextDouble();
                var bulletShape = new Sphere(radius);

                // Note that the use of radius^3 for mass can produce some pretty serious mass ratios.
                // Observe what happens when a large ball sits on top of a few boxes with a fraction of the mass-
                // the collision appears much squishier and less stable. For most games, if you want to maintain rigidity, you'll want to use some combination of:
                // 1) Limit the ratio of heavy object masses to light object masses when those heavy objects depend on the light objects.
                // 2) Use a shorter timestep duration and update more frequently.
                // 3) Use a greater number of solver iterations.
                // #2 and #3 can become very expensive. In pathological cases, it can end up slower than using a quality-focused solver for the same simulation.
                // Unfortunately, at the moment, bepuphysics v2 does not contain any alternative solvers, so if you can't afford to brute force the the problem away,
                // the best solution is to cheat as much as possible to avoid the corner cases.
                var position        = new NumericVector3(-40 + 210 * (float)Random.NextDouble(), 130, 130);
                var bodyDescription = BodyDescription.CreateConvexDynamic(position,
                                                                          new BodyVelocity(new NumericVector3((float)Random.NextDouble(), 0, -110)),
                                                                          bulletShape.Radius * bulletShape.Radius * bulletShape.Radius, Simulation.Shapes, bulletShape);

                var bodyHandle = Simulation.Bodies.Add(bodyDescription);

                Radii.Add(radius);
                SphereHandles.Add(bodyHandle);
            }

            if (Game.CurrentKeyboardState.IsKeyUp(Keys.Z))
            {
                CanShoot = true;
            }


            BoxesWorld.Clear();
            var boxHandleCount = BoxHandles.Count;

            for (var index = 0; index < boxHandleCount; index++)
            {
                var pose       = Simulation.Bodies.GetBodyReference(BoxHandles[index]).Pose;
                var position   = pose.Position;
                var quaternion = pose.Orientation;
                var world      =
                    Matrix.CreateFromQuaternion(new Quaternion(quaternion.X, quaternion.Y, quaternion.Z,
                                                               quaternion.W)) * Matrix.CreateTranslation(new Vector3(position.X, position.Y, position.Z));
                BoxesWorld.Add(world);
            }

            SpheresWorld.Clear();
            var sphereHandleCount = SphereHandles.Count;

            for (var index = 0; index < sphereHandleCount; index++)
            {
                var pose       = Simulation.Bodies.GetBodyReference(SphereHandles[index]).Pose;
                var position   = pose.Position;
                var quaternion = pose.Orientation;
                var world      = Matrix.CreateScale(Radii[index]) *
                                 Matrix.CreateFromQuaternion(new Quaternion(quaternion.X, quaternion.Y, quaternion.Z,
                                                                            quaternion.W)) *
                                 Matrix.CreateTranslation(new Vector3(position.X, position.Y, position.Z));
                SpheresWorld.Add(world);
            }


            Game.Gizmos.UpdateViewProjection(Camera.View, Camera.Projection);

            base.Update(gameTime);
        }
예제 #5
0
        private void UpdatePhysics()
        {
            //Physics
            Simulation.Timestep(1 / 60f, ThreadDispatcher);
            SpheresWorld.Clear();
            var sphereBody = Simulation.Bodies.GetBodyReference(SphereHandles[0]);

            var playerAceleration = 5;

            //var plataforma = Simulation.Statics.GetStaticReference(StaticHandle[0]);

            //var spheresHandleCount = SphereHandles.Count;

            if (Keyboard.GetState().IsKeyDown(Keys.Up))
            {
                sphereBody.Awake           = true;
                sphereBody.Velocity.Linear = sphereBody.Velocity.Linear + NumericVector3Utils.Forward * playerAceleration;
            }

            if (Keyboard.GetState().IsKeyDown(Keys.Down))
            {
                sphereBody.Awake           = true;
                sphereBody.Velocity.Linear = sphereBody.Velocity.Linear + NumericVector3Utils.Backward * playerAceleration;
            }

            if (Keyboard.GetState().IsKeyDown(Keys.Left))
            {
                sphereBody.Awake           = true;
                sphereBody.Velocity.Linear = sphereBody.Velocity.Linear + NumericVector3Utils.Left * playerAceleration;
            }

            if (Keyboard.GetState().IsKeyDown(Keys.Right))
            {
                sphereBody.Awake           = true;
                sphereBody.Velocity.Linear = sphereBody.Velocity.Linear + NumericVector3Utils.Right * playerAceleration;
            }

            if (Keyboard.GetState().IsKeyDown(Keys.Space))
            {
                //sphereBody.Velocity.Linear = sphereBody.Velocity.Linear + new NumericVector3(0, 100, 0);
                if (puedoSaltar)
                {
                    var jumpImpulseForce = 1000;
                    sphereBody.Awake = true;
                    sphereBody.ApplyLinearImpulse(NumericVector3Utils.Up * jumpImpulseForce);
                    puedoSaltar = false;
                }
            }

            if (Keyboard.GetState().IsKeyDown(Keys.R) || PositionE.Y < -500)
            {
                sphereBody.Awake            = true;
                sphereBody.Pose.Position    = new NumericVector3(0f, 10f, 0f);
                sphereBody.Velocity.Linear  = NumericVector3.Zero;
                sphereBody.Velocity.Angular = NumericVector3.Zero;
                puedoSaltar = true;
            }

            var pose       = sphereBody.Pose;
            var position   = pose.Position;
            var quaternion = pose.Orientation;
            var world      = Matrix.CreateScale(0.05f) *
                             Matrix.CreateFromQuaternion(new Quaternion(quaternion.X, quaternion.Y, quaternion.Z,
                                                                        quaternion.W)) *
                             Matrix.CreateTranslation(new Vector3(position.X, position.Y, position.Z));

            SpheresWorld.Add(world);

            PositionE = new Vector3(position.X, position.Y, position.Z);
        }