我目前正在研究用Java编写的游戏。 目前我很难找到一种简单的方法来存储我的GameObjects(玩家,敌人等等),以便我可以通过坐标访问它们,同时仍然可以轻松移动它们。
我已经尝试过多维数组,这很好,但不会让我轻易移动我的对象。每次移动时我都必须在数组中物理移动它。
然后我尝试了“普通”数组,它可以让你轻松移动东西,只需增加对象的x,y或z值,但不允许我通过坐标访问对象而不遍历整个数组。
现在,我正试图找到允许我同时拥有两者的妥协方案。
提前致谢, // 265
答案 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;
}