所有具有位置的游戏对象(玩家、敌人等)都应具有对其位置的内部引用,例如;
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;
}