在libGdx中使用随机vector2填充数组

时间:2016-05-20 16:58:26

标签: java arrays libgdx

当我在测试两个明显相似的代码时遇到问题时,我试图用随机vector2填充数组“星星”。

Array<Vector2> stars;
int numStars;

第一个代码

public void initStars() {

    int a = 100;
    int b = 120;
    numStars = (int) (a * b * 0.01f);
    stars = new Array<Vector2>(numStars);
    Random rand = new Random();
    Vector2 star = new Vector2();

    for (int i = 0 ;i <numStars ;i++){
        star.set(rand.nextInt(a),rand.nextInt(b));
        stars.add(star);           
    }
}

第二代码

public void initStars() {

    int a = 100;
    int b = 120;
    numStars = (int) (a * b * 0.01f);
    stars = new Array<Vector2>(numStars);
    Random rand = new Random();

    for (int i = 0 ;i <numStars ;i++){
        Vector2 star = new Vector2();
        star.set(rand.nextInt(a),rand.nextInt(b));
        stars.add(star);           
    }
}

第一个没有用,只需用循环中生成的最后一个随机向量填充数组,即。数组中的所有向量都是相等的,第二个是完美的,我的问题是,为什么会发生这种情况,如果这两个代码显然是等价的。

2 个答案:

答案 0 :(得分:1)

第一段代码无法工作。仔细看看:

Vector2 star = new Vector2();

for (int i = 0 ;i <numStars ;i++){
    star.set(rand.nextInt(a),rand.nextInt(b));
    stars.add(star);           
}

您创建矢量 ONCE ,然后继续为其分配新坐标,然后将其添加到集合中。当您致电set()时,您正在设置相同矢量的值(因为您仍在引用相同的矢量)。

结果是您在集合中numStars次存储了相同的向量,这正是您所注意到的。

也许为了使这个更具体,你在第一个场景中创建的内容基本上是这样的:

stars = [starA, starA, starA, ..., starA]

第二个是这个:

stars = [starA, starB, starC, ..., starZ]

如果您拨打starA.set(),在第一种情况下,您不仅要修改要添加的星标;你正在修改你之前放置的每颗星(因为它们是同一颗星!)。

希望这有帮助。

答案 1 :(得分:1)

不,他们不等同。在Java中,使用数据结构时,只传递指针,而不是实际对象。

因此,在您的第一个代码段中,您只有一个实际Vector2对象,该对象会重复添加到Array。因此,Array中的每个元素都指向同一个对象,它们都具有相同的值。这等于分配给star变量的最后一个值。

然而,第二个代码段确实有效,因为每个点都有自己的Vector2对象,这意味着Array中的每个元素都指向不同的对象< / em>在创建时随机分配它自己的值。