示例#1
0
    /*void Update ()
     * {
     *      Vector3 origin = transform.position;
     *      Vector3 target = Conversion.mouseToMetres2D ();
     *      refresh = false;
     *      time += Time.deltaTime;
     *      if (time >= majorRefreshRate) {refresh = true; time = 0;}
     *      if (lengthScaling) {
     *              float distance = Vector3.Distance (origin, target) / 5;
     *              turb = turblulence * distance;
     *              turbNoise = turbalanceNoise * distance;
     *              line.widthMultiplier = width * distance;
     *      } else
     *      {
     *              turb = turblulence;
     *              line.widthMultiplier = width;
     *              turbNoise = turbalanceNoise;
     *      }
     *      target = Conversion.mouseToMetres2D ();
     *      positions [0] = origin;
     *      positions [positions.Length-1] =  target;
     *
     *      float minorTurb = turb * ratio;
     *      float minorNoise = turbNoise * ratio;
     *      for (int i = 1; i <= majorSegments; i++)
     *      {
     *              if (refresh)
     *              {
     *                      Vector3 position = (target - origin) * i / (majorSegments) + origin;
     *                      position += RandomOffset (turb, turbNoise);
     *                      positions [i * minorSegments] = position;
     *              }
     *              Vector3 minorOrigin = positions [(i - 1)*minorSegments];
     *              Vector3 minorTarget = positions [i*minorSegments];
     *              for (int a = 1; a <= minorSegments; a++)
     *              {
     *                      Vector3 minorPosition = (minorTarget-minorOrigin) * a / (minorSegments) + minorOrigin;
     *                      minorPosition += RandomOffset(minorTurb,minorNoise);
     *                      positions [(i - 1)*minorSegments + a] = minorPosition;
     *              }
     *      }
     *      line.positionCount = positions.Length;
     *      line.SetPositions (positions);
     * }*/
    public void Strike(Vector3 origin, Vector3 target)
    {
        LightningData ld = GetPreset(-1);

        ld.SetPath(origin, target);
        ld.Render();
    }
示例#2
0
    public void Tether(Transform source, Transform destination, Condition condition)
    {
        LightningData ld = GetPreset(0);

        StartCoroutine(MaintainTether(source, destination, ld, condition));
        ld = GetPreset(1);
        StartCoroutine(MaintainTether(source, destination, ld, condition));
    }
示例#3
0
 IEnumerator MajorNoise(Transform source, Transform destination, LightningData ld)
 {
     while (true)
     {
         ld.SetPath(source.position, destination.position);
         yield return(new WaitForSeconds(ld.Delay()));
     }
 }
示例#4
0
 IEnumerator MinorNoise(LightningData ld)
 {
     while (true)
     {
         for (int i = 1; i < ld.positions.Length; i++)
         {
             ld.positions[i] += ld.MinorRandomOffset();
         }
         yield return(new WaitForEndOfFrame());
     }
 }
示例#5
0
 private void DrawLightning(LightningData data, float w)
 {
     SB.Begin(SpriteSortMode.Immediate, BlendState.Additive, SamplerState.LinearClamp, DepthStencilState.None, RasterizerState.CullNone);
     for (int i = 0; i < data.Lines.Count;)
     {
         Vector2 s    = data.Lines[i++];
         Vector2 e    = data.Lines[i++];
         Vector2 d    = e - s;
         float   dist = d.Length();
         d /= dist;
         float r = (float)Math.Atan2(d.Y, d.X);
         SB.Draw(tLightning, s, rsLEndL, data.Color, r, originLEndL, new Vector2(w, w) * scaleLEnd, SpriteEffects.None, 0);
         SB.Draw(tLightning, s, rsLMid, data.Color, r, originLMid, new Vector2(dist, w) * scaleLMid, SpriteEffects.None, 0);
         SB.Draw(tLightning, e, rsLEndR, data.Color, r, originLEndR, new Vector2(w, w) * scaleLEnd, SpriteEffects.None, 0);
     }
     SB.End();
 }
示例#6
0
    LightningData GetPreset(int index)
    {
        LineChild     renderer;
        LightningData ld;

        switch (index)
        {
        case 0:
            renderer          = (LineChild)manager.GetAvailableChild();
            renderer.reserved = true;
            ld                        = new LightningData(renderer);
            ld.width                  = 0.15f;
            ld.widthNoise             = 5f;
            ld.majorSegments          = 2;
            ld.minorSegments          = 2;
            ld.turbulence             = 0.1f;
            ld.turbulenceNoise        = 1.75f;
            ld.majorRefreshDelay      = 0.1f;
            ld.majorRefreshDelayNoise = 1.6f;
            ld.ratio                  = 0.23f;
            return(ld);

        case 1:
            renderer          = (LineChild)manager.GetAvailableChild();
            renderer.reserved = true;
            ld                        = new LightningData(renderer);
            ld.width                  = 0.1f;
            ld.widthNoise             = 2f;
            ld.majorSegments          = 2;
            ld.minorSegments          = 2;
            ld.turbulence             = 0.1f;
            ld.turbulenceNoise        = 1.75f;
            ld.majorRefreshDelay      = 0.1f;
            ld.majorRefreshDelayNoise = 1.6f;
            ld.ratio                  = 0.23f;
            return(ld);

        default:
            renderer = (LineChild)manager.GetAvailableChild();
            ld       = new LightningData(renderer);
            return(ld);
        }
    }
