ParticleSequence.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. #region File Description
  2. //-----------------------------------------------------------------------------
  3. // ParticleSequence.cs
  4. //
  5. // Microsoft XNA Community Game Platform
  6. // Copyright (C) Microsoft Corporation. All rights reserved.
  7. //-----------------------------------------------------------------------------
  8. #endregion
  9. #region Using Statements
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Text;
  13. using System.IO;
  14. using System.Xml;
  15. using System.Xml.Serialization;
  16. using Microsoft.Xna.Framework;
  17. #endregion
  18. namespace RobotGameData.ParticleSystem
  19. {
  20. #region ParticleSequence Information
  21. /// <summary>
  22. /// contains particle information.
  23. /// It can load an XML file(.Particle).
  24. /// </summary>
  25. [Serializable]
  26. public class ParticleSequenceInfo
  27. {
  28. public string Name = String.Empty;
  29. public List<TimeSequenceInfo> TimeSequencesInfo = new List<TimeSequenceInfo>();
  30. }
  31. #endregion
  32. #region ParticleSequence
  33. /// <summary>
  34. /// It includes the information on the particle and a
  35. /// single TimeSequence which it controls
  36. /// </summary>
  37. public class ParticleSequence : GameSceneNode
  38. {
  39. #region Fields
  40. ParticleSequenceInfo sequenceInfo = null;
  41. string resourcePath = String.Empty;
  42. TimeSequence timeSequence = null;
  43. #endregion
  44. #region Properties
  45. public ParticleSequenceInfo SequenceInfo
  46. {
  47. get { return sequenceInfo; }
  48. }
  49. public string ResourcePath
  50. {
  51. get { return resourcePath; }
  52. }
  53. public TimeSequence TimeSequence
  54. {
  55. get { return timeSequence; }
  56. }
  57. public bool IsPlaying
  58. {
  59. get { return timeSequence.IsActive; }
  60. }
  61. public bool IsInfinite
  62. {
  63. get { return timeSequence.IsInfinite; }
  64. }
  65. #endregion
  66. /// <summary>
  67. /// Constructor.
  68. /// </summary>
  69. /// <param name="info">particle sequence information structure</param>
  70. /// <param name="resourceFolder">resource path</param>
  71. public ParticleSequence(ref ParticleSequenceInfo info, string resourceFolder)
  72. : base()
  73. {
  74. Create(ref info, resourceFolder);
  75. }
  76. /// <summary>
  77. /// creates instance particle by using the source particle.
  78. /// </summary>
  79. /// <param name="source">source particle</param>
  80. /// <returns>new instance particle</returns>
  81. public static ParticleSequence CreateInstance(ref ParticleSequence source)
  82. {
  83. ParticleSequenceInfo info = source.SequenceInfo;
  84. return new ParticleSequence(ref info, source.ResourcePath);
  85. }
  86. /// <summary>
  87. /// Creates using particle information.
  88. /// </summary>
  89. /// <param name="info">the particle information</param>
  90. /// <param name="resourcePath">the particle file</param>
  91. public void Create(ref ParticleSequenceInfo info, string resourcePath)
  92. {
  93. this.sequenceInfo = info;
  94. this.resourcePath = resourcePath;
  95. // Add TimeSequence to child
  96. timeSequence = new TimeSequence();
  97. AddChild(timeSequence);
  98. for (int i = 0; i < info.TimeSequencesInfo.Count; i++)
  99. {
  100. TimeSequenceInfo timeSequenceInfo = info.TimeSequencesInfo[i];
  101. // Create a TimeSequenceData using TimeSequenceInfo
  102. TimeSequenceData timeSequenceData =
  103. new TimeSequenceData(timeSequenceInfo);
  104. // Create a particle using ParticleInfo and TextureSequence
  105. // in the TimeSequenceInfo
  106. Particle particle = new Particle(resourcePath,
  107. timeSequenceInfo.ParticleInfo,
  108. timeSequenceInfo.TextureSequence);
  109. // Set owner particle to the TimeSequenceData
  110. timeSequenceData.Owner = particle;
  111. // Add the particle to the TimeSequence's child
  112. timeSequence.AddChild(particle);
  113. // Add TimeSequenceData to the TimeSequence
  114. timeSequence.AddSequence(timeSequenceData);
  115. }
  116. Name = info.Name;
  117. // Particle off
  118. Stop();
  119. }
  120. /// <summary>
  121. /// Updates the particle.
  122. /// </summary>
  123. protected override void OnUpdate(GameTime gameTime)
  124. {
  125. if (timeSequence.IsActive == false && timeSequence.IsInfinite == false)
  126. Stop();
  127. base.OnUpdate(gameTime);
  128. }
  129. /// <summary>
  130. /// Reset and play the particle.
  131. /// </summary>
  132. public void Reset()
  133. {
  134. this.Enabled = true;
  135. this.Visible = true;
  136. TimeSequence.Enabled = true;
  137. TimeSequence.Visible = true;
  138. TimeSequence.Reset();
  139. }
  140. /// <summary>
  141. /// stops and disables particle.
  142. /// </summary>
  143. public void Stop()
  144. {
  145. this.Enabled = false;
  146. this.Visible = false;
  147. TimeSequence.Enabled = false;
  148. TimeSequence.Visible = false;
  149. TimeSequence.Stop();
  150. }
  151. /// <summary>
  152. /// play the particle.
  153. /// </summary>
  154. public void Play()
  155. {
  156. for (int i = 0; i < timeSequence.Count; i++)
  157. {
  158. TimeSequenceData sequence = timeSequence.GetSequence(i);
  159. Particle particle = sequence.Owner as Particle;
  160. particle.RootAxis = RootAxis;
  161. particle.WorldTransform = WorldTransform;
  162. }
  163. Reset();
  164. }
  165. /// <summary>
  166. /// changes the transform matrix of particle.
  167. /// </summary>
  168. /// <param name="transform">transform matrix</param>
  169. public void SetTransform(Matrix transform)
  170. {
  171. this.WorldTransform = transform;
  172. for (int i = 0; i < timeSequence.Count; i++)
  173. {
  174. TimeSequenceData sequence = timeSequence.GetSequence(i);
  175. Particle particle = sequence.Owner as Particle;
  176. particle.RootAxis = this.RootAxis;
  177. particle.WorldTransform = this.WorldTransform;
  178. }
  179. }
  180. }
  181. #endregion
  182. }