在随机位置产生随机不同的物体

时间:2015-01-06 19:28:46

标签: libgdx

我正在制作一个游戏,其中有不同的物体从屏幕的上半部分落到屏幕的下半部分。我有问题如何选择随机生成什么TextureRegion而不是更改已经生成的TextureRegions。当我运行游戏时,可以说电子区域首先产生,然后当下一个产生时,让我们说它是反质子区域,第一个电子区域变为我不想要的antiprotonRegion。

这是我的游戏课程:

public class GameScreenTest implements Screen {
...

@Override
public void render(float delta) {
    camera.update();

    game.batch.setProjectionMatrix(camera.combined);
    game.batch.begin();
    game.batch.disableBlending();
    game.batch.draw(background, 0, 0);
    game.batch.enableBlending();
    for(Particles particle: particles) {
        particlesControl.draw(particle.x, particle.y);
    }
    game.batch.end();

    if(TimeUtils.millis() - lastDropTime > 500) {
        particlesControl.spawn();
        particlesControl.update();
    }

    Iterator<Particles> iter = particles.iterator();
    while(iter.hasNext()) {
        Particles particle = iter.next();
        particle.y -= 200 * Gdx.graphics.getDeltaTime();
        if(particle.y + particle.height < 0) {
            iter.remove();
        }
    }
}

...

private class Particles {

    private int width;
    private int height;
    private int x;
    private int y;

    private Particles() {
    }

    private void spawn() {
        Particles particle = new Particles();
        particle.x = MathUtils.random(0, 480 - width);
        particle.y = 800;
        particle.width = width;
        particle.height = height;
        particles.add(particle);
        lastDropTime = TimeUtils.millis();
    }

    private void update() {
        choice = MathUtils.random(1, 4);
        switch(choice) {
            case 1:
                chosen = new TextureRegion(protonRegion);
                width = 75;
                height = 75;
                break;
            case 2:
                chosen = new TextureRegion(electronRegion);
                width = 75 / 2;
                height = 75 / 2;
                break;
            case 3:
                chosen = new TextureRegion(antiprotonRegion);
                width = 75;
                height = 75;
                break;
            case 4:
                chosen = new TextureRegion(antielectronRegion);
                width = 75 / 2;
                height = 75 / 2;
                break;
        }
    }
    private void draw(int x, int y) {
        game.batch.draw(chosen, x, y, width, height);
    }
}

我想知道为什么每次随机选择时所有衍生对象都会改变,当然,如何解决这个问题。谢谢。

2 个答案:

答案 0 :(得分:2)

托盘:

public class GameScreenTest implements Screen {

    final AntimatterBlast game;

    private Texture gameObjects;

    private TextureRegion electronRegion;
    private TextureRegion antielectronRegion;
    private TextureRegion protonRegion;
    private TextureRegion antiprotonRegion;

//===========================================//
//remove private TextureRegion chosen;
//===========================================//

    private TextureRegion background;

    private Music gameMusic;

    private OrthographicCamera camera;

    private Array<Particles> particles;

    private Particles particlesControl;

    private long lastDropTime;

    private int choice;

    public GameScreenTest(final AntimatterBlast game) {
    this.game = game;

    gameObjects = new Texture(Gdx.files.internal("GameObjects.png"));

    electronRegion = new TextureRegion(gameObjects, 105, 103, 50, 50);

    antielectronRegion = new TextureRegion(gameObjects, 105, 155, 46, 46);

    protonRegion = new TextureRegion(gameObjects, 6, 6, 100, 100);

    antiprotonRegion = new TextureRegion(gameObjects, 6, 108, 90, 90);

    background = new TextureRegion(gameObjects, 0, 204, 480, 800);

    gameMusic = Gdx.audio.newMusic(Gdx.files.internal("DST-ElektroHauz.mp3"));

    gameMusic.setLooping(true);

    camera = new OrthographicCamera();

    camera.setToOrtho(false, 480, 800);

    particles = new Array<Particles>();

    particlesControl = new Particles();

//===========================================//
//choice = MathUtils.random(1, 4);           //remove
//chosen = new TextureRegion(protonRegion);  //remove
//===========================================//

}

@Override
public void render(float delta) {
    camera.update();

    game.batch.setProjectionMatrix(camera.combined);
    game.batch.begin();
    game.batch.disableBlending();
    game.batch.draw(background, 0, 0);
    game.batch.enableBlending();

    for(Particles particle: particles) {
    //===========================================//
    particlesControl.draw(particle.chosen, particle.x, particle.y);
    //change
    //particlesControl.draw(particle.x, particle.y);
    //===========================================//
    }

    game.batch.end();

    if(TimeUtils.millis() - lastDropTime > 500) {

    //===========================================//
    particlesControl.spawn();
    //===========================================//

    //===========================================//
    //remove particlesControl.update();
    //===========================================//
    }

        Iterator<Particles> iter = particles.iterator();
        while(iter.hasNext()) {
            Particles particle = iter.next();
            particle.y -= 200 * Gdx.graphics.getDeltaTime();
            if(particle.y + particle.height < 0) {
                iter.remove();
            }
        }


    }

