我目前正在努力解决问题。对于我的世界编辑器,我希望我的程序读取文本文件并将其内容用作代码材料。我已经做了一个不错的文件阅读器,但现在我遇到了问题。在控制台中我得到正确的输出,该文件只有一行说:
this.makeGrass(new Vector3f(0, 1, 2));
这实际上是代码的一部分,它告诉我的程序将特定对象渲染到场景中,在这种情况下它是草模型。但是,而不是仅使用
将此信息打印到控制台System.out.println(aryLines[i]);
我希望能够使用存储在.txt文件中的信息,以便将其实际添加到我的渲染代码中。将文本文件中的行打印到控制台的整个方法是:
public void TextOutput()
{
String file_name = "C:/Text.txt";
try
{
StoreCoords file = new StoreCoords(file_name);
String[] aryLines = file.OpenFile();
int i;
for (i = 0; i < aryLines.length; i++)
{
System.out.println(aryLines[i]);
// !! How to use the information as part of my code ??
}
} catch(IOException e)
{
System.out.println(e.getMessage());
}
}
我希望你理解我想要的东西:我的文本文件的内容是一段代码,我想进一步使用而不是只打印到控制台,我确信这是可能的,但我不知道如何。
答案 0 :(得分:1)
由于Java是一种编译语言,您必须在运行时重新编译,我不确定这是否可行。如果我是你,我会用我自己的命令进行硬编码。你想调用一个名为makeGrass的函数,对其进行硬编码。也许在你的文本文件中你可以这样:
makeGrass:0,1,2
然后在println之后有这个:
if(aryLines[i].startsWith("makeGrass:")) {
String Arguments = aryLines[i].substring(aryLines[i].indexOf(":")+1, aryLines[i].length());
ArgArray = Arguments.split(",");
this.makeGrass(new Vector3f(Double.parseDouble(ArgArray[0]), Double.parseDouble(ArgArray[1]), Double.parseDouble(ArgArray[2])));
}
假设您是一位经验丰富的程序员,我会留下这样的答案。如果我错了,请随便问我,我会向你解释。如果需要,我还可以解释如何修改它以添加不同的命令。
此外,这是相当不安全的,因为如果输入格式错误,则会导致应用程序崩溃。如果您计划让用户编辑该文件,那么我可以向您展示如何添加安全性。
希望这有帮助, 约瑟夫梅多斯
答案 1 :(得分:1)
好的,感谢Joseph Meadows的提示,我正在做以下事情,就在println声明之后我添加了他提供的代码。为了使ArgArray工作,我必须在它之前放置String [],我还必须在我的Vector3f类中创建一个新的构造函数来匹配Double.parseDouble的东西..
public void TextOutput()
{
String file_name = "C:/Users/Server/Desktop/textText.txt";
try
{
StoreCoords file = new StoreCoords(file_name);
String[] aryLines = file.OpenFile();
int i;
for (i = 0; i < aryLines.length; i++)
{
System.out.println(aryLines[i]);
if(aryLines[i].startsWith("makeGrass:")) {
String Arguments = aryLines[i].substring(aryLines[i].indexOf(":")+1, aryLines[i].length());
String[] ArgArray = Arguments.split(",");
this.makeGrass(new Vector3f(Double.parseDouble(ArgArray[0]),
Double.parseDouble(ArgArray[1]),
Double.parseDouble(ArgArray[2])));
}
}
} catch(IOException e)
{
System.out.println(e.getMessage());
}
}
我原来的Vector3f构造函数是:
public Vector3f(float x, float y, float z)
{
this.m_x = x;
this.m_y = y;
this.m_z = z;
}
并且为了使TextOutput方法中的代码工作,我在原始代码的正下方添加了另一个构造函数。
public Vector3f(double parseDouble, double parseDouble2, double parseDouble3) {
this.m_x = (float) parseDouble;
this.m_y = (float) parseDouble2;
this.m_z = (float) parseDouble3;
}
现在一切都很好,控制台给了我适当的陈述
makeGrass:0,1,2
并且渲染系统在适当的坐标处创建草模型,我现在唯一要改变的是我不必在Vector3f类中添加额外的构造函数,我相信我会想到也是。
在此链接提供的图片中,您可以准确地看到发生了什么:
http://www.pic-upload.de/view-27720774/makeGrassEx.png.html
如您所见,文本文件的内容将在控制台中打印出来(下面的数字是fps计数器),文本文件提供的坐标被正确解释,两个草模型显示在相应的坐标处这正是我想要的!
再次感谢Joseph Meadows的帮助,这正是我所寻找的!
答案 2 :(得分:0)
我不确定你是否解决了这个问题,但你不需要第二个构造函数。我不确定你用于坐标的数据类型,我假设你使用双打,因为这是我习惯使用的。
实际上,可以从字符串中解析所有类型。看这里:
this.makeGrass(new Vector3f(Double.parseDouble(ArgArray[0]),
Double.parseDouble(ArgArray[1]),
Double.parseDouble(ArgArray[2])));
现在正在将字符串变为双精度。这就是
Double.parseDouble();
确实
看起来你正在使用浮点数,所以你总是可以使用浮点解析方法:
Float.parseFloat("String");
这将导致:
this.makeGrass(new Vector3f(Float.parseFloat(ArgArray[0]),
Float.parseFloat(ArgArray[1]),
Float.parseFloat(ArgArray[2])));
对于迟到的回复表示歉心,欢迎您的帮助。我只是喜欢有用!