Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
GunSmokeParticleSystem.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
5 public class GunSmokeParticleSystem : ParticleSystem<GunSmokeParticleSystem.Particle> {
6 public class Particle : Game.Particle {
8
9 public float Time;
10
11 public float Duration;
12 }
13
14 public Random m_random = new();
15
16 public float m_time;
17
18 public float m_toGenerate;
19
21
23
24 public Color m_color;
25
26 public GunSmokeParticleSystem(SubsystemTerrain terrain, Vector3 position, Vector3 direction) : base(50) {
27 Texture = ContentManager.Get<Texture2D>("Textures/GunSmokeParticle");
29 m_position = position;
30 m_direction = Vector3.Normalize(direction);
31 int num = Terrain.ToCell(position.X);
32 int num2 = Terrain.ToCell(position.Y);
33 int num3 = Terrain.ToCell(position.Z);
34 int x = 0;
35 x = MathUtils.Max(x, terrain.Terrain.GetCellLight(num + 1, num2, num3));
36 x = MathUtils.Max(x, terrain.Terrain.GetCellLight(num - 1, num2, num3));
37 x = MathUtils.Max(x, terrain.Terrain.GetCellLight(num, num2 + 1, num3));
38 x = MathUtils.Max(x, terrain.Terrain.GetCellLight(num, num2 - 1, num3));
39 x = MathUtils.Max(x, terrain.Terrain.GetCellLight(num, num2, num3 + 1));
40 x = MathUtils.Max(x, terrain.Terrain.GetCellLight(num, num2, num3 - 1));
42 m_color = new Color(num4, num4, num4);
43 }
44
45 public override bool Simulate(float dt) {
46 m_time += dt;
47 float num = MathUtils.Lerp(150f, 20f, MathUtils.Saturate(2f * m_time / 0.5f));
48 float num2 = MathF.Pow(0.01f, dt);
49 float s = MathUtils.Lerp(20f, 0f, MathUtils.Saturate(2f * m_time / 0.5f));
50 Vector3 v = new(2f, 2f, 1f);
51 if (m_time < 0.5f) {
52 m_toGenerate += num * dt;
53 }
54 else {
55 m_toGenerate = 0f;
56 }
57 bool flag = false;
58 for (int i = 0; i < Particles.Length; i++) {
59 Particle particle = Particles[i];
60 if (particle.IsActive) {
61 flag = true;
62 particle.Time += dt;
63 if (particle.Time <= particle.Duration) {
64 particle.Position += particle.Velocity * dt;
65 particle.Velocity *= num2;
66 particle.Velocity += v * dt;
67 particle.TextureSlot = (int)MathUtils.Min(9f * particle.Time / particle.Duration, 8f);
68 particle.Size = new Vector2(0.3f);
69 }
70 else {
71 particle.IsActive = false;
72 }
73 }
74 else if (m_toGenerate >= 1f) {
75 particle.IsActive = true;
76 Vector3 v2 = m_random.Vector3(0f, 1f);
77 particle.Position = m_position + 0.3f * v2;
78 particle.Color = m_color;
79 particle.Velocity = s * (m_direction + m_random.Vector3(0f, 0.1f)) + 2.5f * v2;
80 particle.Size = Vector2.Zero;
81 particle.Time = 0f;
82 particle.Duration = m_random.Float(0.5f, 2f);
83 particle.FlipX = m_random.Bool();
84 particle.FlipY = m_random.Bool();
85 m_toGenerate -= 1f;
86 }
87 }
89 if (!flag
90 && m_time >= 0.5f) {
91 return true;
92 }
93 return false;
94 }
95 }
96}
static float Remainder(float x, float y)
static int Min(int x1, int x2)
static float Saturate(float x)
static int Max(int x1, int x2)
static float Lerp(float x1, float x2, float f)
static object Get(Type type, string name)
GunSmokeParticleSystem(SubsystemTerrain terrain, Vector3 position, Vector3 direction)
static readonly float[] LightIntensityByLightValue
ParticleSystem(int particlesCount)
virtual int GetCellLight(int x, int y, int z)
static int ToCell(float x)
static readonly Vector2 Zero
static Vector3 Normalize(Vector3 v)