Ejemplo n.º 1
0
        private void Move()
        {
            bool collision = false;
            int  loop      = 0;

            do
            {
                BoundingBox playerBox = new BoundingBox(
                    new Vector3(
                        player.GlobalPosition.X - playerRadius,
                        player.GlobalPosition.Y - playerRadius,
                        player.GlobalPosition.Z),
                    new Vector3(
                        player.GlobalPosition.X + playerRadius,
                        player.GlobalPosition.Y + playerRadius,
                        player.GlobalPosition.Z + playerHeight));

                collision = false;
                float min     = 1f;
                Axis  minAxis = Axis.None;

                foreach (var pos in blocks)
                {
                    Axis? localAxis;
                    float?moveFactor = Block.Intersect(blockDefinition.GetCollisionBoxes(null, pos.X, pos.Y, pos.Z), pos, playerBox, move, out localAxis);

                    if (moveFactor.HasValue && moveFactor.Value < min)
                    {
                        collision = true;
                        min       = moveFactor.Value;
                        minAxis   = localAxis.Value;
                    }
                }

                player += (move * min);
                move   *= (1f - min);
                switch (minAxis)
                {
                case Axis.X:
                    player += new Vector3(move.X > 0 ? -gap : gap, 0, 0);
                    move.X  = 0f;
                    break;

                case Axis.Y:
                    player += new Vector3(0, move.Y > 0 ? -gap : gap, 0);
                    move.Y  = 0f;
                    break;

                case Axis.Z:
                    player += new Vector3(0, 0, move.Z > 0 ? -gap : gap);
                    move.Z  = 0f;
                    break;
                }

                // Koordinate normalisieren (Rundwelt)
                // player.NormalizeChunkIndexXY(planet.Size);

                loop++;
            }while (collision && loop < 3);
        }
Ejemplo n.º 2
0
        public void BlockIntersectFromOutside()
        {
            BoundingBox player = new BoundingBox(new Vector3(5, 20, 30), new Vector3(6, 21, 31));

            // X-Achse links zu weit weg (keine Bewegung)
            Axis? collisionAxis;
            float?distance = Block.Intersect(block.GetCollisionBoxes(null, 0, 0, 0),
                                             new Index3(10, 20, 30), player, new Vector3(), out collisionAxis);

            Assert.AreEqual(null, collisionAxis);
            Assert.AreEqual(null, distance);

            // X-Achse links zu weit weg (bewegung nach links)
            distance = Block.Intersect(block.GetCollisionBoxes(null, 0, 0, 0),
                                       new Index3(10, 20, 30), player, new Vector3(-4, 0, 0), out collisionAxis);
            Assert.AreEqual(null, collisionAxis);
            Assert.AreEqual(null, distance);

            // X-Achse links zu weit weg (bewegung nach rechts)
            distance = Block.Intersect(block.GetCollisionBoxes(null, 0, 0, 0),
                                       new Index3(10, 20, 30), player, new Vector3(4, 0, 0), out collisionAxis);
            Assert.AreEqual(null, collisionAxis);
            Assert.AreEqual(null, distance);
        }