2010-12-12 4 views
1

私はタイルベースのレベルエディタをJavaで構築しましたが、それはちょうど完了しましたが、レベルを保存するメソッドを書いているので、私のタイルはすべてイメージスプライトであり、それらを保存する方法はわかりません実際のゲームでは各タイルを自分のイメージファイルにすることなく読み込むことができ、それを実際のゲームで読み込むためにインポートする必要があります。 (700以上のタイルがありますが、そのレベルはおそらく100を使用します)。私のレベルエディタからタイルスプライトを保存するにはどうすればよいですか?

私の質問すべて:これらのタイルをすべて保存するにはどうすればよいですか?私はテキストファイルに物事を保存することに精通していますが、私は同じ方法でこれらの画像を保存することはできません。テキストベースの情報が私のタイルスプライトと同じ場所に保存されるようにレベルを保存する方法はありますか?ここ

は私のタイルクラスであり、私は私の保存方法の観点から、これまで持っていることは

public class Tile { 
    int x, y, w, h, type; 
    BufferedImage layer1Image; 
    BufferedImage layer2Image; 
    BufferedImage layer3Image; 
    BufferedImage layer4Image; 
    boolean walkable; 

    public Tile(int x, int y, int w, int h) { 
     walkable = false; 
     this.x = x; 
     this.y = y; 
     this.w = w; 
     this.h = h; 
     type = 0; 
     layer1Image = null; 
     layer2Image = null; 
     layer3Image = null; 
     layer4Image = null; 
    } 

    public Tile() { 

    } 

    public int getX() { 
     return x; 
    } 

    public int getY() { 
     return y; 
    } 

    public int getW() { 
     return w; 
    } 

    public int getH() { 
     return h; 
    } 

    public void setX(int newX) { 
     x = newX; 
    } 

    public void setY(int newY) { 
     y = newY; 
    } 

    public void setW(int newW) { 
     w = newW; 
    } 

    public void setH(int newH) { 
     h = newH; 
    } 

    public boolean mouseOver(int mouseX, int mouseY) { 
     if (mouseX > x && mouseX < x + w && mouseY > y && mouseY < y + h) { 
     return true; 
     } 
     return false; 
    } 

    public int getType() { 
     return type; 
    } 

    public boolean getWalkable() { 
     return walkable; 
    } 

    public BufferedImage getLayer1Image() { 
     return layer1Image; 
    } 

    public BufferedImage getLayer2Image() { 
     return layer2Image; 
    } 

    public BufferedImage getLayer3Image() { 
     return layer3Image; 
    } 

    public BufferedImage getLayer4Image() { 
     return layer4Image; 
    } 

    public void clearImages() { 
     layer1Image = null; 
     layer2Image = null; 
     layer3Image = null; 
     layer4Image = null; 
     walkable = true; 
    } 

    public void setImage(BufferedImage image, int layer) { 
     switch (layer) { 
     case 0: 
     layer1Image = image; 
     break; 
     case 1: 
     layer2Image = image; 
     break; 
     case 2: 
     layer3Image = image; 
     case 3: 
     layer4Image = image; 
     } 
    } 

    public void display(Graphics g, int x, int y, int w, int h, int zoom) { 
     g.setColor(Color.BLACK); 
     g.drawImage(layer1Image, x, y, w, h, null); 
     g.drawImage(layer2Image, x, y, w, h, null); 
     g.drawImage(layer3Image, x, y, w, h, null); 
     g.drawImage(layer4Image, x, y, w, h, null); 
     g.drawRect(x, y, w, h); 

    } 

    public void getAttributes(Tile tile) { 
     layer1Image = tile.getLayer1Image(); 
     layer2Image = tile.getLayer2Image(); 
     layer3Image = tile.getLayer3Image(); 
     layer4Image = tile.getLayer4Image(); 
     x = tile.getX(); 
     y = tile.getY(); 
     w = tile.getW(); 
     h = tile.getH(); 
     walkable = tile.getWalkable(); 
     type = tile.getType(); 

    } 

    public void setWalkable(boolean b) { 
     walkable = b; 
    } 



