Skocz do zawartości

Rekomendowane odpowiedzi

///event naciśnięcia S (zapis)

if keyboard_check(vk_control) and not saveload {
    saveload = true;
    
    // poproś o plik
    filename = get_save_filename("project file|*.ini", filename);
    if filename == "" {
        show_message_async("Saving canceled.");
        saveload = false;
        exit;
    }

    // usuń stare dane
    savefile = ini_open(filename);
    sectionNum = 0;
    while ini_section_exists(sectionNum) {
        ini_section_delete(sectionNum);
        sectionNum++;
    }
    ini_close();
    
    // zapisz nowe dane
    sectionNum = 0;
    with obj_gate {
        savefile = ini_open(other.filename);
        ini_write_real(other.sectionNum, "x", x);
        ini_write_real(other.sectionNum, "y", y);
        ini_write_real(other.sectionNum, "o", output);
        ini_write_real(other.sectionNum, "d", dualInput);
        ini_write_real(other.sectionNum, "a", inputA);
        ini_write_real(other.sectionNum, "b", inputB);
        ini_write_real(other.sectionNum, "s", sprite_index);
        ini_write_real(other.sectionNum, "i", id);
        ini_write_real(other.sectionNum, "t", type);
        ini_close();
        other.sectionNum++;
    }
    
    show_message_async("Project saved.");
    saveload = false;
}
///event naciśnięcia L(odczyt)

if keyboard_check(vk_control) and not saveload {
    saveload = true;
    
    // poproś o plik
    filename = get_open_filename("project file|*.ini", filename);
    if filename == "" {
        show_message_async("Loading canceled.");
        saveload = false;
        exit;
    }
    
    // wyczyść room
    with obj_gate instance_destroy();
    
    //wczytaj dane
    ini_open(filename);
    sectionNum = 0;
    while ini_section_exists(sectionNum) {
        var loadGate = instance_create(0, 0, obj_gate);
        loadGate.x = ini_read_real(sectionNum, "x", -1);
        loadGate.y = ini_read_real(sectionNum, "y", -1);
        loadGate.output = ini_read_real(sectionNum, "o", -1);
        loadGate.inputA = ini_read_real(sectionNum, "a", -1);
        loadGate.inputB = ini_read_real(sectionNum, "b", -1);
        loadGate.sprite_index = ini_read_real(sectionNum, "s", -1);
        loadGate.oldId = ini_read_real(sectionNum , "i", -1);
        loadGate.dualInput = ini_read_real(sectionNum, "d", -1);
        loadGate.type = ini_read_real(sectionNum, "t", -1);
        
        sectionNum++;
    }
    ini_close();
    
    // skonfiguruj bramki (zmienna id jest tylko do odczytu, dlatego taki workaround)
    with obj_gate {
        with obj_gate {
            if oldId == other.inputA {
                other.inputA = self;
            } else if oldId == other.inputB {
                other.inputB = self;
            }
        }
    }
    
    show_message_async("Project loaded.");
    saveload = false;
}

Zapisuję dane o wszystkich instancjach obiektu obj_gate do pliku ini, a potem je wczytuję. Wszystko działa poprawnie, oprócz pierwszego odczytu od uruchomienia gry. Zgadzają się pozycje bramek, ale zmienne inputA i inputB wariują. Kilkakrotne wczytanie od nowa rozwiązuje problem. Jeśli w roomie przed wczytaniem ustawię więcej bramek niż jest zapisanych w pliku, błąd nie wysętpuje.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Próbowałeś w osobnym projekcie jakoś zminimalizować ten kod, zeby znaleźć problem? Strasznie jest długi, ale na pierwszy rzut oka wyglada ok.

 

Ja tylko dodam od siebie, że czasem miałem problem z zapisem liczb i generalnie używałem ini_write_string zamiast ini_write_real bo dawało to lepsze efekty ;)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się tutaj.

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×