为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我的随机数组没有在每次渲染上绘制随机纹理?我必须改变什么?

为什么我的随机数组没有在每次渲染上绘制随机纹理?我必须改变什么?

呼如林 2023-08-16 10:06:40
在开始之前我想声明我正在学习,我是全新的。在这里我添加了尽可能多的细节。所以,我有一组不同颜色的纹理,并设置一个 Random 来随机化纹理,如下所示:Texture[] bubbles;Random random = new Random(); int lowRange = 0;int highRange = 3;int result = random.nextInt(highRange -lowRange) + 1; //my randomArrayList<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 循环以从屏幕顶部掉落的随机颜色绘制纹理,如下所示:@Overridepublic 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);}它完美地随机绘制纹理,但只有一次,当它创建时,我希望它们每次循环时都是一个新的随机,所以每次掉落时都是不同的。为什么它不这样做?我缺少什么?
查看完整描述

1 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

result它们之所以相同是因为您只在初始化时为其分配一次值,并且永远不会更改它。如果你想让它改变,你需要使用你的 Random 来分配另一个值。


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


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


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;

}

我在您的代码中发现了许多其他问题,但我认为解释所有这些问题将是令人难以承受的。这至少能让你朝着正确的方向前进。


查看完整回答
反对 回复 2023-08-16
  • 1 回答
  • 0 关注
  • 77 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信