あなた自身のもの、特にゲームに関しては、XML は過大評価されています。他の人がファイルのテキストを表示する必要がある大企業で働いていた場合、XMLは理にかなっているかもしれませんが、その場合でも、おそらくすべてを行うレベル エディターが作成されているでしょう。
独自の規則で単純なテキスト ファイルを用意するか、java.io.ObjectOutputStream
and java.io.ObjectInputStream
を使用してデータをデータ ファイルに直接書き込むか (情報やオブジェクトが多い場合)、またはjava.util.Properties
データを書き込む (必要な場合のみ) ことをお勧めします。プリミティブを書く)。
上記の多くの人々は、「自動シリアライゼーション」を備えているため、XML がいかに優れているかについて言及していますが、Java で作業する場合は言及する価値はないと思います。レベル。
また、XML タグを使用して 2D タイル マップを表現するのは非常に直感的ではないことを忘れないでください。一方、文字ファイルに 1 行ずつ記述するのは読み書きがかなり簡単です。
元。)
WWWWWWWWWW
WSWWWWW EW
W W K WW W
W W WW W
W WW WWWDW
W X W
WWWWWWWWWW
上記のように、W
は壁、S
は開始、E
は終了、K
は鍵、D
は扉、X
はモンスターです。すべてがどこにあり、どのようにレベルを設定する必要があるかは、テキスト ファイルであっても非常に明白です。
私は多くのプロのゲーム プロジェクトでテキスト ファイルを使用してきました。実際、私は誰かのために請負作業を行ったときにのみ XML を使用しました。XML は「より専門的」に見えるためです。XML が使用されるほとんどの場合、XML は不要であり、物事を過度に複雑にするスペースの無駄です。
もう一つの例:
SpawnFrequency 0.1 20.5
HealthPoints 5
Stats 12 500 30 10 11
他に何が起こるか想像できます。次に、ファイルを Java に読み込むときに、 を使用BufferedReader.readLine()
して各パラメーターを取得し、次にString.split()
そのパラメーターのすべての値の配列を取得します。次に、分割配列の最初の値を比較する大きな switch ステートメントまたは if/else グループ化により、実際に読み取ったパラメーターが決定されます。ここまで来ると、XML の有用性に近づきますが、この用途にはまだ過度に肥大化している可能性があります。ただし、XML は、これらの不思議な値の一部が何であるかを説明するのに役立ちます。
上記の XML は次のとおりです。
または多分このように:
`<GuyStuff>`
`<SpawnFrequencyMinimum>0.1</SpawnFrequencyMinimum>`
`<SpawnFrequencyMaximum>20.5</SpawnFrequencyMaximum>`
`<Health>5</Health>`
`<Strength>12</Strength>`
`<Agility>500</Agility>`
`<Stamina>30</Stamina>`
`<TechnoWizardry>10</TechnoWizardry>`
`<JavaSkillz>11</JavaSkillz>`
`</GuyStuff>`
しかし、繰り返しになりますが、その複雑さに到達し始めると、java.io.Serializable
非常に簡単なので、使い始めたほうがよいでしょう.
EDIT
これはシリアライズ可能な例です。
public class MySaveData implements java.io.Serializable //Serializable doesn't need any methods implemented, it simply says, "hey Java, my object can be written to a file."
{
float data1;
int data2;
Object data3;
//BufferedImage data4; //Note that in order for an object to serialize, it can't contain any data members that are not Serializable, so this would be illegal.
}
import java.io.*;
public class DataReader
{
public void saveData(File loc, MySaveData obj1, MySaveData obj2, MySaveData obj3)
{
try
{
//You can use any type of OutputStream to create an OOS, so you can for
//example use one when you're connected with Sockets or something similar.
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(loc));
//Writing objects is tremendously easy, and so are primitives.
//Note that the order you write them in is the same order you will read them.
os.writeObject(obj1);
os.writeObject(obj2);
os.writeObject(obj3);
os.writeDouble(someValueINeededToWrite);
os.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
public void loadData(File loc, PlaceToPutData place)
{
try
{
//ObjectInputStream follows the same rules as OOS mentioned above.
ObjectInputStream is = new ObjectInputStream(new FileInputStream(loc));
//Remember to read your data back the same order you wrote it.
place.obj1 = is.readObject();
place.obj2 = is.readObject();
//If you don't want one of the objects for some reason and want
//to get something after it, you can just read the next one but not use it.
readObject();
place.value = is.readDouble();
is.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
通常、ファイルは次のようになりますnew java.io.File("/Documents/MyGame/MyDataFile.whateverIFeelLikeAsLongAsItsConsistent")
。