我正在为我的游戏创建地图阅读器。我将简要解释一下我目前是如何工作的,以及我希望它如何工作。
Atm我有两个阵列。一个用于Tiles的数组(一个可以移动的块)和一个用于实体的数组(Loot,敌人,玩家)。对于Tiles,我使用2D int数组,但对于Entities,我使用了一个接口2D数组(我已创建)。实体中的所有对象都实现了接口(显然)。硬编码的Entitymap如下所示:
entityArray = new EntityInterface[][]{
{null, null, null, null, null, null, null, new Chest(7, 0, Entity.GEM, 5), null, null, null, null, null, null, null, null, null},
{null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, new Door(1, 16, 1)},
{player, null, null, null, null, null, null, null, null, null, null, null, null, null, null, new Loot(7, 2, Entity.GEM), null}
};
逻辑已经被弄清楚,经过测试并且工作得很好,当我想从文本文件中读取这些实体数组时会出现问题。 在文本文件中,我写了以下内容:
WIDTH:7
null,null,null,null,new Door(),null,null
在我的mapReader类中,我有以下代码:
public class ReadMap
{
private int width;
public ReadMap(File mapFile) {
readEntity(mapFile);
}
public EntityInterface[][] readEntity(File mapFile){
EntityInterface[][] entityArray = null;
try {
int y = 0;
Scanner scanner = new Scanner(mapFile);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
if (!line.startsWith("##")) {
if (line.contains(":")) {
String[] split = line.split(":");
if (split[0].equals("WIDTH")) {
width = Integer.parseInt(split[1]);
entityArray = new EntityInterface[10][width]; //height set to 10 just for testing
}
}
String[] split = line.split(",");
if (split.length >= width) {
for (int i = 0; i < width; i++) {
Object object = split[i];
System.out.println(object);
entityArray[y][i] = object; //trying to add object to array
}
y++;
}
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return entityArray;
}
正如您所看到的,我检查数组的宽度,然后循环遍历该数组,然后尝试通过将字符串转换为对象来添加它。当然数组会抱怨因为数组只接受“EntityInterface”类型的对象,而对象不是这样。我也尝试将EntityInterface转换为该对象,基本上承诺编译器是的,该项确实是一个Entityinterface对象,但它不喜欢它。
简而言之,我希望将文本文件中的项目转换为object / EntityInterface对象。
我刚刚尝试用Object替换EntityInterface,然后在链中进一步向下转换实体接口,这适用于硬编码地图(现在是2D对象数组),但不适用于读取地图。
这就是现在ReadMap类中for循环的方法(为了适应我现在使用2D对象数组而不是2D-Entity接口数组的事实的小改动
for (int i = 0; i < width; i++) {
Object object = split[i];
entityArray[y][i] = object;
}
然而,当转换成对象的字符串是纸上的对象时,遗憾的是它不像我硬编码地图中的对象。它仍然抛出CastClassException,无法将字符串转换为entityinterface。注意:硬编码的对象2D数组可以工作,我会将实体接口转换为该列表,它可以完美地工作,只是文本文件出现问题。
这是编译引发的错误 [ERROR] java.lang.ClassCastException:java.lang.String无法强制转换为XXX.EntityInterface [/ ERROR]
编辑:我通过将字符串转换为带有开关盒的代码来解决这个问题,即如果它看到(“DOOR”)它将获取该门的args,然后创建一个带有args的新门