Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
RainSplashParticleSystem.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
5 public class RainSplashParticleSystem : ParticleSystem<RainSplashParticleSystem.Particle> {
6 public class Particle : Game.Particle {
8
9 public float Duration;
10
11 public float TimeToLive;
12
14
15 public float BaseSize1;
16
17 public float BaseSize2;
18
19 public float Gravity;
20
21 public float FadeFactor;
22 }
23
24 public Random m_random = new();
25
26 public bool m_isActive;
27
28 public RainSplashParticleSystem() : base(150) {
29 Texture = ContentManager.Get<Texture2D>("Textures/RainSplashParticle");
31 }
32
33 public void AddSplash(int value, Vector3 position, Color color) {
34 for (int i = 0; i < Particles.Length; i++) {
35 Particle particle = Particles[i];
36 if (!particle.IsActive) {
38 particle.IsActive = true;
39 particle.Position = position;
40 particle.BaseColor = color;
41 if (block is WaterBlock) {
42 particle.Position.Y += 0.05f;
43 particle.BaseSize1 = 0.02f;
44 particle.BaseSize2 = 0.09f;
45 particle.Duration = particle.TimeToLive = m_random.Float(0.3f, 0.5f);
46 particle.Velocity = Vector3.Zero;
47 particle.Gravity = 0f;
48 particle.BillboardingMode = ParticleBillboardingMode.Horizontal;
49 particle.FadeFactor = 1.6f;
50 }
51 else if (block.IsCollidable_(value)) {
52 particle.BaseSize1 = 0.03f;
53 particle.BaseSize2 = 0.08f;
54 particle.Duration = particle.TimeToLive = m_random.Float(0.25f, 0.3f);
55 particle.Velocity = m_random.Float(0.7f, 0.9f) * Vector3.UnitY;
56 particle.Gravity = -10f;
57 particle.BillboardingMode = ParticleBillboardingMode.Camera;
58 particle.FadeFactor = 2.8f;
59 }
60 else if (m_random.Bool(0.33f)) {
61 particle.BaseSize1 = m_random.Float(0.015f, 0.025f);
62 particle.BaseSize2 = particle.BaseSize1;
63 particle.Duration = particle.TimeToLive = m_random.Float(0.25f, 0.3f);
64 particle.Velocity = m_random.Vector3(0f, 1.5f) * new Vector3(1f, 0f, 1f);
65 particle.Gravity = -10f;
66 particle.BillboardingMode = ParticleBillboardingMode.Camera;
67 particle.FadeFactor = 2.8f;
68 }
69 break;
70 }
71 }
72 m_isActive = true;
73 }
74
75 public override bool Simulate(float dt) {
76 if (m_isActive) {
77 dt = Math.Clamp(dt, 0f, 0.1f);
78 float num = MathF.Pow(0.0005f, dt);
79 bool flag = false;
80 for (int i = 0; i < Particles.Length; i++) {
81 Particle particle = Particles[i];
82 if (particle.IsActive) {
83 particle.Position += particle.Velocity * dt;
84 particle.Velocity.Y += particle.Gravity * dt;
85 particle.Velocity *= num;
86 particle.Size = new Vector2(
87 MathUtils.Lerp(particle.BaseSize1, particle.BaseSize2, (particle.Duration - particle.TimeToLive) / particle.Duration)
88 );
89 particle.Color = particle.BaseColor * MathUtils.Saturate(particle.FadeFactor * particle.TimeToLive);
90 particle.TimeToLive -= dt;
91 particle.FlipX = m_random.Bool();
92 particle.FlipY = m_random.Bool();
93 if (particle.TimeToLive <= 0f) {
94 particle.IsActive = false;
95 }
96 else {
97 flag = true;
98 }
99 }
100 }
101 if (!flag) {
102 m_isActive = false;
103 }
104 }
105 return false;
106 }
107 }
108}
Engine.Vector3 Vector3
static float Saturate(float x)
static float Lerp(float x1, float x2, float f)
virtual bool IsCollidable_(int value)
static object Get(Type type, string name)
ParticleSystem(int particlesCount)
void AddSplash(int value, Vector3 position, Color color)
static int ExtractContents(int value)
static readonly Vector3 Zero
static readonly Vector3 UnitY