#region File Description
//-----------------------------------------------------------------------------
// ParticleSequence.cs
//
// Microsoft XNA Community Game Platform
// Copyright (C) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
#endregion
#region Using Statements
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
using Microsoft.Xna.Framework;
#endregion
namespace RobotGameData.ParticleSystem
{
#region ParticleSequence Information
///
/// contains particle information.
/// It can load an XML file(.Particle).
///
[Serializable]
public class ParticleSequenceInfo
{
public string Name = String.Empty;
public List TimeSequencesInfo = new List();
}
#endregion
#region ParticleSequence
///
/// It includes the information on the particle and a
/// single TimeSequence which it controls
///
public class ParticleSequence : GameSceneNode
{
#region Fields
ParticleSequenceInfo sequenceInfo = null;
string resourcePath = String.Empty;
TimeSequence timeSequence = null;
#endregion
#region Properties
public ParticleSequenceInfo SequenceInfo
{
get { return sequenceInfo; }
}
public string ResourcePath
{
get { return resourcePath; }
}
public TimeSequence TimeSequence
{
get { return timeSequence; }
}
public bool IsPlaying
{
get { return timeSequence.IsActive; }
}
public bool IsInfinite
{
get { return timeSequence.IsInfinite; }
}
#endregion
///
/// Constructor.
///
/// particle sequence information structure
/// resource path
public ParticleSequence(ref ParticleSequenceInfo info, string resourceFolder)
: base()
{
Create(ref info, resourceFolder);
}
///
/// creates instance particle by using the source particle.
///
/// source particle
/// new instance particle
public static ParticleSequence CreateInstance(ref ParticleSequence source)
{
ParticleSequenceInfo info = source.SequenceInfo;
return new ParticleSequence(ref info, source.ResourcePath);
}
///
/// Creates using particle information.
///
/// the particle information
/// the particle file
public void Create(ref ParticleSequenceInfo info, string resourcePath)
{
this.sequenceInfo = info;
this.resourcePath = resourcePath;
// Add TimeSequence to child
timeSequence = new TimeSequence();
AddChild(timeSequence);
for (int i = 0; i < info.TimeSequencesInfo.Count; i++)
{
TimeSequenceInfo timeSequenceInfo = info.TimeSequencesInfo[i];
// Create a TimeSequenceData using TimeSequenceInfo
TimeSequenceData timeSequenceData =
new TimeSequenceData(timeSequenceInfo);
// Create a particle using ParticleInfo and TextureSequence
// in the TimeSequenceInfo
Particle particle = new Particle(resourcePath,
timeSequenceInfo.ParticleInfo,
timeSequenceInfo.TextureSequence);
// Set owner particle to the TimeSequenceData
timeSequenceData.Owner = particle;
// Add the particle to the TimeSequence's child
timeSequence.AddChild(particle);
// Add TimeSequenceData to the TimeSequence
timeSequence.AddSequence(timeSequenceData);
}
Name = info.Name;
// Particle off
Stop();
}
///
/// Updates the particle.
///
protected override void OnUpdate(GameTime gameTime)
{
if (timeSequence.IsActive == false && timeSequence.IsInfinite == false)
Stop();
base.OnUpdate(gameTime);
}
///
/// Reset and play the particle.
///
public void Reset()
{
this.Enabled = true;
this.Visible = true;
TimeSequence.Enabled = true;
TimeSequence.Visible = true;
TimeSequence.Reset();
}
///
/// stops and disables particle.
///
public void Stop()
{
this.Enabled = false;
this.Visible = false;
TimeSequence.Enabled = false;
TimeSequence.Visible = false;
TimeSequence.Stop();
}
///
/// play the particle.
///
public void Play()
{
for (int i = 0; i < timeSequence.Count; i++)
{
TimeSequenceData sequence = timeSequence.GetSequence(i);
Particle particle = sequence.Owner as Particle;
particle.RootAxis = RootAxis;
particle.WorldTransform = WorldTransform;
}
Reset();
}
///
/// changes the transform matrix of particle.
///
/// transform matrix
public void SetTransform(Matrix transform)
{
this.WorldTransform = transform;
for (int i = 0; i < timeSequence.Count; i++)
{
TimeSequenceData sequence = timeSequence.GetSequence(i);
Particle particle = sequence.Owner as Particle;
particle.RootAxis = this.RootAxis;
particle.WorldTransform = this.WorldTransform;
}
}
}
#endregion
}