Java游戏创建确定性图块地图

时间:2014-03-14 11:37:25

标签: java android algorithm deterministic

我有一个800x480的屏幕尺寸,我玩游戏。 我有大小为60x120的瓷砖,我将它放在屏幕上的某个位置。从一开始我创建了8个瓷砖,见下图。瓷砖总是从右向左移动。当图块不在屏幕上时,我会在新位置重新创建图块。我遇到的问题是瓷砖不是确定性的,一些瓷砖在移动到新位置时会相互重叠。

enter image description here

下面的代码检查磁贴位置。如果图块在屏幕之外,则图块将移动到新位置。我现在遇到的问题是瓷砖有时会相互重叠。我该如何解决这个问题呢?

 tileX += speedX; // speedX is the speed of tiles moving to the left.
    if(tileX <= -60){ // Checks if tile position is out of screen
       tileX += 840;
    }

2 个答案:

答案 0 :(得分:2)

我不会只是将任意值添加到tileX的位置,而是找到一个可以设置它的数字,以便它可以一致地移动。

if(tileX <= -60){
   tileX = 780;
}

例如。

如果这不起作用,您可能需要在游戏循环中发布更多代码才能找到问题。

答案 1 :(得分:1)

由于缺乏信息,我不得不猜测你的算法,移动瓷砖是如何工作的。但我建议(作为讨论的工作副本)我会想出一个算法。重要的是我确实在一个单独的循环中向左移动所有的瓷砖。否则,如果移动Tile,如果它向左移动,则将其从List中删除并将其添加到List的末尾,您将处理它两次。您的代码中是否存在这种情况?

从最左侧到最右侧,所有图块都在列表中排序。算法保持这种方式。循环首先处理最左边的循环以避免重叠(即使它们还没有被绘制)。如上所述,由于缺乏信息,这是一个猜测。

public interface Tile {
    public void moveLeft(int pixel);
    public void moveRight(int pixel);
    public int getX();
}

public static void main(String[] args) {
    int speedX = 20;
    List<Tile> tiles = getMovingTiles();
    for (Tile tile : tiles) tile.moveLeft(speedX);
    while (tiles.get(0).getX() <= -60) {
        Tile tile = tiles.remove(0);
        tile.moveRight(840);
        tiles.add(tile);
    }
}

private static List<Tile> getMovingTiles() {
    throw new UnsupportedOperationException("not yet implemented");
}

== UPDATE ==

更有效的算法蓝图:

public interface Tile {
    public void moveLeft(int pixel);
    public int getX();
    public void setX(int pixel);
}

public static void moveTiles(List<Tile> tiles, int speed, int offScreen, int startPos) {
    tiles.add(null);
    for (int idx = 0; tiles.get(idx) != null;) {
        Tile tile = tiles.get(idx);
        tile.moveLeft(speed);
        if (tile.getX() <= offScreen) {
            tile.setX(startPos);
            tiles.add(tiles.remove(idx));
        } else idx++;
    }
    tiles.remove(null);
}