Example #1
0
        /// <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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }