Skocz do zawartości
nowy_user

Zapis pliku z wcześniej stworzonej ścieżki

Rekomendowane odpowiedzi

Panowie, ostatnio GM daje mi się we znaki ( jak to zwykle bywa, tuż przed publikacją produktu, i gdy już skupiałem się na marketingu, nagle zaczęły wyskakiwać mi dziwne bugi ). Niestety, na wskutek tych bugów prawdopodobnie muszę zrezygnować z systemu zapisu danych w chmurze i próbuję robić zapis off-line. Dziś napotkałem na bardzo dziwny bug i nie wiem już, czy to przez nerwy czy raczej GM zachowuje się dziwnie w prostej sytuacji. Proszę o pomoc.

 

Wszystko jest ok gdy próbuję zapisać sobie plik za pomocą kodu:

 

{     

    var _path, _file;

    _path = get_save_filename("project|*.txt", "");
    
    if (_path != "") {
    _file = file_text_open_write(_path);
    file_text_write_string(_file, string(_savedane));
    file_text_close(_file);
   }
}

Pojawia się okno dialogowe, ja mogę sobie wybrać lokalizację pliku i zapisać go gdzie chcę.

 

Problem pojawia się, gdy chcę zrobić sobie autosave projektu wybranego wcześniej też za pomocą okna dialogowego. Przy wgrywaniu pliku mam kod:

 


 
   var _path, _file, _savedane;
        _savedane='';
        _path = get_open_filename("project|*.txt", "");
        if (_path != "") {
        _file = file_text_open_read(_path);
        _savedane=file_text_read_string(_file);
        
        file_text_close(_file);
        global.cloudoff_load_result  = _savedane
        global.cloudoff_file_path=_path;
        room_goto_next();
        }

Jak widzimy, ten kod zapisuje sobie w zmiennej globalnej  global.cloudoff_file_path ścieżkę wybranego przez nas pliku. Jest ona prechowywana, po to, aby właśnie potem, przy autosavie nie otwierać okna dialogowego, tylko aby plik zapisywał się właśnie automatycznie. Używam do tego kodu:

 

{     

    var _path, _file;

    _path = global.cloudoff_file_path
    if (_path != "") {
    _file = file_text_open_write(_path);
    file_text_write_string(_file, string(_savedane));
    file_text_close(_file);
   }
}

Jak widać ten kod jest łudząco podobny do tego, który przedstawiłem na początku, różnica jest taka że zamiast  _path = get_save_filename("project|*.txt", "");   mamy  _path = global.cloudoff_file_path   .  Pomimo, że w obu przypadkach _path zwraca nam tę samą ścieżkę ( sprawdzałem za pomocą show_debug_message), to w pierwszym przypadku - z oknem dialogowym - plik zapisuje się bezproblemowo, a w drugim wysakuje błąd w oknie compile form : Error! not allowing save with filename Error! not allowing save with filename 'C:\Users\Dawid\Desktop\pulpit\Base_Project_New.txt'.Error! not allowing save with filename ''.   ( tu na końcu jest kropka i strzałka w górę narysowana).

 

Czy ktoś ma pomysł , dlaczego tak się dzieje?

Z góry dzięki za pomoc

 

nowy_zdesperowany_user

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Za dokumentacją, open daje tylko prawo odczytu.

 

Cytuj

get_open_filename

An important thing to note when using this function is that it grants you certain permissions for that file, for the duration of your game. So, once you get the file path from the user, you can access it again and again without having to ask. However, since this function is for reading a file, the permissions granted are only for reading and saving will not be permitted by the OS. Should you need to read and write to the file, you can get permission using the function get_save_filename.

 

 

W obu przypadkach musisz zatem użyć get_save_filename.

 

Ale przyznam, ze przez 20 minut uważałem, że Twoj kod jest dobry i dopiero teraz się dowiedziałem tego co powyżej.

  • Lubię (+1) 1

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Dzięki, teraz jest to jasne :)

 

EDIT....

Przy okazji, wiesz może @gnysek czy mogę dostać jakoś informację zwrotną od GMa, gdy zapis do pliku tekstowego zostanie już wykonany? Wiem , że istnieje funkcja file_exists ale jeśli nadpisuję plik, który już istnieje, to formuła if file_exists tu nie zadziała... Pytam, ponieważ chciałem ustawić zapis gry przy wyłączeniu, i dotychczas ustawiałem alarm na chybił trafił np.2 sekundy po odpaleniu kodu do zapisu gry , gra się wyłączałą. Tylko co, jeśli plik będzie na tyle duży albo komputer będzie zajęty jakimiś innymi procesami w tle, i zapis zabierze mu więcej niż te 2 sekundy? Wówczas gra się zamknie, a plik nie zdąży zostać zapisany. 

 

Niestety w GMie nie ma żadnej funkcji typu if file_save_is_done  albo coś w tym stylu... może da się to jakoś sprytnie obejść?

 

Pozdrawiam

  • Super (+1) 1

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
54 minuty temu, nowy_user napisał:

czy mogę dostać jakoś informację zwrotną od GMa, gdy zapis do pliku tekstowego zostanie już wykonany?

A czy zapis/odczyt pliku nie jest przypadkiem synchroniczny?

 

BTW. Często też widziałem metodę, która chroniła stary zapis gry tworząc plik tymczasowy na czas zapisu i dopiero po wykonaniu zapisu usuwał stary plik i podmieniał nazwy.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Zdaje mi się, że kod/klatka się zatrzymuje na czas zapisu. Więc nie musisz nic czekać.

Możesz też tak jak wyżej - przypominam, że ostatni GM nie wymaga już sandboxa (jak się go wyłączy - nie testowałem), więc wtedy kod mógłby sam wczytać backup jakby coś poszło źle.

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ę.

×