/// <summary> /// checks for the weapon firing collision. /// When collision check succeeds, returns a result report. /// If not, returns null. /// </summary> /// <param name="position">the start position of firing</param> /// <param name="direction">the direction of firing</param> /// <param name="distance">the range of firing</param> /// <param name="targetCollisionLayer">target collision layer</param> /// <param name="worldCollisionLayer">world collision layer</param> /// <returns>result report</returns> protected static CollisionResult FireHitTest(Vector3 position, Vector3 direction, float distance, ref CollisionLayer targetCollisionLayer, ref CollisionLayer worldCollisionLayer) { bool doHit = false; CollideRay collideRay = new CollideRay(position, direction); // checks with enemies. CollisionResult fireResult = FrameworkCore.CollisionContext.HitTest( collideRay, ref targetCollisionLayer, ResultType.NearestOne); if (fireResult != null) { if (fireResult.distance <= distance) { // Hit unit doHit = true; } } // checks with world. CollisionResult worldResult = FrameworkCore.CollisionContext.HitTest( collideRay, ref worldCollisionLayer, ResultType.NearestOne); if (worldResult != null) { // Hit world if (worldResult.distance <= distance) { if (doHit) { // closer world if (worldResult.distance < fireResult.distance) { return(worldResult); } } else { return(worldResult); } } } if (doHit) { return(fireResult); } return(null); }
public CollisionResult MoveHitTestWithWorld(Vector3 velocityAmount) { CollideSphere playerSphere = Collide as CollideSphere; float radius = playerSphere.Radius; // calculate simulated position for collision. Matrix transformSimulate = TransformedMatrix * Matrix.CreateTranslation(velocityAmount); // first, check using sphere. { CollideSphere simulateSphere = new CollideSphere(playerSphere.LocalCenter, radius); simulateSphere.Transform(transformSimulate); simulateSphere.Id = playerSphere.Id; CollisionResult result = FrameworkCore.CollisionContext.HitTest( simulateSphere, ref colLayerMoveWorld, ResultType.NearestOne); if (result != null) { return(result); } } // second, check using ray. { Vector3 direction = velocityAmount; direction.Normalize(); CollideRay simulateRay = new CollideRay(playerSphere.BoundingSphere.Center, direction); simulateRay.Id = playerSphere.Id; CollisionResult result = FrameworkCore.CollisionContext.HitTest( simulateRay, ref colLayerMoveWorld, ResultType.NearestOne); if (result != null) { if (result.distance <= radius) { return(result); } } } return(null); }
public CollisionResult HitTestWithWorld(Vector3 start, Vector3 direction) { CollideRay simulateRay = new CollideRay(start, direction); simulateRay.Id = Collide.Id; // Test collision CollisionResult result = FrameworkCore.CollisionContext.HitTest(simulateRay, ref colLayerMoveWorld, ResultType.NearestOne); return(result); }