2009-07-06 7 views
3

しばらくの間、私は2dタイルベースのシムゲームを作っていましたが、うまくいっています!このサイトとその優しい人(あなた!)のおかげで、私はゲームのパスを見つけるのが終わりました。これは素晴らしいことです!ありがとうございました!...とにかく、質問に。Javaでタイルベースのゲームを読み込んで保存する。 XMLまたはTXT?

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

ありがとうございました。

編集: 私は最高の作品を見つけるまで、ここでいくつかのアイデアを試してみましょう。それが答えとして選ばれます。

編集:xStreamを選択します。簡単で簡単!

+6

「XMLが暴力のようなものであると言われています。少しは、より多くのを使用し、問題が解決しない場合は。」 – banjollity

+2

100%ack XMLを使用する場合は、 4を避けてください。 schnaader

+0

@schnaader thedailywtf.comの将来の登場人物がその.. ..の作者を待っています! – banjollity

答えて

1

ゲームの状態がオブジェクト(例えば、HashMapまたは自分のデザインのオブジェクトなど)にある場合は、XStreamを使用してXMLファイルとして書き出して、それを新しいXStreamを再度使用してオブジェクトを作成します。

シリアル化/デシリアライズの方法を示すtwo minute tutorialがあります。ほとんどのオブジェクトを難なく処理できます。特定のインタフェースを実装または指定する必要はありません。また、JAXP、SAX、DOMなどは必要ありません。

+0

うわー、これは本当に興味深いね!あなたが言うように動作する場合、私はこれが答えかもしれないと思います!私の意図は、ゲームと呼ばれるオブジェクトにすべてを含めることでした。 – Relequestual

+0

うまくいくはずです。私が遭遇した唯一の問題は、内部クラスを直列化することです。その時点で、それは爆発します。しかし、そうでなければそれはかなり簡単です –

+0

w.r.tが内部クラスをシリアライズすることによってあなたが何を意味するか分かりません...あなたはどうか説明できますか? – Relequestual

0

どのくらいのデータを保存する必要があり、それをどのように取得する必要があるかによって異なります。

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

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

+0

実際に保存されるデータはあまりありません。その小さな2Dタイルベースのシムゲームです。 – Relequestual

2

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

一般的な形式は単純でよくサポートされているので一般的です。ファイルを解析するための特別なコードを書く必要はありません(プロパティファイル、基本的にはキーと値のペアの一覧とxmlファイル)。任意に深く入れ子になった辞書を書く方法としてxmlファイル)。

+0

ありがとうございます。私はテキストファイルの内外でデータを読み取る方法を知っており、昨年ほど学習しています。私はそのようなファイルを構築して保存してから、もう一度読み込んでも問題はありません。 – Relequestual

2

純粋にタイルベースのゲームの場合は、まっすぐなテキストファイルがおそらく方法です。

おそらく、各行の後に改行でスペース区切りの固定幅intが必要になるでしょう。 XMLライブラリを必要とせずに、読みやすく、解析が簡単です。

編集:アドバイスの

一つの重要な作品:あなたがすることを決定したものは何でも

、それをカプセル化!一般的な入力ストリームを取得し、グリッド構造が何であれ、それを返す(または読み込む)リーダーインターフェイスを作成します。グリッド構造と汎用出力ストリームを取り、その出力ストリームにデータをダンプするライターインタフェースを用意します。あとでファイルをどのように実装したいのか、ネットワーク再生を追加するかなど、あなたの心が変わったときは、後で感謝します。

+0

ええ、私はあなたに同意だと思います。私は、XMLを提案した友人と話していましたが、Stackが何を言っているかを見なければなりませんでした。 – Relequestual

2

もちろん、あなたのニーズにもよりますが、XML形式は多くのメリットをもたらし、おそらくこのようなプロジェクトではXMLを選択するでしょう。

  • それは、あなたが設定 ルールに従って正しい を確認するためのツールによって検証/自動 確認することができます。
  • のXML文書を解析、読み込み、更新するためのJava用の既存のライブラリがあります。
  • フォーマットは互換性
  • 彼らはXMLではなく、いくつかの特別に適合テキスト形式
ある場合は、ファイルを読んで理解するために他の人のためにその簡単後方あなたのプログラムの将来のバージョンのために容易に拡張が、維持するのはまだ簡単です。
4

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

各行をタイルの行にして、タイルごとにいくつの文字を使用するかを決めます(おそらく1つまたは2つは問題ありません)。次に、テキストファイル内の文字で2D世界のオブジェクトを表現する方法を決めます。

SokoBean(私が10年以上前に書いたゲームなので、私の最高の仕事とは言いませんが、何でも)text files like this oneを使用しました。 XMLよりも解析が簡単であることに加えて、平易な古いテキストエディタをレベルエディタとして使用することもできます。