      // Here is the save, its in a different class in case my formatting in the post is screwy 






     public void doSaveAsText() { 
     if (fileDialog == null) { 
     fileDialog = new JFileChooser(); 
     } 
     File selectedFile; 
     if (editFile == null) { 
     selectedFile = new File("levelData.txt"); 
     } else { 
     selectedFile = new File(editFile.getName()); 
     } 
     fileDialog.setSelectedFile(selectedFile); 
     fileDialog.setDialogTitle("Select File to be Saved"); 
     int option = fileDialog.showSaveDialog(this); 
     if (option != JFileChooser.APPROVE_OPTION) { 
     return; 
     } 
     selectedFile = fileDialog.getSelectedFile(); 
     if (selectedFile.exists()) { 
     int response = JOptionPane.showConfirmDialog(this, "Already exists, overwrite?", "Confirm Save", JOptionPane.YES_NO_OPTION, 
     JOptionPane.WARNING_MESSAGE); 
     if (response != JOptionPane.YES_OPTION) { 
     return; 
     } 

     } 
     PrintWriter out; 
     try{ 
     FileWriter stream = new FileWriter(selectedFile); 
     out = new PrintWriter(stream); 
     } catch (Exception e){ 
     JOptionPane.showMessageDialog(this, "error"); 
     return; 
     } 
     try{ 
     out.println("LevelEditor v1.0"); 
     for(int i = 0; i < mapPanel.tilesList.size(); i++){ 
     Tile currentTile = mapPanel.tilesList.get(i); 
     out.println("startTile"); 
     out.println("" + currentTile.getX()); 
     out.println("" + currentTile.getY()); 
     out.println("" + currentTile.getW()); 
     out.println("" + currentTile.getH()); 
     out.println("" + currentTile.getWalkable()); 

     out.println("endTile"); 
     } 
     out.close(); 
     }catch(Exception e){ 
     System.exit(0); 
     } 

    } 



Any suggestions would be great 
+0

コードタグは素敵でしょう。 –

答えて

0

は、あなただけのJavaが出力ストリームにオブジェクト階層内の全高保存し、後ででそれらを読み込むことができますステージ。

See this example

+0

これを行う方法がわかりません。プリントライターではなく出力ストリームで保存するだけですか? – weichsem

+0

はい、ObjectOutputStreamクラスとObjectInputStreamクラスを使用します。私は、例とのリンクを答えに加えました。また、ここでは非常に簡単な例を使って説明を見つけることができます:http://download.oracle.com/javase/tutorial/essential/io/objectstreams.html –

+0

よく見えます、リンクありがとう! – weichsem

0

シリアル化APIをチェックアウトするか、バイトを抽出して16進数の文字列を作成するだけです。

0

BufferedImageを特定のイメージへの参照を保持するTileImageクラスにカプセル化すると、イメージ参照が保存ファイルに出力されます。そうすれば、イメージデータを何度も何度も保存する必要がなくなり、保存されたゲームで更新されたグラフィックスが利用できるようになります。

0

あなたのタイルイメージがテキスト情報とは別のものであること、または各タイルイメージが他のタイルとは別のファイルにあるという事実が気になるかどうかはわかりません。

最初の問題については、画像メタデータ(例:コメント)にテキスト日付を保存することができます。あなたのタイルはイメージファイルに過ぎません。

各タイルイメージが他のタイルとは別のファイルにあるということに心配している場合は、グリッド内のすべてのタイルイメージ(または同様のもの)からなる単一のイメージを作成できます。 。必要に応じて、標準の画像編集ソフトウェアで編集することもできる単一の画像ファイルがあります。

+0

地形エディタは現在完成していますが、地形ではありません(敵、プレイヤーなど)。私は、すべてが同じ場所(タイルの場所、スプライト、イベントトリガー、またはnpcs)で同じ場所に保存し、すべて同じ場所にある、または簡単にその情報からゲームを実行できるようにしたいできるだけ少数のソースからまとめて、完成したレベルを実行するためのコードを簡単に記述します。 – weichsem

関連する問題