/*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(); }
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)); }
IEnumerator MajorNoise(Transform source, Transform destination, LightningData ld) { while (true) { ld.SetPath(source.position, destination.position); yield return(new WaitForSeconds(ld.Delay())); } }
IEnumerator MinorNoise(LightningData ld) { while (true) { for (int i = 1; i < ld.positions.Length; i++) { ld.positions[i] += ld.MinorRandomOffset(); } yield return(new WaitForEndOfFrame()); } }
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(); }
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); } }
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()); }
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; }