+0

これは、おかげで小さなゲームに感謝! 私は、この複合体のゲームに同じ種類のテキストファイルを実装することはできないと思います。これはどんなプログラミング言語でも私の2番目のゲームなので、私が行くにつれて多くのことを学んでいます! – Relequestual

0

ファイルを修正する唯一の人は、任意のフォーマットを使用してください。ただし、ユーザーやテスターなどが変更を加えることを期待する場合は、XMLを使用してください。 XMLの大きなメリットの1つは、多くの人(多くのプログラマでなくても)がコード作成の仕方を知っている標準的なフォーマットです。

0

XMLエコシステムの一部が必要な場合は、 :検証、変換、自動シリアル化/逆シリアル化など。しかし、私はそれらのすべてのものが何であるか知っていますし、それらをかなり良い効果に使う方法を知っています。

この質問のテナーから私はあなたが推測していないと思うなら、本当の質問は「私の情報をXML文書に保存できるように、 ? "答えは "あなたはほとんど間違いないはずです"。

2

あなた自身のもの、特にゲームの面では、XMLは過大評価されています。他の人があなたのファイルのテキストを見る必要がある大企業で働いていたら、XML かもしれません。でも意味がありますが、その場合でもすべてのことをするレベルエディタが書かれているでしょう。

私は自分自身の大会と単純なテキストファイルを持つ、またはちょうどあなたを書くために、データファイル(あなたが情報やオブジェクトの多くを持っている場合)、またはjava.util.Propertiesに直接データを書き込むことがjava.io.ObjectOutputStreamとj ava.io.ObjectInputStreamを使用してのいずれかをお勧めしますデータ(プリミティブを書く必要がある場合のみ)

「自動シリアル化」があるのでXMLがうまくいかないのは、私が上で列挙した両方のメソッドも自動であるためですが、Javaで作業するときには言及する価値はないと思いますはるかに高度なレベルです。

また、XMLタグを使用して2Dタイルマップを表現するのは非常に直感的ではありませんが、文字ファイルに1行ずつ書き込むだけで読み書きはかなり簡単です。

EX。)

WWWWWWWWWW 
WSWWWWW EW 
W W K WW W 
W W WW W 
W WW WWWDW 
W X  W 
WWWWWWWWWW 

あなたはWウォールである場合には、上記のような何かを行うことができ、SDがドアで、Kがキーである、Eが出口で、スタートで、Xは怪物です。テキストファイルであっても、すべてが存在し、レベルをどのように設定すべきかは非常に明白です。

私は多くのプロのゲームプロジェクトの中でテキストファイルを使用してきました。実際には、私は誰かのために契約作業をしたときにXMLを使用しただけです。なぜなら、大部分の場合、XMLは不要であり、物事を過度に複雑にするスペースが無駄だからです。

もう一つの例:あなたが起こるかもしれない他のものは何でも想像できる

SpawnFrequency 0.1 20.5 
HealthPoints 5 
Stats 12 500 30 10 11 

。次に、ファイルをJavaに読み込むときには、BufferedReader.readLine()を使用して各パラメータを取得し、次にString.split()を使用して、そのパラメータのすべての値の配列を取得します。その後、大きなswitch文またはif/elseグルーピングがsplit配列の最初の値を比較することで、実際に読み込んだパラメータが決まります。この時点では、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>` 

しかし、もう一度ときにXMLは、しかし、それらの神秘的な値のいくつかは、何ができるかを説明するのに役立つ可能性があり複雑さが増し始めたら、それは非常に簡単だからjava.io.Serializableを使い始めることもできます。

編集 ここにはシリアライズ可能な例があります。

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")のようになります。

+0

私はjava.io.outputstreamとinputstreamを使用しています。私はまだJavaにとって非常に新しいので、あなたが言及した他のものについて聞いたことがないので、それらが何であるか、それらをどのように使用するか分からない。私は今それらを調べなければならないでしょう!オブジェクトのオブジェクト内に自分のオブジェクトがあり、メインのGameクラスオブジェクトの中にすべてのゲーム変数がある場合、あなたはそう言うようにシリアライズ可能なものを使うことができますか? – Relequestual

0

あなたはここにありJavaDB、などの組み込みデータベースを使用して考えることがあります。 http://developers.sun.com/javadb/

それはそれを埋め込むための唯一の2.5メガバイトだし、あなたが構造化され、信頼性の高い方法で、あらゆる種類のデータを保存する機能を見つけることができます非常に役立ちます。

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

最高の運があり、楽しんでください。

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> 

これはすばらしい読み取り可能な形式を提供し、かなりのデータを保存することができます。

+0

現在、不正行為は問題ありません。 最終的に問題になった場合は、保存する前にxmlを暗号化できます。 – Relequestual

0

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

マルタイン

関連する問題