Ejemplo n.º 1
0
        public void PerformExplosion(
            TSVector2 origin,
            FP radius,
            VoltExplosionCallback callback,
            VoltBodyFilter targetFilter    = null,
            VoltBodyFilter occlusionFilter = null,
            int ticksBehind = 0,
            int rayCount    = 32)
        {
            if (ticksBehind < 0)
            {
                throw new ArgumentOutOfRangeException("ticksBehind");
            }

            // Get all target bodies
            this.PopulateFiltered(
                origin,
                radius,
                targetFilter,
                ticksBehind,
                ref this.targetBodies);

            // Get all occluding bodies
            this.PopulateFiltered(
                origin,
                radius,
                occlusionFilter,
                ticksBehind,
                ref this.occludingBodies);

            VoltRayCast ray;
            FP          rayWeight      = 1.0f / rayCount;
            FP          angleIncrement = (TSMath.Pi * 2.0f) * rayWeight;

            for (int i = 0; i < rayCount; i++)
            {
                TSVector2 normal = VoltMath.Polar(angleIncrement * i);
                ray = new VoltRayCast(origin, normal, radius);

                FP minDistance =
                    this.GetOccludingDistance(ray, ticksBehind);
                minDistance += VoltWorld.EXPLOSION_OCCLUDER_SLOP;

                this.TestTargets(ray, callback, ticksBehind, minDistance, rayWeight);
            }
        }
Ejemplo n.º 2
0
        public void PerformExplosion(
      Vector2 origin,
      float radius,
      VoltExplosionCallback callback,
      VoltBodyFilter targetFilter = null,
      VoltBodyFilter occlusionFilter = null,
      int ticksBehind = 0,
      int rayCount = 32)
        {
            if (ticksBehind < 0)
            throw new ArgumentOutOfRangeException("ticksBehind");

              // Get all target bodies
              this.PopulateFiltered(
            origin,
            radius,
            targetFilter,
            ticksBehind,
            ref this.targetBodies);

              // Get all occluding bodies
              this.PopulateFiltered(
            origin,
            radius,
            occlusionFilter,
            ticksBehind,
            ref this.occludingBodies);

              VoltRayCast ray;
              float rayWeight = 1.0f / rayCount;
              float angleIncrement = (Mathf.PI * 2.0f) * rayWeight;

              for (int i = 0; i < rayCount; i++)
              {
            Vector2 normal = VoltMath.Polar(angleIncrement * i);
            ray = new VoltRayCast(origin, normal, radius);

            float minDistance =
              this.GetOccludingDistance(ray, ticksBehind);
            minDistance += VoltWorld.EXPLOSION_OCCLUDER_SLOP;

            this.TestTargets(ray, callback, ticksBehind, minDistance, rayWeight);
              }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Tests all valid explosion targets for a given ray.
        /// </summary>
        private void TestTargets(
            VoltRayCast ray,
            VoltExplosionCallback callback,
            int ticksBehind,
            FP minOccluderDistance,
            FP rayWeight)
        {
            for (int i = 0; i < this.targetBodies.Count; i++)
            {
                VoltBody      targetBody = this.targetBodies[i];
                VoltRayResult result     = default(VoltRayResult);

                if (targetBody.RayCast(ref ray, ref result, ticksBehind))
                {
                    if (result.Distance < minOccluderDistance)
                    {
                        callback.Invoke(ray, result, rayWeight);
                    }
                }
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Tests all valid explosion targets for a given ray.
        /// </summary>
        private void TestTargets(
      VoltRayCast ray,
      VoltExplosionCallback callback,
      int ticksBehind,
      float minOccluderDistance,
      float rayWeight)
        {
            for (int i = 0; i < this.targetBodies.Count; i++)
              {
            VoltBody targetBody = this.targetBodies[i];
            VoltRayResult result = default(VoltRayResult);

            if (targetBody.RayCast(ref ray, ref result, ticksBehind))
              if (result.Distance < minOccluderDistance)
            callback.Invoke(ray, result, rayWeight);
              }
        }