示例#7
0
    IEnumerator MaintainTether(Transform source, Transform destination, LightningData ld, Condition condition)
    {
        ld.SetPath(source.position, destination.position);
        IEnumerator minor = MinorNoise(ld);

        StartCoroutine(minor);
        IEnumerator major = MajorNoise(source, destination, ld);

        StartCoroutine(major);
        while (condition())
        {
            ld.positions [0] = source.position;
            ld.positions [ld.positions.Length - 1] = destination.position;
            ld.Render();
            yield return(null);
        }
        StopCoroutine(minor);
        StopCoroutine(major);
        ld.renderer.reserved = false;
        yield return(new WaitForEndOfFrame());
    }
示例#8
0
        public override void Draw(GameTime gameTime)
        {
            if (lastLightning > 0)
            {
                lastLightning--;
            }
            bool playSound = false;

            // Compute Lightning
            LightningData bolts    = new LightningData(lBoltArgs.Color);
            LightningData branches = new LightningData(lBranchArgs.Color);
            int           rC       = r.Next(LightningPerFrame);

            for (int i = 0; i < rC; i++)
            {
                Vector2 ts = Vector2.Zero, te = ts;
                if (r.NextDouble() > uic.BranchProbability)
                {
                    te = ViewSize / 2f;
                    ts = textPos[r.Next(textPos.Count)];
                    float d2 = float.MaxValue;
                    for (int ri = 0; ri < LightningNeighborChecks; ri++)
                    {
                        Vector2 tet = textPos[r.Next(textPos.Count)];
                        float   d2t = (tet - ts).LengthSquared();
                        if (d2t < d2)
                        {
                            d2 = d2t;
                            te = tet;
                        }
                    }
                    lBoltArgs.Start = ts;
                    lBoltArgs.End   = te;
                    LightningGenerator.CreateLightning(lBoltArgs, ref bolts, r);
                }
                else
                {
                    playSound = true;
                    float bsx = (float)r.NextDouble() * ViewSize.X;
                    lBranchArgs.Start = new Vector2(bsx, 0);
                    lBranchArgs.End   = new Vector2(bsx, ViewSize.Y * 10f);
                    LightningGenerator.CreateBranch(lBranchArgs, ref branches, r);
                }
            }
            playSound &= lastLightning == 0;
            if (playSound)
            {
                lastLightning = uic.LightningPlayPause;
                seLightning.Play();
            }
            // Set Render Target To Lightning
            G.SetRenderTarget(rtLightning);
            G.Clear(Color.Transparent);

            // Draw Faded Lightning
            SB.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.PointClamp, DepthStencilState.None, RasterizerState.CullNone);
            SB.Draw(rtLightningPrev, G.Viewport.TitleSafeArea, new Color(BoltFade, BoltFade, BoltFade, BoltFade));
            SB.End();
            DrawLightning(bolts, uic.Bolt.Width);

            // Set Render Target To Lightning Branches
            G.SetRenderTarget(rtLightningBr);
            G.Clear(Color.Transparent);

            // Draw Faded Lightning Branches
            SB.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.PointClamp, DepthStencilState.None, RasterizerState.CullNone);
            SB.Draw(rtLightningBrPrev, G.Viewport.TitleSafeArea, new Color(BoltFade, BoltFade, BoltFade, BoltFade));
            SB.End();
            DrawLightning(branches, uic.Branch.Width);
            SB.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.PointClamp, DepthStencilState.None, RasterizerState.CullNone);
            SB.Draw(tLightning, ViewSize / 2f, null, Color.Black, 0, new Vector2(tLightning.Width, tLightning.Height) / 2f, new Vector2(4f, 0.7f), SpriteEffects.None, 0);
            SB.End();

            // Draw Lightning To User
            G.SetRenderTarget(null);
            G.Clear(uic.ColorBackground);
            SB.Begin(SpriteSortMode.Immediate, BlendState.Additive, SamplerState.PointClamp, DepthStencilState.None, RasterizerState.CullNone);
            SB.Draw(rtLightning, G.Viewport.TitleSafeArea, Color.White);
            SB.Draw(rtLightningBr, G.Viewport.TitleSafeArea, Color.White);
            SB.End();

            // Swap Lightning Render Targets
            var b = rtLightning;

            rtLightning     = rtLightningPrev;
            rtLightningPrev = b;
            b                 = rtLightningBr;
            rtLightningBr     = rtLightningBrPrev;
            rtLightningBrPrev = b;
        }