55 lines
1.8 KiB
Java
55 lines
1.8 KiB
Java
package uno.mloluyu.characters.effects;
|
|
|
|
import com.badlogic.gdx.graphics.Color;
|
|
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
|
|
import com.badlogic.gdx.math.MathUtils;
|
|
|
|
/** 单个命中粒子:简单方块/短线喷射,带速度、重力与淡出。 */
|
|
public class HitParticle {
|
|
private float x, y;
|
|
private float vx, vy;
|
|
private float life; // 剩余寿命
|
|
private final float totalLife;
|
|
private final float size;
|
|
private final Color color = new Color();
|
|
private static final float GRAVITY = 900f; // 轻微下坠
|
|
|
|
public HitParticle(float x, float y, Color base, float speedMin, float speedMax, float lifeMin, float lifeMax,
|
|
float sizeMin, float sizeMax) {
|
|
this.x = x;
|
|
this.y = y;
|
|
float ang = MathUtils.random(15f, 165f) * MathUtils.degreesToRadians; // 向上扇形
|
|
float spd = MathUtils.random(speedMin, speedMax);
|
|
this.vx = MathUtils.cos(ang) * spd;
|
|
this.vy = MathUtils.sin(ang) * spd;
|
|
this.life = MathUtils.random(lifeMin, lifeMax);
|
|
this.totalLife = life;
|
|
this.size = MathUtils.random(sizeMin, sizeMax);
|
|
// 基础色随机稍许扰动
|
|
float tint = MathUtils.random(0.85f, 1.05f);
|
|
this.color.set(base.r * tint, base.g * tint, base.b * tint, 1f);
|
|
}
|
|
|
|
public boolean isAlive() {
|
|
return life > 0f;
|
|
}
|
|
|
|
public void update(float dt) {
|
|
if (!isAlive())
|
|
return;
|
|
life -= dt;
|
|
// 运动积分
|
|
x += vx * dt;
|
|
y += vy * dt;
|
|
vy -= GRAVITY * dt * 0.35f; // 轻微重力
|
|
}
|
|
|
|
public void render(ShapeRenderer sr) {
|
|
if (!isAlive())
|
|
return;
|
|
float a = (life / totalLife); // 线性淡出
|
|
sr.setColor(color.r, color.g, color.b, a);
|
|
sr.rect(x - size / 2f, y - size / 2f, size, size);
|
|
}
|
|
}
|