通过坐标访问游戏对象,同时仍然可以轻松移动它们

时间:2013-09-03 10:09:51

标签: java arrays collections coordinates

我目前正在研究用Java编写的游戏。 目前我很难找到一种简单的方法来存储我的GameObjects(玩家,敌人等等),以便我可以通过坐标访问它们,同时仍然可以轻松移动它们。

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

然后我尝试了“普通”数组,它可以让你轻松移动东西,只需增加对象的x,y或z值,但不允许我通过坐标访问对象而不遍历整个数组。

现在,我正试图找到允许我同时拥有两者的妥协方案。

提前致谢, // 265

2 个答案:

答案 0 :(得分: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应允许在Set中注册侦听器,并在每次位置更改时调用其positionUpdated方法。

答案 1 :(得分: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;
}