Serializacja, zapisanie stanu "gry"

0

Witam!
Javy uczę się od kilku dni, więc postanowiłem że napiszę sobie krótką grę, najpierw zacząłem od stworzenia konsoli za pomocą java swing, dodałem tam m.in menu, w którym jest opcja zapisu i odczytu stanu gry.
Sam kod zapisu i odczytu wygląda tak:

import java.awt.Color;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Postać implements Serializable {
	private static final long serialVersionUID = 1L;
	
	String imię;
	int Życie;
	int Exp;


    	public void _saveGame(){
    		Postać saveMe = new Postać();
    	    try {
    	    	ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d://saveGame.dat"));
    	        oos.writeObject(saveMe);
    	        oos.flush();
    	        oos.close();
    	        
    	    } catch (IOException ex) {
    	        ex.printStackTrace();
    	    }
    	}
    	
    	public void _loadGame(){
    		Panel_Okien okno = new Panel_Okien();
    		Postać loadMe;
    	      try
    	      {
    	    	  FileInputStream fileIn = new FileInputStream("d://saveGame.dat");
    	          ObjectInputStream in = new ObjectInputStream(fileIn);
    	            loadMe = (Postać)in.readObject();
    	            in.close();
    	      }catch(IOException i)
    	      {
    	         i.printStackTrace();
    	         return;
    	      }catch(ClassNotFoundException c)
    	      {
    	         System.out.println("Nie odnaleziono klasy");
    	         c.printStackTrace();
    	         return;
    	      }
    	      System.out.print(loadMe.imię); // tutaj po wpisaniu w konsoli imienia "Łukasz", zapisania za pomocą _saveGame() oraz wczytania zwraca wartość null
    	}
    }

Konsola jest prosta, kiedy stworzę do niej jakiś przykładowy kod, np. do wczytywania imienia, to będzie można je normalnie wyświetlić, ale kiedy próbuję je zapisać powyższym kodem, to zwraca wartość null.

public void WPROWADZENIE() {
    		okno.setTitle("Gra");
    		okno.setVisible(true);
    		okno.println("Twoje imię to: "+imię, false,Color.GRAY);
    		okno.println("Coś tam", false, Color.GREEN);
    		boolean prawda = true;
    		while(prawda){
    			String text = okno.WCZYTAJ_KOMENDE(true);
    			if(text.equals("dalej")){
    				prawda = false;
    			}
    		}
    		dalej();

    	}
    	
    	public void dalej(){
    		okno.println("Podaj swoje imię: ", false);
    		imię = okno.WCZYTAJ_KOMENDE(true);
    		okno.print("Twoje imię to: ", false);
    		okno.println(imię, false,Color.RED);
    		WPROWADZENIE();
    	}

Próbuję to zrobić od wczoraj, ale dalej nie chce mi odczytać..
Jako że się uczę i pierwszy raz napotkałem problem, to wszelkie zwracanie uwagi na błędy będzie mile widziane.

1
 public void _saveGame(){
            Postać saveMe = new Postać();
            try {
                ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d://saveGame.dat"));
                oos.writeObject(saveMe);

Wyglada na to, ze serializujesz pusty, dopiero co stworzony obiekt.

Ponadto:

  1. nazywaj zmienne po angielsku
  2. poczytaj o konwencjach nazewniczych dla klas, metod, zmiennych
  3. podziel wszystko na klasy i poczytaj o Single Resposibility Principle (moglbys tez wydzielic kod serializujacy do osobnej klasy).
0

Próbowałem chyba wszystkiego, co mi do głowy przyszło i dalej nic.. Teraz wyszło mi tak, że niby kiedy wcisnę przycisk Wczytaj, to na konsoli wczytuje, ale wczytuje tylko aktualny stan zmiennej imię, a nie stan z pliku.

Tutaj jest cały kod konsoli:

https://github.com/dragonfox9/ConsoleTestGame

Wiem, że kod trochę chaotyczny, miałem go poprawić jak tylko uda mi się zrobić zapis / odczyt, ale no niestety..
Chcę wiedzieć, co w tym wszystkim jest źle, żeby w przyszłości się z tym nie męczyć

1

Za kazdym razem gdy robisz new Postac() to masz nowy obiekt - musisz gdzies miec referencje do Twojej postaci zamiast zawsze tworzyc nowy obiekt (tracisz stan tej postaci jesli zawsze tworzysz nowy obiekt).
Gdy juz bedziesz miec taka referencje to przy zapisywaniu bedziesz odwolywac sie do tej referencji zamiast new Postac(); a przy wczytywaniu bedziesz mogl wczytac obiekt i podmienic ta referencje.

1

Masz przykladowy kod gdzie wszystko dziala:

import java.io.Serializable;

public class Character implements Serializable {
    private static final long serialVersionUID = 7235124371208283705L;

    private String name;
    private int level;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }

    @Override
    public String toString() {
        return "name: " + name + ", level: " + level;
    }
}
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.OutputStream;

public class Main {

    private static final String FILE_FOLDER = "C:" + File.separatorChar + "test";
    private static final String FILE_NAME = "character.data";
    private static final String FILE_PATH = FILE_FOLDER + File.separatorChar + FILE_NAME;

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Character myCharacter = new Character();
        myCharacter.setName("Bob");
        myCharacter.setLevel(99);

        System.out.println("My character description: " + myCharacter);

        saveCharacter(myCharacter);

        Character loadedCharacter = loadCharacter();

        System.out.println("My loaded character description: " + loadedCharacter);

    }

    private static void saveCharacter(Character myCharacter) throws IOException {
        File folder = new File(FILE_FOLDER);
        folder.mkdirs();
        File file = new File(FILE_PATH);
        try (OutputStream outputStream = new FileOutputStream(file); ObjectOutput output = new ObjectOutputStream(outputStream)) {
            output.writeObject(myCharacter);
        }
    }

    private static Character loadCharacter() throws IOException, ClassNotFoundException {
        try (InputStream file = new FileInputStream(FILE_PATH); ObjectInput input = new ObjectInputStream(file);) {
            return (Character) input.readObject();
        }
    }

}
0

Dzięki wielkie, popatrzę sobie na to wszystko i postaram się poprawić mój kod. :)

Udało mi się zrobić dzięki tobie Swr wszystko tak jak chciałem! ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1