Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
ScreenSpaceFireRenderer.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
6 public class Particle {
7 public bool Active;
8
10
11 public Vector2 Size;
12
13 public float Speed;
14
15 public int TextureSlot;
16
17 public bool FlipX;
18
19 public bool FlipY;
20
21 public float AnimationTime;
22
23 public float TimeToLive;
24 }
25
26 public List<Particle> m_particles = [];
27
28 public Random m_random = new();
29
30 public float m_toGenerate;
31
33
34 public float ParticlesPerSecond { get; set; }
35
36 public float ParticleSpeed { get; set; }
37
38 public float MinTimeToLive { get; set; }
39
40 public float MaxTimeToLive { get; set; }
41
42 public float ParticleSize { get; set; }
43
44 public float ParticleAnimationPeriod { get; set; }
45
46 public float ParticleAnimationOffset { get; set; }
47
48 public Vector2 Origin { get; set; }
49
50 public float Width { get; set; }
51
52 public float CutoffPosition { get; set; }
53
54 public ScreenSpaceFireRenderer(int particlesCount) {
55 m_texture = ContentManager.Get<Texture2D>("Textures/FireParticle");
56 for (int i = 0; i < particlesCount; i++) {
57 m_particles.Add(new Particle());
58 }
59 }
60
61 public virtual void Update(float dt) {
63 foreach (Particle particle in m_particles) {
64 if (particle.Active) {
65 particle.Position.Y += particle.Speed * dt;
66 particle.AnimationTime += dt;
67 particle.TimeToLive -= dt;
68 particle.TextureSlot = (int)MathUtils.Max(9f * particle.AnimationTime / ParticleAnimationPeriod, 0f);
69 if (particle.TimeToLive <= 0f
70 || particle.TextureSlot > 8
71 || particle.Position.Y < CutoffPosition) {
72 particle.Active = false;
73 }
74 }
75 else if (m_toGenerate >= 1f) {
76 particle.Active = true;
77 particle.Position = new Vector2(m_random.Float(Origin.X, Origin.X + Width), Origin.Y);
78 particle.Size = new Vector2(ParticleSize);
79 particle.Speed = (0f - m_random.Float(0.75f, 1.25f)) * ParticleSpeed;
80 particle.AnimationTime = m_random.Float(0f, ParticleAnimationOffset);
81 particle.TimeToLive = MathUtils.Lerp(MinTimeToLive, MaxTimeToLive, m_random.Float(0f, 1f));
82 particle.FlipX = m_random.Int(0, 1) == 0;
83 particle.FlipY = m_random.Int(0, 1) == 0;
84 m_toGenerate -= 1f;
85 }
86 }
88 }
89
90 public virtual void Draw(PrimitivesRenderer2D primitivesRenderer, float depth, Matrix matrix, Color color) {
91 TexturedBatch2D texturedBatch2D = primitivesRenderer.TexturedBatch(
93 false,
94 0,
96 null,
97 null,
99 );
100 int count = texturedBatch2D.TriangleVertices.Count;
101 foreach (Particle particle in m_particles) {
102 if (particle.Active) {
103 DrawParticle(texturedBatch2D, particle, depth, color);
104 }
105 }
106 texturedBatch2D.TransformTriangles(matrix, count);
107 }
108
109 public virtual void DrawParticle(TexturedBatch2D batch, Particle particle, float depth, Color color) {
110 Vector2 corner = particle.Position - particle.Size / 2f;
111 Vector2 corner2 = particle.Position + particle.Size / 2f;
112 int textureSlot = particle.TextureSlot;
113 Vector2 v = new(textureSlot % 3, textureSlot / 3);
114 float num = 0f;
115 float num2 = 1f;
116 float num3 = 0f;
117 float num4 = 1f;
118 if (particle.FlipX) {
119 num = 1f - num;
120 num2 = 1f - num2;
121 }
122 if (particle.FlipY) {
123 num3 = 1f - num3;
124 num4 = 1f - num4;
125 }
126 Vector2 texCoord = (v + new Vector2(num, num3)) * 0.333333343f;
127 Vector2 texCoord2 = (v + new Vector2(num2, num4)) * 0.333333343f;
128 batch.QueueQuad(corner, corner2, depth, texCoord, texCoord2, color);
129 }
130 }
131}
readonly DynamicArray< VertexPositionColorTexture > TriangleVertices
static readonly DepthStencilState None
TexturedBatch2D TexturedBatch(Texture2D texture, bool useAlphaTest=false, int layer=0, DepthStencilState depthStencilState=null, RasterizerState rasterizerState=null, BlendState blendState=null, SamplerState samplerState=null)
void QueueQuad(Vector2 corner1, Vector2 corner2, float depth, Vector2 texCoord1, Vector2 texCoord2, Color color)
static float Remainder(float x, float y)
static int Max(int x1, int x2)
static float Lerp(float x1, float x2, float f)
static object Get(Type type, string name)
virtual void DrawParticle(TexturedBatch2D batch, Particle particle, float depth, Color color)
virtual void Draw(PrimitivesRenderer2D primitivesRenderer, float depth, Matrix matrix, Color color)