我如何在 libgdx.. 中对精灵使用爆炸效果?
How could i use explode effect with a sprite in libgdx..?
我正在尝试在 libgdx 中开发一款游戏,其中我希望在单击它时使用 sprite 的爆炸效果。是否可能,或者我应该使用 BOX2D 物理来应用爆炸效果。?
您应该使用为您处理动画的 API,或者如果您想使用粒子,您必须使用为您提供发射器的 API。
我正在自己制作爆炸效果。对于每个粒子对象,我都有保存 X 和 Y 坐标的变量,在 VX 和 VY 中,我保存粒子速度。
当爆炸发生时,我正在创建一些这样的对象(我将它们存储在一个列表中)。对于这些粒子中的每一个,我都将 X 和 Y 坐标设置为其自身的爆炸坐标。所以他们都从同一点开始。但是我为每个粒子设置了不同的随机 VX 和 VY(初始速度)。所以他们会开始向不同的方向移动。
我还实现了一些重力效果 - 在每一帧中,我都将 VY 降低某个常数(乘以该增量时间 - 自上一帧渲染以来的时间,以获得持续移动)。
最后你应该以某种方式检查何时删除粒子对象。 IE。当它的坐标超出屏幕或一段时间后...
为了让它更漂亮,您可以为粒子设置动画...使用透明度...
实现您想要的效果的一种简单方法是使用粒子
我猜你的游戏是 2d 所以 here 是关于 2d 粒子的官方 wiki
正如 MilanG 所说,最简单的方法是创建一个粒子 class
public class Particle{
public float x;
public float y;
public float vx;
public float vy;
public Particle(float x, float y, float vx, float vy){...}
}
然后当用户单击纹理时,您将实例化大量这些粒子并将它们添加到 ArrayList。 X 和 Y 坐标应该是纹理的中心。 vx 可以是随机数(负数和正数)。 vy 也可以是随机数,具体取决于粒子的视觉效果。稍微试验一下这些值
for(int i = 0; i < 100; i++){
arrayList.add(new Particle(textureX,
textureY,
MathUtils.randomFloat(-200, 200),
MathUtils.randomFloat(0, 200)));
}
在更新循环中,您将根据 vx 和 vy 值更改 x 和 y 坐标。由于重力原因,应降低 vy 值:
for(Particle p : arrayList){
p.x += p.vx * delta;
p.y += p.vy * delta;
p.vy += -200 * delta; // -200 is gravity value
}
在渲染代码中,为数组列表中的每个元素绘制粒子纹理:
for(Particle p : arrayList){
batch.draw(particleTexture, p.x, p.y);
}
重要:
您还需要实现一些逻辑以从 arrayList 中删除粒子(例如检查 x 和 y 坐标边界以及 CopyOnWriteArrayList 或第二个 deleteParticles ArrayList)
同样重要:
另一点要提到的是,这种技术会生成大量对象,从而导致严重的 GC。您可以使用 Pooling 技术来减少它。 LibGDX 有一些非常不错的 class。
我正在尝试在 libgdx 中开发一款游戏,其中我希望在单击它时使用 sprite 的爆炸效果。是否可能,或者我应该使用 BOX2D 物理来应用爆炸效果。?
您应该使用为您处理动画的 API,或者如果您想使用粒子,您必须使用为您提供发射器的 API。
我正在自己制作爆炸效果。对于每个粒子对象,我都有保存 X 和 Y 坐标的变量,在 VX 和 VY 中,我保存粒子速度。
当爆炸发生时,我正在创建一些这样的对象(我将它们存储在一个列表中)。对于这些粒子中的每一个,我都将 X 和 Y 坐标设置为其自身的爆炸坐标。所以他们都从同一点开始。但是我为每个粒子设置了不同的随机 VX 和 VY(初始速度)。所以他们会开始向不同的方向移动。
我还实现了一些重力效果 - 在每一帧中,我都将 VY 降低某个常数(乘以该增量时间 - 自上一帧渲染以来的时间,以获得持续移动)。
最后你应该以某种方式检查何时删除粒子对象。 IE。当它的坐标超出屏幕或一段时间后...
为了让它更漂亮,您可以为粒子设置动画...使用透明度...
实现您想要的效果的一种简单方法是使用粒子
我猜你的游戏是 2d 所以 here 是关于 2d 粒子的官方 wiki
正如 MilanG 所说,最简单的方法是创建一个粒子 class
public class Particle{
public float x;
public float y;
public float vx;
public float vy;
public Particle(float x, float y, float vx, float vy){...}
}
然后当用户单击纹理时,您将实例化大量这些粒子并将它们添加到 ArrayList。 X 和 Y 坐标应该是纹理的中心。 vx 可以是随机数(负数和正数)。 vy 也可以是随机数,具体取决于粒子的视觉效果。稍微试验一下这些值
for(int i = 0; i < 100; i++){
arrayList.add(new Particle(textureX,
textureY,
MathUtils.randomFloat(-200, 200),
MathUtils.randomFloat(0, 200)));
}
在更新循环中,您将根据 vx 和 vy 值更改 x 和 y 坐标。由于重力原因,应降低 vy 值:
for(Particle p : arrayList){
p.x += p.vx * delta;
p.y += p.vy * delta;
p.vy += -200 * delta; // -200 is gravity value
}
在渲染代码中,为数组列表中的每个元素绘制粒子纹理:
for(Particle p : arrayList){
batch.draw(particleTexture, p.x, p.y);
}
重要: 您还需要实现一些逻辑以从 arrayList 中删除粒子(例如检查 x 和 y 坐标边界以及 CopyOnWriteArrayList 或第二个 deleteParticles ArrayList)
同样重要: 另一点要提到的是,这种技术会生成大量对象,从而导致严重的 GC。您可以使用 Pooling 技术来减少它。 LibGDX 有一些非常不错的 class。