    @Override
    public void resize(int width, int height) {
    }

    @Override
    public void show() {
        gameMusic.play();
        particlesControl.spawn();
    }

    @Override
    public void hide() {
    }

    @Override
    public void pause() {
    }

    @Override
    public void resume() {
    }

    @Override
    public void dispose() {
        gameObjects.dispose();
        gameMusic.dispose();
    }


    private class Particles {

        //===========================================//
        private TextureRegion chosen; //add variable
        //===========================================//

        private int width;
        private int height;
        private int x;
        private int y;

        private Particles() {

        }

        private void spawn() {

            Particles particle = new Particles();
            particle.x = MathUtils.random(0, 480 - width);
            particle.y = 800;
            particle.width = width;
            particle.height = height;

            //===========================================//
            particle.selectTexture();
            //===========================================//

            lastDropTime = TimeUtils.millis();

            //===========================================//
            selectTexture(); //add call
            //===========================================//

            particles.add(particle);
        }

        //===========================================//
        private void selectTexture() { //change name, but is not nesesari
        //===========================================//
            choice = MathUtils.random(1, 4);
            switch(choice) {
                case 1:
                   //===========================================//
                   //change
                   //chosen = new TextureRegion(antielectronRegion);
                   //if you are not going to change or modific TextureRegion 
                   //independet other the textureRegion, 
                   //I think you could use it well.It is just an idea
                   chosen = protonRegion;
                   //===========================================//

                    width = 75;
                    height = 75;
                    break;
                case 2:
                   //===========================================//
                   //change
                   //chosen = new TextureRegion(antielectronRegion);
                   //if you are not going to change or modific TextureRegion 
                   //independet other the textureRegion, 
                   //I think you could use it well.It is just an idea
                   chosen = electronRegion;
                   //===========================================//

                    width = 75 / 2;
                    height = 75 / 2;
                    break;
                case 3:
                   //===========================================//
                   //change
                   //chosen = new TextureRegion(antielectronRegion);
                   //if you are not going to change or modific TextureRegion 
                   //independet other the textureRegion, 
                   //I think you could use it well.It is just an idea
                   chosen = antiprotonRegion;
                   //===========================================//

                    width = 75;
                    height = 75;
                    break;
                case 4:
                   //===========================================//
                   //change
                   //chosen = new TextureRegion(antielectronRegion);
                   //if you are not going to change or modific TextureRegion 
                   //independet other the textureRegion, 
                   //I think you could use it well.It is just an idea
                   chosen = antielectronRegion;
                   //===========================================//

                    width = 75 / 2;
                    height = 75 / 2;
                    break;
            }
        }
        //===========================================//
        private void draw(TextureRegion chosen, int x, int y) {
            game.batch.draw(chosen, x, y, width, height);
        //===========================================//
        }
    }
}

答案 1 :(得分:1)

就像我在之前的评论中所说的那样,纹理(选择)在GameScreenTest中,你在内部类中使用它,所以粒子类的每一个实例将共享相同的纹理。


不会导致错误,但它可能会帮助您整理代码并使其更具可读性,并且无论如何您没有义务让它们只是将它们作为建议:

命名惯例
命名类Particles使得它看起来像表示多于1个粒子,但实际上它代表单个粒子可能只将它命名为粒子。

分离游戏逻辑
使粒子类仅处理其自身的问题,并且使用它来生成其他粒子并将其添加到外部类。

使用构造函数,因为它已经存在
为粒子提供它应该使用的纹理,也许是坐标。

绘制“死”粒子
你正在先画画,然后根据你的游戏提问,这可能会让你觉得很奇怪,因为你总是会画一个框架而不再存在。

对此不太确定
但是,您可以重复使用纹理区域,而不是为每个单个粒子创建相同纹理的新纹理区域