0

libgdx でパーティクル システムを作成したいと考えています。libgdx にパーティクル クラスがあることは知っていますが、自分で作成したいと考えています。パーティクル システムは雪に関するものです。雪が 1 つだけ上から地面に落ち、左右に移動するクラスを作成します (ごくわずかです)。これは私のクラスです:

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

}
}

ここで、「Particle」クラス、たとえば 100 回を呼び出すクラスを作成します。でも…誰と呼べばいいのかわからない。私はこのコードを使用していますが、実行すると雪が 1 つしか表示されません。つまり、2番目の粒子は読み取れません。

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();

    }
}
}

「このクラスはほんの一例です...」

どこでそれを呼び出さなければならないのか、「Particle」クラスの問題があるのか​​ 、それとも...
助けてください。

4

1 に答える 1

0

うーん、申し訳ありませんが、コードに一般的な問題があります。

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 回インスタンス化しようとすることでしたが、もちろん、一度に表示できるアプリケーションは 1 つだけです。

于 2012-03-05T15:17:51.527 に答える