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

Java 通过坐标访问游戏对象,同时仍然能够轻松移动它们,java,arrays,collections,coordinates,Java,Arrays,Collections,Coordinates,我目前正在开发一款用Java编写的游戏。 目前,我一直在寻找一种简单的方法来存储我的游戏对象(玩家、敌人等等),这样我就可以通过它们的坐标访问它们,同时仍然能够轻松地移动它们 我已经尝试过多维数组,这很好,但不会让我轻松移动对象。每次数组中的对象移动时,我都必须对其进行物理移动 然后我尝试了“普通”数组,它可以让你轻松地移动物体,只是增加对象的x、y或z值,但不允许我通过坐标访问对象而不遍历整个数组 现在,我正试图找到一个折衷方案,让我两者兼得 提前感谢,, //265所有有位置的游戏对象(玩家

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

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

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

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

提前感谢,,
//265

所有有位置的游戏对象(玩家、敌人等)都应该有其位置的内部参考,例如

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;
  }

}

所有有位置的游戏对象(玩家、敌人等)都应该有其位置的内部参考,例如

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;
  }

}

简单的解决方案是同时使用两种形式。将坐标存储在
游戏对象
实例中,同时将它们缓存在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) {
      ....
    }

}
公共类GameObjectDatabase实现LocationChangeListener{
私有int[][]数据;
私有集合对象;
...
公共游戏对象gameObjectAt(整数x,整数y,整数z){
返回数据[x][y][z];
}
@凌驾
更新的公共无效位置(游戏对象对象obj、int oldX、int oldY、int oldZ){
....
}
}

为什么选择侦听器和重写的方法?因为更新这些数据并不是你的
GameObject
的工作,而是
GameObjectDatabase
的责任。因此,理想情况下,您的
GameObject
应该允许在
Set
中注册侦听器,并在其位置每次更改时调用其
positionUpdated
方法

简单的解决方案是同时使用两种形式。将坐标存储在
游戏对象
实例中,同时将它们缓存在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) {
      ....
    }

}
公共类GameObjectDatabase实现LocationChangeListener{
私有int[][]数据;
私有集合对象;
...
公共游戏对象gameObjectAt(整数x,整数y,整数z){
返回数据[x][y][z];
}
@凌驾
更新的公共无效位置(游戏对象对象obj、int oldX、int oldY、int oldZ){
....
}
}

为什么选择侦听器和重写的方法?因为更新这些数据并不是你的
GameObject
的工作,而是
GameObjectDatabase
的责任。因此,理想情况下,您的
GameObject
应该允许在
Set
中注册侦听器,并在其位置每次更改时调用其
positionUpdated
方法

谢谢你的回答,我想我会这样做的我可能会使GameObject实现具体化,而不仅仅是界面,让它们具有位置的getter和setter,以便轻松捕获位置的变化GameObjectDatabase@Ferdi265:在这种情况下,那当然没问题。在编写游戏时,不要太依赖继承来重用代码。如果你想了解更多信息,谢谢你的回答,我想我会这么做的我可能会使GameObject实现具体化,而不仅仅是界面,让它们具有位置的getter和setter,以便轻松捕获位置的变化GameObjectDatabase@Ferdi265:在这种情况下,那当然没问题。在编写游戏时,不要太依赖继承来重用代码。如果您想要更多信息。