4

しばらくの間、2D タイル ベースの sim ゲームを作成してきましたが、順調に進んでいます! このサイトとその親切な人々 (あなた!) のおかげで、私はゲームの経路探索の部分を完了しました。これは素晴らしいことです! THANK YOU!... とにかく、質問に。

現在、テストレベルはゲームにハードコーディングされています。明らかに、これをやり直す必要があります。私のアイデアは、Game クラスのすべての変数をさまざまな方法でテキスト ファイルに保存することでした。各レベルの詳細をファイルに書き込んで、レベルにロードすることもできます。私の質問は、テキスト ファイルのみを使用するべきか、それとも XML を使用するべきかということです。XML が基本的に何であるかは理解していますが、それを Java と組み合わせて使用​​する方法や、プレーン テキスト ファイルよりも XML が望ましい理由やそうでない理由についてはよくわかりません。私はちょっとしたグーグルを持っていました.XMLとJAVAに関する本がたくさんあります! XML を Java で使用してこの作業を行う方法について、すべてを知る必要があるとは思えませんが、自分よりも多くのことを知る必要があります。

ご協力いただきありがとうございます。

編集: 最も効果的なアイデアが見つかるまで、ここでいくつかのアイデアを試してから、それが答えとして選択されます。

編集:xStreamを選択しました。簡単でシンプル!

4

12 に答える 12

4

2D タイル ベースのゲームの場合、XML はおそらくやり過ぎです。XML は、階層データやマークアップされたテキストを保存するのに適していますが、タイル設定の 2D グリッドをエンコードする方法が必要なだけのように思えます。これは、プレーンな古いテキスト ファイルを使用する方がはるかに簡単です。

各行をタイルの行にし、タイルごとに必要な文字数を決定します (おそらく 1 つか 2 つで十分でしょう)。次に、2D ワールド内のオブジェクトをテキスト ファイル内の文字で表現する方法を決定します。

SokoBean (私が 10 年以上前に書いたゲームので、私の最高傑作とは言えませんが、何でも) では、このようなテキスト ファイルを使用しました。XML よりも解析が容易であることに加えて、プレーンな古いテキスト エディターをレベル エディターとして使用することもできます。

于 2009-07-06T20:58:52.867 に答える
2

内部目的でファイルを使用しています。簡単に言えば、ファイル形式が目的に合っていれば問題ありません。フォーマットが明確で、可能な限りシンプルで、拡張可能であることを保証するために、できることをしたいと思っています。ここで最も重要な点は、ファイル形式の読み取りと書き込みを担当するコード内の 1 つのポイントにデータの読み取りと書き込みを抽出することです。

一般的な形式は、シンプルで十分にサポートされているため一般的です。ファイルを解析するための特別なコードを記述する必要はありません (プロパティ ファイル、基本的にはキーと値のペアのリスト、および xml ファイルです。xml ファイルは、任意に深くネストされた辞書を作成する方法)。

于 2009-07-06T20:54:29.257 に答える
2

純粋にタイル ベースのゲームの場合は、ストレート テキスト ファイルを使用することをお勧めします。

おそらく、各行の後に改行で区切られた固定幅の整数が必要になるでしょう。XML ライブラリを必要とせずに、読みやすく、簡単に解析できます。

編集:

1 つの重要なアドバイス:

何をするにしても、それをカプセル化してください。一般的な入力ストリームを受け取り、グリッド構造が何であれ返す (または入力する) リーダー インターフェイスを作成します。グリッド構造と一般的な出力ストリームを受け取り、その出力ストリームにデータをダンプするライター インターフェイスを用意します。ファイルをどのように実装したいか、またはネットワーク プレイを追加したいなどについて考えが変わった場合は、後で感謝します。

于 2009-07-06T20:54:57.663 に答える
2

もちろんニーズにもよりますが、XML 形式には多くのメリットがあります。

  • ツールによって自動的にチェック/検証され、正しく、設定したルールに従っていることを確認できます。
  • Java が XML ドキュメントを解析、読み取り、更新するための既存のライブラリがあります。
  • この形式は、プログラムの将来のバージョンに合わせて簡単に拡張できますが、下位互換性を維持するのも簡単です
  • ファイルが特別に適合されたテキスト形式ではなく XML である場合、他の人がファイルを読んで理解するのは簡単です
于 2009-07-06T20:55:59.283 に答える
2

あなた自身のもの、特にゲームに関しては、XML は過大評価されています。他の人がファイルのテキストを表示する必要がある大企業で働いていた場合、XMLは理にかなっているかもしれませんが、その場合でも、おそらくすべてを行うレベル エディターが作成されているでしょう。

独自の規則で単純なテキスト ファイルを用意するか、java.io.ObjectOutputStreamand 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")

于 2009-07-06T23:01:54.973 に答える
1

ゲームの状態をオブジェクト (例: HashMap、または独自に設計したオブジェクト) に格納している場合、 XStream を使用して簡単に XML ファイルとして書き出すことができ、XStreamを使用して新しいオブジェクトに再度読み込むことができます。 .

シリアル化/逆シリアル化の方法を示す2 分間のチュートリアルがあります。ほとんどのオブジェクトを問題なく処理できます。特定のインターフェイスを実装または指定する必要はありません。JAXP、SAX、DOM なども必要ありません。

于 2009-07-06T21:20:08.097 に答える
0

不正行為は問題ですか?もしそうなら、出力がどういうわけか暗号化します。そうでない場合は、プレーンテキストで出力するだけです。

形式に関しては、XML を使用します。次のようなことができます

<Map>
    <Tile x="1" y="1" value="2"></Tile>
    <Tile x="1" y="2" value="1"></Tile>
    <Tile x="1" y="3" value="7"></Tile>
    ...
</Map>

これにより、読みやすい形式が提供され、かなりの量のデータを保存できます。

于 2009-07-08T03:18:45.173 に答える
0

ゲームの統計を保存するクラス (java.io.Serializable を実装) を使用します。次に、ObjectOutputSteam を使用してそのクラスをファイルに書き込みます。そのクラスをロードするには、ObjectInputStream を使用できます。

マルティン

于 2009-09-09T10:49:12.963 に答える
0

自分だけがファイルを変更する場合は、任意の形式を使用してください。ただし、ユーザー、テスター、または他の人が変更することが予想される場合は、XML を使用してください。XML の大きな利点の 1 つは、XML が多くの人 (プログラマーでなくても) がコーディング方法を知っている標準形式であることです。

于 2009-07-06T21:32:08.043 に答える
0

保存する必要があるデータの量と、それを取得する方法によって異なります。

XML は、いくつかのライブラリを使用して Java POJO に簡単に変換できるため、これは利点です。また、簡単に習得して使用できることがわかります。いくつかのチュートリアルを試してみてください。

ただし、大量のデータを保存する必要がある場合は、アプリケーションに応じて、組み込みデータベースまたは別の SQL サーバーの使用を検討できます。

于 2009-07-06T20:54:07.917 に答える
0

http://developers.sun.com/javadb/にある JavaDB のような組み込みデータベースの使用を検討することもできます。

それを埋め込むのはわずか 2.5MB であり、あらゆる種類のデータを構造化された信頼できる方法で保存する機能が非常に役立つことに気付くかもしれません。

データを操作するために使用できる Hibernate のような ORM フレームワークがありますが、それはおそらくアプリケーションにとってやり過ぎです。代わりに単純な JDBC を使用できます。

頑張って楽しんでください。

于 2009-07-06T23:28:28.040 に答える