gpt4 book ai didi

java - 创建可以在 Java 中放置和移动对象的 2D map

转载 作者:搜寻专家 更新时间:2023-11-01 02:05:52 25 4
gpt4 key购买 nike

我是 Java 的新手,我正在尝试制作一个基于文本的 2D 游戏,该游戏内部包含一个世界地图,对象可以在该 map 上进行交互和移动。但是,我一开始就很困惑。假设我有一张 3x3 的 map 。然后,每个图 block 都是多维数组中的一个值(例如,坐标 [0][2] 上的图 block )。但是,每个图 block 必须是对象数组(例如,图 block 对象(森林、地面、沙漠)或实体(人、岩石、鸭子))。它应该是一个数组,因为每个图 block 必须至少包含一个图 block 对象(森林、地面、沙漠),但理论上可以包含无限数量的实体。

我尝试并结合了这里的一些答案。目前的想法是制作一个只有坐标的父类(super class)实体。创建实体时(给定一些坐标),该对象将链接到该位置的世界地图(似乎不起作用)。世界地图是一个可以容纳实体的多维数组。

实体没有链接到世界地图,我不明白为什么。在 Entity.java 和 World.java 文件中肯定出错了,但我仍然不确定如何将位置设置为世界地图。 请注意,稍后我需要在 map 上设置或更改实体的位置,或者将实体作为一个整体(包括它在 map 上的位置)移除。

最佳答案

我认为您的磁贴不应该是一个实体。我认为 tile 应该封装实体。例如。

public class Tile {
final int xPos,yPos;
private String type;
List<Entity> entities = new ArrayList<>();
public Tile(int xPosition, int yPosition) {
xPos = xPosition;
yPos = yPosition;
}

public void setType(String type){
this.type = type;
}
public String getType() {
return type;
}
public void addEntity(Entity e){
entities.add(e);
}
public void removeEntity(Entity e){
entities.remove(e);
}
}

然后世界类将包含实体:

public class World {
Tile[][] coordinates;
List<Tile> tiles = new ArrayList<>();

// Creates an instance of a map with a user-defined size
public World(int width, int height) {
coordinates = new Tile[width][height];
for(int i = 0; i<width; i++){
for(int j = 0; j<height; j++){
coordinates[i][j] = new Tile(i,j);
tiles.add(coordinates[i][j]);
}
}
}

public void addEntity(Entity e){
int x = e.getX();
int y = e.getY();
coordinates[x][y].addEntity(e);
}
public void setTileType(int x, int y, String type){
coordinates[x][y].setType(type);
}
public List<Tile> getTiles(){
return new List<>(tiles);
}

public List<Entity> getEntities(){
List<Entity> entities = new ArrayList<>();
for(Tile[] row: coordinates){
for(Tile tile: row){
entities.addAll(tile.entities);
}
}
}
}

那么您的主要方法将类似于:

public static void main(String[] args) {
// Creators
World worldMap = new World(mapWidth, mapHeight);
Character john = new Character("John", 0, 0);
Character mary = new Character("Mary", 1, 4);
worldMap.addEntity(john);
worldMap.addEntity(mary);

for (int x = 0; x < mapWidth; x++) {
worldMap.setTileType(x, 5, "forest");
}

// Printing out info about character(s)
//I think the world map should have a list of characters.

for (Character character : charList) {
System.out.print(character+": " + character.getName() + "\n");
}
System.out.print("\n"+charList.size() + " characters in play\n\n");
List<Tile> tileList = worldMap.getTiles();
// Printing out info about tile(s)
for (Tile tile : tileList) {
System.out.print(tile + " type: " + tile.getType() + "\n");
}
System.out.print("\n"+tileList.size() + " tiles in play");
}

之所以有两个#addEntity() 是因为想如何回答以下困境。

“我想创建一个角色 john 并将他添加到世界中的 x,y 位置。”

当然有

Character john = new Character("john", x, y);

那么,我们如何将 john 添加到 World 中呢?我说,我们只需将他添加到世界中,让世界知道如何处理瓷砖等。

world.addEntity(john);

约翰有一个位置,世界可以找到瓷砖,并将约翰放在瓷砖上。相反,这与您尝试过的更相似,是找到磁贴并直接添加 john。

world.coordinates[john.getX()][john.getY()].addEntity(john);

正如您在示例中所示,这有一些索引越界异常问题,您应该处理这些问题。所以问题是,您需要了解很多有关图 block 结构的信息才能添加实体。相反,让世界添加实体,因为这样它就可以一次处理所有警告并将实体放置在正确的图 block 上。

关于java - 创建可以在 Java 中放置和移动对象的 2D map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33676775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com