【问题标题】:particle system in libGdxlibGdx 中的粒子系统
【发布时间】:2012-03-12 02:47:28
【问题描述】:

我想在 libgdx 中创建一个粒子系统。我知道 libgdx 中有粒子类,但我想自己创建它。粒子系统是关于雪的。我写了一门课,只让一场雪从上到下落下,以它向左和向右移动的方式(如此之少)。 这是我的课:

public class Particle implements ApplicationListener{
SpriteBatch batch;
Texture texture;
Random rand = new Random();
float randX = rand.nextFloat() * 480;
float randY = 322;
Pixmap circle;

boolean gravity = true;
Vector2 Vgravity;
Vector2 position;
float snowMovement;
int j = 1;

@Override
public void create() {
    if (randX < 10) {
        randX = 10;
    }else if (randX > 460) {
        randX = 460;
    }

    batch = new SpriteBatch();
    circle = new Pixmap(4, 4, Pixmap.Format.RGB888);
    texture = new Texture(circle);

    circle.setColor(Color.WHITE);
    circle.fillCircle(4/2, 4/2, 4/2);
    texture.draw(circle, 0, 0);
    texture.bind();

    position = new Vector2(randX, randY);

    //setGravity(gravity, new Vector2(0, -20));
}

public void setGravity(boolean gravity, Vector2 Vgravity){
    this.Vgravity = Vgravity;
    snowMovement = 60;
}

@Override
public void dispose() {
    /*
    texture.dispose();
    circle.dispose();
    batch.dispose();
    */
}

@Override
public void pause() {
    // TODO Auto-generated method stub

}

@Override
public void render() {
    float deltaTime = Gdx.graphics.getDeltaTime();

    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    batch.begin();
    batch.draw(texture, position.x, position.y);
    batch.end();

    if (gravity) {
        position.y += Vgravity.y * deltaTime;
        position.x += snowMovement * j * deltaTime;
        j *= -1;
    }
}

@Override
public void resize(int arg0, int arg1) {
    // TODO Auto-generated method stub

}

@Override
public void resume() {
    // TODO Auto-generated method stub

}
}

现在,我想创建一个类来调用“粒子”类,例如 100 次。但是……我不知道我该给谁打电话。我使用这段代码,但是当我运行它时,它只显示一场雪。换句话说,第二个粒子未读。

public class Emitter extends Particle{
Particle part = new Particle();
Particle part2 = new Particle();
Array<Particle> particle = new Array<Particle>();
public void create(){
    part.create();
    part.setGravity(true, new Vector2(0, -20));
    part2.create();
    part2.setGravity(true, new Vector2(0, -20));
    particle.add(part);
    particle.add(part2);
}
public void render(){
    for (int i = 0; i < particle.size; i++) {
        Particle num = particle.get(i);
        num.render();

    }
}
}

“这个类只是举例……”

我不知道我必须在哪里调用它,或者我的“粒子”类有问题,或者...
请帮忙。

【问题讨论】:

    标签: android libgdx particle-system


    【解决方案1】:

    哦,抱歉,代码通常有问题。

    public class Particle implements ApplicationListener { ... }
    

    这是您的主要游戏类,而不是粒子。因此,将所有关于粒子和发射器的逻辑从这个类中移除。在这个类中,您创建了一个 Emitter 对象,该对象又将创建许多 Particle 对象。

    给你一个大纲:

    public class MyGame implements ApplicationListener { 
       // In here you create an Emitter object and call it's update and 
       // render logic (within the render() method).
     }
    public class Emitter { 
       // In here you define the particles that this emitter contains, ...
    }
    public class Particle { 
       // In here you define the particle itself, it's movement logic, if you want 
       // render logic, ...
    }
    

    您在代码中所做的是扩展主应用程序类 (ApplicationListener),然后尝试将其实例化 2 次,但当然您一次只能显示一个应用程序。

    【讨论】:

    • tnx 为那一点。但它仍然显示一场雪。这次我用这个方法。粒子类仍然像旧的一样,在发射器中我定义了 2 个函数,create() 和 render()。在创建中定义 2 个粒子对象并在 render() 中调用它们的渲染。在主类中,只需定义一个发射器并渲染它。但它不起作用。
    • 从结构上听起来不错,有些地方我可以想到为什么它不起作用:它们在完全相同的位置(确保粒子位置在粒子类中定义,然后在那里更新)或您没有遍历所有粒子。
    猜你喜欢
    • 2012-03-23
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多