2012-03-05 5 views
0

libgdx에서 입자 시스템을 만들고 싶습니다. libgdx에 입자 클래스가 있다는 것을 알고 있지만 직접 작성하려고합니다. 입자 시스템은 눈에 관한 것입니다. 나는 하나의 눈을위한 수업을 왼쪽에서 오른쪽으로 움직이는 방식으로 위에서 아래로 떨어 뜨린다. 예를 들어 100 시간,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 

} 
} 

지금, 나는 "입자"클래스 호출하는 클래스를 만들려면 : 이 내 클래스입니다. 하지만 ... 내가 누구라고 불러야할지 모르겠다. 이 코드를 사용하지만 실행하면 눈이 한 개만 표시됩니다. 다른 말로 두 번째 입자는 읽히지 않습니다.

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

    } 
} 
} 

는 내가 전화를 걸거나 내 "입자"클래스 문제 또는를 가지고 있어야합니다 경우

내가 ...
PLZ 도움을 모른다 "이 클래스는 그냥 ... 예를 들면이다".

답변

0

어, 미안하지만 코드에는 일반적으로 잘못된 것이 있습니다.

public class Particle implements ApplicationListener { ... } 

이것은 게임이 아닌 게임의 기본 클래스입니다. 따라서 Particles와 Emitter에 대한 모든 논리를이 클래스에서 제거하십시오. 이 클래스 내에서 Emitter 객체를 생성하면 많은 입자 객체가 생성됩니다.

당신에게 개요를 제공합니다 :

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, ... 
} 

이 2 번 인스턴스화하려고 다음 기본 응용 프로그램 클래스 (만약 ApplicationListener)를 확장되었다 코드에서했지만, 물론 당신은 하나의 응용 프로그램을 표시 할 수있는 작업 한 번에.

+0

해당 지점에 대한 tnx. 그러나 그 눈은 아직도 한 눈을 보여줍니다. 이번에는이 방법을 사용합니다. 입자 클래스는 여전히 오래된 것과 같습니다. 에미 터에서는 2 개의 함수 create()와 render()를 정의합니다. create에서는 2 개의 particle object를 정의하고 render()에서 그것들의 render render를 호출합니다. 메인 클래스에서는 이미 터를 정의하고 렌더링합니다. 그러나 그것은 작동하지 않습니다. – Hosein

+0

구조상 좋게 들립니다. 왜 작동하지 않는지 생각할 수있는 몇 가지 점 : 정확히 같은 지점에 있습니다 (입자 위치가 입자 클래스에 정의되어 있는지 확인하고 거기에서 업데이트하십시오). 또는 모두를 반복하지 않습니다. 당신의 입자. – dom