1

背景

我有一个精灵(一个openGL四边形),它从屏幕顶部“落”到底部。

当它到达屏幕底部时,它的值被重置并重新开始(从上到下)但沿 X 轴移动到新的 X 位置。

我正在做的是将 X 位置存储在一个 ArrayList 中(可能只有 1 个,所以它一遍又一遍地落在同一个地方,或者 10 个,所以它每次下落时都会轻微移动)。

问题

我无法解决的是如何通过这个数组列表并将精灵的新 X 位置设置为“下一个”数组列表位置中保存的值,同时记住可能没有“下一个”位置。

所以.......(这是伪代码)......一旦精灵下降并且它的 Y 位置已重置回屏幕顶部:

spriteX = value_held_in_next_arrayList_position(if_there_is_one)

由于我的游戏的不同级别会有不同数量的位置,我不能明确地说“转到位置 2”,因为 arrayList 的大小只有 1。基本上我想说的是“转到下一个位置”和“如果没有下一个位置,则返回位置 0。

4

6 回答 6

1

ArrayList 是可迭代的,所以这是使用迭代器的好地方。假设您在迭代时没有修改列表。

于 2013-08-01T13:37:01.103 回答
1

您可以从列表中迭代Listusing whilewith :Iterator

List<YourElement> yourList;
...
Iterator<YourElement> iterator = yourList.iterator();
while(iterator.hasNext()) {
    final YourElement yourElement = iterator.next();        
    // Do whatever with yourElement
    if (iterator.hasNext()) {
        // Do whatever if there's a next element to yourElement
    }
}
于 2013-08-01T13:40:02.220 回答
0

你想要做的是获取迭代器,然后做一个while循环,如果迭代器有下一个,你抓住它并继续,否则你出来。

示例代码:

Iterator positions = spriteXPositions.iterator();
while(positions.hasNext()) {
    mySprite.position.X = positions.next();
}
于 2013-08-01T13:38:48.667 回答
0

我会使用 Iterator 对象。由于您希望它循环并且您不知道要从您那里抽象出它的大小。我们可以创建一个通用循环方法,它接受一个迭代器和父 ArrayList,如果它已经在末尾,将循环遍历它。

private void loop(Iterator it, ArrayList parent) {
    if(!it.hasNext()) { 
        it = parent.iterator();
    } 
    //Your logic here instead of logging
    //Assume always at least 1 element in arraylist
    Log.d("test", it.next() + "");
}

我们可以测试一下:

ArrayList<Float> positions = new ArrayList<Float>();
positions.add(0.123123f);
positions.add(0.2312f);
positions.add(0.323123f);

Iterator<Float> posIter = positions.iterator();
for(int i = 0; i < 100; i++) {
    loop(posIter, positions);
}
于 2013-08-01T13:47:18.390 回答
0

您可以使用 % 运算符返回到列表列表的开头。

int nextSpriteX() {
   currentXPositionIndex = (currentXPositionIndex + 1) % xPositions.size();
   return xPositions.get(currentXPositionIndex);
}
于 2013-08-01T17:02:26.443 回答
0

感谢所有提供答案的人,最后我采用了不同的方法,以防有人遇到类似问题,这就是我所做的:

if (xPosition.get(0)<X.size()-1){

xPosition.set(0, xPosition.get(0)+1);

}

else {xPosition.set(0, 1);
}

sprite.xScreen=xPosition.get(xPosition.get(0));

xPosition 是一个数组列表,第一个元素只是指向另一个包含 X 位置的元素的指针 - 所以类似于:

xPosition.add(1);  //Element 0 - pointer to subsequent elements (Points to element 1)
xPosition.add(100); //Element 1 - X position 1
xPosition.add(200)l //Element 2 - X position 2
xPosition.add(400); //Elemen 3 - X Position 3

Cheers!
于 2013-08-02T15:14:40.227 回答