Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
SmokeTrailParticleSystem.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
5 public class SmokeTrailParticleSystem : ParticleSystem<SmokeTrailParticleSystem.Particle>, ITrailParticleSystem {
6 public class Particle : Game.Particle {
7 public float Time;
8
9 public float Duration;
10
12 }
13
14 public Random m_random = new();
15
16 public float m_toGenerate;
17
19
20 public float m_textureSlotOffset;
21
22 public float m_duration;
23
24 public float m_size;
25
26 public float m_maxDuration;
27
28 public Color m_color;
29
30 public Vector3 Position { get; set; }
31
32 public bool IsStopped { get; set; }
33
34 public SmokeTrailParticleSystem(int particlesCount, float size, float maxDuration, Color color) : base(particlesCount) {
35 m_size = size;
36 m_maxDuration = maxDuration;
37 Texture = ContentManager.Get<Texture2D>("Textures/FireParticle");
39 m_textureSlotMultiplier = m_random.Float(1.1f, 1.9f);
40 m_textureSlotOffset = m_random.Float(0f, 1f) < 0.33f ? 3 : 0;
41 m_color = color;
42 }
43
44 public override bool Simulate(float dt) {
45 m_duration += dt;
47 IsStopped = true;
48 }
49 float num = Math.Clamp(50f / m_size, 10f, 40f);
50 m_toGenerate += num * dt;
51 float num2 = MathF.Pow(0.1f, dt);
52 bool flag = false;
53 for (int i = 0; i < Particles.Length; i++) {
54 Particle particle = Particles[i];
55 if (particle.IsActive) {
56 flag = true;
57 particle.Time += dt;
58 if (particle.Time <= particle.Duration) {
59 particle.Position += particle.Velocity * dt;
60 particle.Velocity *= num2;
61 particle.Velocity.Y += 10f * dt;
62 particle.TextureSlot = (int)MathUtils.Min(
63 9f * particle.Time / particle.Duration * m_textureSlotMultiplier + m_textureSlotOffset,
64 8f
65 );
66 particle.Size = new Vector2(m_size * (0.15f + 0.8f * particle.Time / particle.Duration));
67 }
68 else {
69 particle.IsActive = false;
70 }
71 }
72 else if (!IsStopped
73 && m_toGenerate >= 1f) {
74 particle.IsActive = true;
75 Vector3 v = new(m_random.Float(-1f, 1f), m_random.Float(-1f, 1f), m_random.Float(-1f, 1f));
76 particle.Position = Position + 0.025f * v;
77 particle.Color = m_color;
78 particle.Velocity = 0.2f * v;
79 particle.Time = 0f;
80 particle.Size = new Vector2(0.15f * m_size);
81 particle.Duration = Particles.Length / num * m_random.Float(0.8f, 1.05f);
82 particle.FlipX = m_random.Bool();
83 particle.FlipY = m_random.Bool();
84 m_toGenerate -= 1f;
85 }
86 }
87 if (IsStopped) {
88 return !flag;
89 }
90 return false;
91 }
92 }
93}
static int Min(int x1, int x2)
static object Get(Type type, string name)
ParticleSystem(int particlesCount)
SmokeTrailParticleSystem(int particlesCount, float size, float maxDuration, Color color)