1

我目前正在开发一个用 Java 编写的游戏。目前,我一直在寻找一种简单的方法来存储我的游戏对象(玩家、敌人等......),这样我就可以通过它们的坐标访问它们,同时仍然能够轻松地移动它们。

我已经尝试过多维数组,这很好,但不会让我轻易移动我的对象。每次移动时,我都必须物理移动数组中的对象。

然后我尝试了“普通”数组,它可以让您轻松移动事物,只需增加对象 x​​、y 或 z 值,但不允许我在不遍历整个数组的情况下通过坐标访问对象。

现在,我正试图找到一个让我两者兼得的折衷方案。

提前致谢,//265

4

2 回答 2

1

简单的解决方案是同时使用这两种形式。将坐标存储在您的GameObject实例中,同时将它们缓存在您的 3D 数组中。数组最好封装在一个提供更新和查询方法的对象中。像这样的东西:

public class GameObjectDatabase implements LocationChangeListener {

    private int [] [] [] data;

    private Set<GameObjects> objects;

    ...

    public GameObject gameObjectAt(int x, int y, int z) {
        return data[x][y][z];
    }

    @Override
    public void positionUpdated(GameObject obj, int oldX, int oldY, int oldZ) {
      ....
    }

}

为什么是监听器和被覆盖的方法?因为更新这些数据并不是您真正GameObject的工作——而是GameObjectDatabase. 因此,理想情况下,您GameObject应该允许在 a 中注册侦听器并在每次其位置更改时Set调用它们的方法。positionUpdated

于 2013-09-03T10:54:13.663 回答
0

所有具有位置的游戏对象(玩家、敌人等)都应具有对其位置的内部引用,例如;

class Position {
  int x;
  int y;
}

interface Positionable {
  Position getPosition();
  void setPosition(int x, int y, GameArea area);
}

class Player implements Positionable {
  //stuff
}

class Enemy implements Positionable {
  //stuff
}

然后你可以有一个代表你的游戏区域的类;

class GameArea {

  Positionable[][] grid;
  List<Positionable> gameObjects;

  public Positionable getByLocation(int x, int y) {
    return grid[x][y];
  }

  public void setAtLocation(int x, int y, Positionable p) {
    grid[x][y] = p;
  }

  public List<Positionable> getAll() {
    return gameObjects;
  }

}

这允许您按位置访问并遍历所有对象。当游戏对象移动时,它需要在内部更新其位置并显式更新GameArea,如下面的示例setPosition()实现所示。

void setPosition(int x, int y, GameArea area) {
  area.setAtLocation(this.x, this.y, null);
  area.setAtLocation(x, y, this);
  this.x = x;
  this.y = y;
}
于 2013-09-03T10:37:13.270 回答