为什么我的随机数组不在每个渲染器上绘制随机纹理?我必须改变什么?

why is my random array not drawing a random texture on each render? what do I have to change?

开始之前我想声明我正在学习,我是全新的。在这里,我添加了尽可能多的细节。

所以,我有一组不同颜色的纹理,并设置一个 Random 来随机化纹理,像这样:

Texture[] bubbles;

Random random = new Random(); 
int lowRange = 0;
int highRange = 3;
int result = random.nextInt(highRange -lowRange) + 1; //my random

ArrayList<Integer> BubbleXs = new ArrayList<>();
ArrayList<Integer> BubbleYs = new ArrayList<>();

@Override 
public void create () {
bubbles = new Texture[4];
bubbles[0] = new Texture("blue.png");
bubbles[1] = new Texture("red.png");
bubbles[2] = new Texture("green.png");
bubbles[3] = new Texture("yellow.png");
}

然后我继续使用 for 循环以从屏幕顶部落下的随机颜色绘制纹理,如下所示:

@Override

public void render () {

    if (BubbleCount < 120) {
        BubbleCount++;
    } else {
        BubbleCount = 0;
        makeBubble();
    }

public void makeBubble () {

    float width = random.nextFloat() * Gdx.graphics.getWidth();
    BubbleXs.add((int)width);
    BubbleYs.add(Gdx.graphics.getHeight());
}

for (int i=0; i < BubbleYs.size(); i++) {

    batch.draw(bubbles[result],  BubbleXs.get(i), BubbleYs.get(i)); 
    BubbleYs.set(i, BubbleYs.get(i) -4);
}

它完美地随机绘制纹理,但只有一次,当它创建时,我希望它们在每次循环时都是一个新的随机数,所以每次掉落时都是不同的。为什么不这样做呢?我错过了什么?

提前致谢!

编辑:我检查了这个 post:Change texture with random 但它并没有真正帮助任何人。

它们完全相同的原因是您只为 result 赋值一次,即在它初始化时,并且您永远不会更改它。如果你想让它改变,你需要用你的Random去赋另一个值。

如果您想要一个介于 lowRangehighRange 之间的随机数,则您的公式 random.nextInt(highRange -lowRange) + 1 不正确。这会给你一个介于 lowRange + 1highRange + 1 之间的数字。正确的公式是 random.nextInt(highRange - lowRange) + lowRange.

解决这个问题的方法是为每个存储随机整数的气泡创建一个额外的变量。您已经为已经存储的两个变量(x 和 y)中的每一个保留了一个列表。理论上您可以添加第三个,但实际上您只需要为每个气泡创建一个 class,这样如果您添加更多功能就可以轻松扩展它。

class Bubble {
    int x;
    int y;
    int textureIndex;
}

然后将您的两个数组列表替换为:

ArrayList<Bubble> bubbles = new ArrayList<>();

您的 makeBubble 方法应该如下所示:

void makeBubble(){
    Bubble bubble = new Bubble();
    bubble.x = (int)(random.nextFloat() * Gdx.graphics.getWidth());
    bubble.y = Gdx.graphics.getHeight();
    bubble.textureIndex = random.nextInt(3);
}

用于绘制它们的 for 循环看起来像这样。我将此处的纹理数组名称更改为 bubbleTextures,因此 bubbles 可用于气泡对象列表。

for (Bubble bubble : bubbles) {
    batch.draw(bubbleTextures[bubble.textureIndex],  bubble.x, bubble.y); 
    bubble.y -= 4;
}

我在您的代码中发现了很多其他问题,但我认为解释所有问题会让人不知所措。这至少让你朝着正确的方向前进。