JAVA 2D数组阅读器使用扫描仪,如何将字符串转换为对象? 我正在为我的游戏创建一个地图阅读器。我将简要地解释一下我目前是如何使用它的,以及接下来我希望它如何使用
我有两个阵列。一个阵列用于瓷砖(可以移动的块)和一个阵列用于实体(战利品、敌人、玩家)。对于平铺,我使用2D int数组,但是对于实体,我使用接口2D数组(我已经创建)。实体中的所有对象都实现了接口(显然)。硬编码的Entitymap如下所示:JAVA 2D数组阅读器使用扫描仪,如何将字符串转换为对象? 我正在为我的游戏创建一个地图阅读器。我将简要地解释一下我目前是如何使用它的,以及接下来我希望它如何使用,java,multidimensional-array,Java,Multidimensional Array,我有两个阵列。一个阵列用于瓷砖(可以移动的块)和一个阵列用于实体(战利品、敌人、玩家)。对于平铺,我使用2D int数组,但是对于实体,我使用接口2D数组(我已经创建)。实体中的所有对象都实现了接口(显然)。硬编码的Entitymap如下所示: entityArray = new EntityInterface[][]{ {null, null, null, null, null, null, null, new Chest(7, 0, Entity.GEM, 5), null,
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;
}
公共类ReadMap
{
私有整数宽度;
公共读取映射(文件映射文件){
readEntity(映射文件);
}
公共EntityInterface[]readEntity(文件映射文件){
EntityInterface[][]entityArray=null;
试一试{
int y=0;
扫描仪=新扫描仪(映射文件);
while(scanner.hasNextLine()){
字符串行=scanner.nextLine();
if(!line.startsWith(“###”){
if(第行包含(“:”){
String[]split=line.split(“:”);
如果(拆分[0]。等于(“宽度”)){
宽度=整数.parseInt(拆分[1]);
entityArray=new EntityInterface[10][width];//仅为测试而将高度设置为10
}
}
String[]split=line.split(“,”);
如果(拆分长度>=宽度){
对于(int i=0;i
如您所见,我检查了数组的宽度,随后在该数组中循环,然后尝试通过将字符串转换为对象来添加它。当然,数组会抱怨,因为数组只接受“EntityInterface”类型的对象对象并不是这样。我还尝试将EntityInterface强制转换为对象,基本上是向编译器保证,是的,该项确实是EntityInterface对象,但它不喜欢这样
简而言之,我希望文本文件中的一项转换为对象/EntityInterface对象
我刚才还尝试用Object替换EntityInterface,然后将EntityInterface向下转换,这适用于硬编码映射(现在是2D对象数组),但不适用于读取映射
这就是ReadMap类中的for循环现在的情况(为了适应我现在使用2D对象数组而不是2D Entityinterface数组这一事实,进行了一些小的更改)
for (int i = 0; i < width; i++) {
Object object = split[i];
entityArray[y][i] = object;
}
for(int i=0;i
然而,虽然转换为对象的字符串是纸面上的对象,但不幸的是,它与我在硬编码映射中的对象不同。它仍然抛出CastClassException,无法将字符串转换为entityinterface。注意:硬编码的对象2D数组可以工作,而我将entityinterface转换为该列表,它可以完美地工作,只是w在文本文件中出现问题
这是编译器向我抛出的错误[错误]java.lang.ClassCastException:无法将java.lang.String转换为XXX.EntityInterface[/ERROR]
编辑:我通过将字符串转换为带有开关盒的代码来解决这个问题,即如果它看到(“门”)它将获取该门的参数,然后使用提供的参数创建一个新门您试图将
字符串
强制转换为EntityInterface
,而这两个实体彼此之间没有关系。您必须构造一个实现EntityInterface
的对象(如果名称所示为接口)通过使用构造函数。创建一个工厂,当作为参数传递字符串时(例如,当param=“Door”返回新门(…)将创建正确的EntityInterface对象。所有对象都实现EntityInterface。当我尝试从文本文件(以字符串形式返回所有数据)获取数据时,会出现此问题我想转换这个字符串,我试着将它转换成一个有效的对象,但在该对象上强制转换EntityInterface不起作用,因为它仍然将它视为一个stringI我明白你的意思@StephaneM,但这会导致Door包含的特定参数出现问题,我相当愚蠢地在te中忽略了Door对象的参数xt文件,对此我深表歉意。因此,实际上,门的属性类似于new door(x,y,LinkedMapFile)每个门都有特定的属性,战利品和其他物品也是如此。@Hoaz…你读过我说的吗。你从文本文件中检索到的字符串对象没有实现实体界面。你可以将字符串向上投射到对象并将其视为对象,但它是作为字符串
,您不能期望程序将其神奇地转换为EntityInterface
。您必须提供一个工具,将字符串
转换为EntityInterface
,这是通过自己构造来实现的。