Jypeli  9
The simple game programming library
Lightning.cs
Siirry tämän tiedoston dokumentaatioon.
1 using System.Collections.Generic;
2 
3 namespace Jypeli.Effects
4 {
5  internal class LightningLayer
6  {
7  public List<LightningNode> Nodes
8  {
9  get { return nodes; }
10  set { nodes = value; }
11  }
12 
13  private List<LightningNode> nodes;
14 
15  private double y;
16  public double Y { get { return y; } set { y = value; } }
17 
18  public LightningLayer()
19  {
20  nodes = new List<LightningNode>();
21  }
22 
23  public void Add(LightningNode n)
24  {
25  nodes.Add(n);
26  }
27  }
28 
29  internal class LightningNode
30  {
32  private List<LightningNode> childNodes;
33  public List<LightningNode> ChildNodes { get { return childNodes; } }
34 
35  private double splitChance = 0;
36  public double SplitChance { get { return splitChance; } }
37 
38  private Vector position;
39  public Vector Position { get { return position; } set { position = value; } }
40  public LightningNode()
41  {
42  childNodes = new List<LightningNode>();
43  }
44 
46  {
47  this.position = position;
48  childNodes = new List<LightningNode>();
49  }
50 
51  public void AddChild(Vector position)
52  {
54  }
55 
56  public void AddChild(LightningNode node)
57  {
58  node.parentNode = this;
59  this.childNodes.Add(node);
60  }
61  }
62 
63 
64  public class Lightning : ParticleSystem
65  {
67  //public LightningLayer[] Layers { get { return layers; } }
68  //private List<LightningNode> nodes;
69  private int layerAmount = 7;
70 
71  private int currentLayer;
72 
73  //private double height;
74  //private double width;
75 
76  private bool striking = false;
77  private double strikeSpeed = 0.0;
78 
79  //private Color levelColor;
80 
81  private int particlesPerLayer;
82 
83  public Lightning(Image particleImage, int maxAmountOfParticles)
84  : base(particleImage, maxAmountOfParticles)
85  {
87  particlesPerLayer = maxAmountOfParticles / layers.Length;
88  }
89 
90  protected override void InitializeParticle(Particle p, Vector position)
91  {
92  p.Initialize(position, 2.0, 0.0, 0.0, Vector.Zero, Vector.Zero, 0.4);
93  }
94 
95  public override void Update(Time time)
96  {
97  double t = time.SinceLastUpdate.TotalSeconds;
98  strikeSpeed += t;
99  if (striking)
100  {
101  if (strikeSpeed > 0.01)
102  {
103  foreach (LightningNode node in layers[currentLayer].Nodes)
104  {
105  foreach (LightningNode child in node.ChildNodes)
106  {
107  Vector v = child.Position - node.Position;
108  int particlesPerBranch = particlesPerLayer / node.ChildNodes.Count;
109  for (int i = 0; i < particlesPerBranch; i++)
110  {
111  base.AddEffect(node.Position + v*(i/(double)particlesPerBranch), 1);
112  }
113  }
114  //base.AddEffect(node.Position, 1);
115  }
116  currentLayer++;
117  strikeSpeed = 0.0;
118  if (currentLayer >= layers.Length)
119  {
120  striking = false;
121  currentLayer = 0;
122  }
123  }
124  }
125  base.Update(time);
126  }
127 
128  private void InitializeLayers()
129  {
131  for (int i = 0; i < layers.Length; i++)
132  {
133  layers[i] = new LightningLayer();
134  }
135  }
136 
137  public void Strike(Vector startPoint, double width, double height)
138  {
139  double branchHeight = height / layerAmount;
141  LightningNode startNode = new LightningNode(startPoint);
142  layers[0].Add(startNode);
143  layers[0].Y = startNode.Position.Y;
144  //startNode.AddChild(startPoint);
145 
146  for (int i = 1; i < layers.Length - 1; i++)
147  {
148  for (int j = 0; j < layers[i - 1].Nodes.Count; j++)
149  {
150  LightningNode currentNode = layers[i - 1].Nodes[j];
151  layers[i].Y = layers[i - 1].Y - branchHeight;
152  if (RandomGen.NextDouble(0, 100) < layers[i - 1].Nodes[j].SplitChance)
153  {
154  Vector pLeft = new Vector(RandomGen.NextDouble(currentNode.Position.X - width / 6, currentNode.Position.X), layers[i].Y);
155  Vector pRight = new Vector(RandomGen.NextDouble(currentNode.Position.X, currentNode.Position.X + width / 6), layers[i].Y);
156  LightningNode nLeft = new LightningNode(pLeft);
157  LightningNode nRight = new LightningNode(pRight);
158  layers[i].Nodes.Add(nLeft);
159  currentNode.AddChild(nLeft);
160  layers[i].Nodes.Add(nRight);
161  currentNode.AddChild(nRight);
162 
163  }
164  Vector p = new Vector(RandomGen.NextDouble(startPoint.X - width / 4, startPoint.X + width / 4), layers[i].Y);
165  LightningNode n = new LightningNode(p);
166  layers[i].Nodes.Add(n);
167  currentNode.AddChild(n);
168  }
169  }
170  striking = true;
171  }
172  }
173 }
Jypeli.Effects.LightningNode.AddChild
void AddChild(Vector position)
Definition: Lightning.cs:51
Jypeli.Effects.Lightning.strikeSpeed
double strikeSpeed
Definition: Lightning.cs:77
Jypeli.Effects.Lightning.striking
bool striking
Definition: Lightning.cs:76
Jypeli.Effects.LightningLayer.y
double y
Definition: Lightning.cs:15
Jypeli.Effects.LightningNode.childNodes
List< LightningNode > childNodes
Definition: Lightning.cs:32
Jypeli.Effects.LightningNode.LightningNode
LightningNode()
Definition: Lightning.cs:40
Jypeli.Effects.ParticleSystem
Järjestelmä partikkelien käsittelyyn
Definition: ParticleSystem.cs:19
Jypeli.Effects.Particle.Initialize
void Initialize(Vector position, double scale, double rotation, double rotationSpeed, Vector velocity, Vector acceleration, double lifetime)
Alusta partikkeli
Definition: Particle.cs:112
Jypeli.Vector.X
double X
Definition: Vector.cs:312
Jypeli.Vector.Zero
static readonly Vector Zero
Nollavektori.
Definition: Vector.cs:63
Jypeli.Effects.LightningNode.LightningNode
LightningNode(Vector position)
Definition: Lightning.cs:45
Jypeli.Effects.Lightning.currentLayer
int currentLayer
Definition: Lightning.cs:71
Jypeli.Effects.LightningNode.SplitChance
double SplitChance
Definition: Lightning.cs:36
Jypeli.Effects.LightningNode
Definition: Lightning.cs:30
Jypeli.Effects.Lightning.Strike
void Strike(Vector startPoint, double width, double height)
Definition: Lightning.cs:137
Jypeli.Effects.LightningLayer.Nodes
List< LightningNode > Nodes
Definition: Lightning.cs:8
Jypeli.Effects.Lightning
Definition: Lightning.cs:65
Jypeli.Effects.Lightning.layers
LightningLayer[] layers
Definition: Lightning.cs:66
Jypeli.Effects.LightningNode.splitChance
double splitChance
Definition: Lightning.cs:35
Jypeli.Effects.LightningLayer.nodes
List< LightningNode > nodes
Definition: Lightning.cs:13
Jypeli.Effects.LightningNode.ChildNodes
List< LightningNode > ChildNodes
Definition: Lightning.cs:33
Jypeli.Effects.LightningNode.parentNode
LightningNode parentNode
Definition: Lightning.cs:31
Jypeli.Effects.LightningNode.position
Vector position
Definition: Lightning.cs:38
Jypeli.RandomGen
Satunnaisgeneraattori. Luo satunnaisia arvoja, mm. lukuja, vektoreita sekä kulmia.
Definition: RandomGen.cs:39
Jypeli.Effects.LightningNode.Position
Vector Position
Definition: Lightning.cs:39
Jypeli.Time
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
Definition: Time.cs:14
Jypeli.Effects.Lightning.InitializeParticle
override void InitializeParticle(Particle p, Vector position)
Alustaa yhden partikkelin
Definition: Lightning.cs:90
Jypeli.Time.SinceLastUpdate
TimeSpan SinceLastUpdate
Aika joka on kulunut viime päivityksestä.
Definition: Time.cs:24
Jypeli.Effects.Lightning.InitializeLayers
void InitializeLayers()
Definition: Lightning.cs:128
Jypeli.Effects.Particle
Partikkeli
Definition: Particle.cs:9
Jypeli.Effects.LightningLayer.Add
void Add(LightningNode n)
Definition: Lightning.cs:23
Jypeli.Effects.Lightning.layerAmount
int layerAmount
Definition: Lightning.cs:69
Jypeli.RandomGen.NextDouble
static double NextDouble(double min, double max)
Palauttaa satunnaisen liukuluvun parametrien
Definition: RandomGen.cs:70
Jypeli.Image
Kuva.
Definition: Image.cs:29
Jypeli.Effects.Lightning.Update
override void Update(Time time)
Definition: Lightning.cs:95
Jypeli.Effects.Lightning.particlesPerLayer
int particlesPerLayer
Definition: Lightning.cs:81
Jypeli.Vector
2D-vektori.
Definition: Vector.cs:59
System
Definition: CFFauxAttributes.cs:29
Jypeli.Effects
Definition: ExplosionSystem.cs:4
Jypeli.Effects.LightningNode.AddChild
void AddChild(LightningNode node)
Definition: Lightning.cs:56
Jypeli.Effects.Lightning.Lightning
Lightning(Image particleImage, int maxAmountOfParticles)
Definition: Lightning.cs:83
Jypeli.Effects.LightningLayer
Definition: Lightning.cs:6
Jypeli.Effects.LightningLayer.Y
double Y
Definition: Lightning.cs:16
Jypeli.Vector.Y
double Y
Definition: Vector.cs:313
Jypeli.Effects.LightningLayer.LightningLayer
LightningLayer()
Definition: Lightning.cs:18