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); }
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); }