Skocz do zawartości

Save i load game do pliku - GM:S


Cygnus

Rekomendowane odpowiedzi

Dzień dobry wszystkim mam taki problem otóż stworzyłem sobie w menu gry z load game i teraz w grze załóżmy jestem w drugim świecie nachodzę na dany jakiś obiekt i zapisuje sobie gre,i teraz jak wyjdę z gry i po naciśnięciu load game,żeby to to sczytał,że skończyłem na tym drugim etapie.

Jak to zrobić? domyślam się,że muszę obiekt utworzyć.

Posiadam Game Maker Studio

Odnośnik do komentarza
Udostępnij na innych stronach

Zobacz w dokumentacji funkcje game_save() i game_load() są uniwersalne i to oznacza że rzadko będą działać tak jak chcesz. Jeżeli potrzebujesz czegoś więcej to musisz się zainteresować obsługą plików i jakoś zaplanować swój "stan gry".

Odnośnik do komentarza
Udostępnij na innych stronach

Zobacz w dokumentacji funkcje game_save() i game_load() są uniwersalne i to oznacza że rzadko będą działać tak jak chcesz. Jeżeli potrzebujesz czegoś więcej to musisz się zainteresować obsługą plików i jakoś zaplanować swój "stan gry".

 

MI chodzi głównie o zapis gry podobny do tego co jest w TOP HAT czyli nachodzę na dany element na planszy,i następuje zapis..potem wychodzę z gry do głównego menu klikam na load game i zaczynam od tego właśnie momentu,co zapisałem dokładnie o takie coś mi chodzi..

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

zrob sobie ten obiekt ktory bedzie zapisywal gre jak na niego wejdziesz

 

daj mu w create

GML
checked = false;

 

i w evencie kolizji z bohaterem daj

GML
if( !checked )

{

checked = true;

game_save();

}

 

 

a w obiekcie, który tworzy się pierwszy w grze (albo pod przyciskiem Load Game w menu) daj:

GML
game_load()

 

podstawowe strasznie ale powinno działać chyba

 

Odnośnik do komentarza
Udostępnij na innych stronach

zrob sobie ten obiekt ktory bedzie zapisywal gre jak na niego wejdziesz

 

daj mu w create

GMLchecked = false;

 

i w evencie kolizji z bohaterem daj

GMLif( !checked )

{

checked = true;

game_save();

}

 

 

a w obiekcie, który tworzy się pierwszy w grze (albo pod przyciskiem Load Game w menu) daj:

GMLgame_load()

 

podstawowe strasznie ale powinno działać chyba

 

Dzię ANtY działa;) kurcze jak nic na żywo masz flaszke ode mnie za pomoc;)

Widzę,że też piszesz gry,ja jestem grafikiem 2D i 3D oraz pracuje przy sieciach ,a kolega ogarnia programowanie,tyle,że teraz nie ma jak,bo wyjechał,i sporo mi roboty zostało.

Odnośnik do komentarza
Udostępnij na innych stronach

zrob sobie ten obiekt ktory bedzie zapisywal gre jak na niego wejdziesz

 

daj mu w create

GMLchecked = false;

 

i w evencie kolizji z bohaterem daj

GMLif( !checked )

{

checked = true;

game_save();

}

 

 

a w obiekcie, który tworzy się pierwszy w grze (albo pod przyciskiem Load Game w menu) daj:

GMLgame_load()

 

podstawowe strasznie ale powinno działać chyba

 

ANtY zrobiłem sobie obj_savegame

 

a w nim dałem ten kod:

 

w Create

 

GML
[/gml]

checked = false;

[gml]

 

w evencie kolizji dałem ten kod co napisałeś

GML
[/gml]

 

if( !checked )

{

checked = true;

game_save();

}

[gml]

 

no i tu w linijce przy game_save(); mam podświetlone na czerwono,że jest błąd

próbowałem zarówno w evencie kolizji u bohatera jak i w evencie kolizji w tym obiekcie nowym czyli obj_savegame no i nadal ten błąd w linijce savegame();

 

 

natomiast w obj_load_game ( to objekt gdzie mam przycisk load game w menu)

dałem w

Create w kodzie

 

GML
[/gml]

game_load()

[gml]

 

to też podświetla się na czerwono game_load() może średnik powinien być no nie wiem na końcu nawiasu

ja ogólnie w tym obiekcie obj_load_game mam tak:

 

STEP - execute script

GML
[/gml]

scr_mouse_hover

[gml]

 

Bo mam sterowanie myszką menu takie zrobiłem.

 

 

 

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

true, my bad, tak jak threef mówi trzeba podać nazwę pliku do jakiego chcemy sejwować, i jaki chcemy wczytywać w nawiasie

Odnośnik do komentarza
Udostępnij na innych stronach

true, my bad, tak jak threef mówi trzeba podać nazwę pliku do jakiego chcemy sejwować, i jaki chcemy wczytywać w nawiasie

 

ANtY tak też zrobiłem jak ten kolega napisał fakt teraz nie ma błędów,ale też to nic nie daje nachodzę bohaterem na ten obiekt save i nic nie zapisuje...zupełnie nic..

 

 

w Create w moim stworzonym obiekcie

GML

checked = false;

 

 

 

tu w evencie bohatera lub w evencie tego nowego obiektu co stworzyłem

GML
if( !checked )

{

checked = true;

game_save("Save.dat");

}

 

 

natomiast w obj_load_game ( to objekt gdzie mam przycisk load game w menu)

dałem w

Create w kodzie

 

STEP - execute script

 

GML
scr_mouse_hover

 

 

i niżej to w osobnym pliku w kodzie

 

 

GML
game_load("Save.dat")
Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

a tworzy się ten plik "save.dat"?

 

spróbuj zrobić np. "C:\save.dat" przy zapisywaniu i po wejsciu na ten checkpoint zobacz czy na dysku C stworzył ci się plik

 

na pewno dałeś ten kod "if[...]" w evencie kolizji z bohaterem w objekcie checkpointa?

 

 

daj w draw tego obiektu checkpointa

 

GML
draw_self();

draw_set_color( c_white );

draw_text(x,y-20,checked);

 

i zobacz, czy się zmieni cyferka nad tym obiektem jak na niego wejdziesz bohaterem, jak nie to znaczy, że nie wykrywa kolizji / ngdy do niej nie dochodzi

Odnośnik do komentarza
Udostępnij na innych stronach

spróbuj zrobić np. "C:\save.dat" przy zapisywaniu i po wejsciu na ten checkpoint zobacz czy na dysku C stworzył ci się plik
Sandbox. GM:S nie pozwala zapisywać gdzie się chce. Pliki można odczytywać tylko z folderu gry oraz folderu danych gry (appdata), a zapisywać tylko w tym drugim.

 

Twój plik będzie w: C:\Users\Nazwa Użytkownika\AppData\Local\Nazwa_twojej_gry

 

Być może twój save nie działa bo, tak jak pisałem wcześniej, GM:S stara się aby był uniwersalny. Po prostu nie działa w twoim wypadku. Może coś kombinujesz z obiektami, a może save się wczytuje ale ty zaraz potem coś psujesz?

Najpierw sprawdź czy plik się tworzy. Jeżeli nie to próbuj aż będzie się tworzyć. Jeżeli się tworzy a dalej nie działa to musisz pomyśleć o innym sposobie zapisywania. Zrób wtedy wielką listę co musi twój save pamiętać czyli room na którym byłeś, pozycja x i y gracza, liczba złota, HP, zabici przeciwnicy, etc. Potem po prostu będziesz musiał to wszystko zapisywać i wczytywać z pliku ręcznie.

Odnośnik do komentarza
Udostępnij na innych stronach

No dobra teraz się tworzy plik sprawdziłem ścieżkę dostępu,a i licznik z 0 wskoczył na 1 czyli zapisuje pod nazwą jak sprawdzałem save.dat ok,ale teraz kwestia mojego przycisku w menu load game może ja źle kod wpisuje bo mam dokładnie tak w tym przycisku load game w kodzie:

 

 

STEP i w akcji mam:

 

GML
scr_mouse_hover

 

o tak mam,i potem dodałem nowy kod i w nim wpisałem

 

GML
game_load("Save.dat")

 

no i wywala błąd jak próbuje nacisnąć na ten load game przycisk

Odnośnik do komentarza
Udostępnij na innych stronach

o taki błąd mi wywala po naciśnięciu load game,albo jak próbuje do głównego menu wejść jak dałem w przycisku load game ten kod

GML
game_load("Save.dat")

 

to mi taki błąd wyskakuje

 

GML
ERROR in

action number 1

of Step Event1

for object obj_ice:

 

Data structure with index does not exist.

at gml_Object_obj_ice_StepBeginEvent_1 (line 9) - for (i=0;i<ds_list_size(onMeList);i++) {

 

rozumiem,że się odwołuje bład do tego obiektu ice mam stworzony obiekt ,który jest lodem i bohater się po nim ślizga.

 

tu kod tego obiektu obj_ice:

 

Begin STEP

 

GML
///ruch

while place_meeting(x,y-1,par_entity) {

with instance_place(x,y-1,par_entity) {

ds_list_add(other.onMeList,id);

y -= 9999;

}

}

 

for (i=0;i<ds_list_size(onMeList);i++) {

with ds_list_find_value(onMeList,i) {

y += 9999;

 

multiF *= other.multiF;

}

}

 

ds_list_clear(onMeList);

 

Nie mam pojęcia,dlaczego to powoduje jakis konflikt z funkcją load game

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

weź wywal cały kod z tego przycisku

 

i daj w stepie:

 

GML
w = sprite_get_width( sprite_index );

h = sprite_get_height( sprite_index );

xx = device_mouse_x(0);

yy = device_mouse_y(0);

 

if( device_mouse_check_button_pressed( 0,mb_left ) and xx > x-w/2 and xx < x+w/2 and yy > y-h/2 and yy < y+h/2 )

{

 

game_load( "Save.dat" );

 

}

Odnośnik do komentarza
Udostępnij na innych stronach

weź wywal cały kod z tego przycisku

 

i daj w stepie:

 

GMLw = sprite_get_width( sprite_index );

h = sprite_get_height( sprite_index );

xx = device_mouse_x(0);

yy = device_mouse_y(0);

 

if( device_mouse_check_button_pressed( 0,mb_left ) and xx > x-w/2 and xx < x+w/2 and yy > y-h/2 and yy < y+h/2 )

{

 

game_load( "Save.dat" );

 

}

 

 

 

No to jak wszystko wywaliłem w momencie klikniecia lewym przyciskiem myszki na load game mam taki błąd:

 

zrobiłem tak jak napisałem wywaliłem wszystko cały kod z tego obiektu przycisku i w stepie dałem ten kod,no i bład o taki jest:

 

GML
ERROR in

action number 1

of Step Event0

for object object164:

 

Data structure with index does not exist.

at gml_Object_object164_StepNormalEvent_1 (line 58) - for (i=0;i<ds_list_size(notOnMeList);i++) {

 

 

 

pod tym obiektem mam ruchomą poruszającą się platformę kurcze że te z problem z tym save game jest.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

gdybym konkretniej wiedział jak to wygląda to bym mógł pomóc, a tak to nie wiem co to za obiekt, nie wiem jakie obiekty masz w tym roomie, itp.

Odnośnik do komentarza
Udostępnij na innych stronach

Rozwiązanie tego jednego problemu jest banalnie proste. ANtY ić stont.

 

Po wczytaniu gry wszystko próbuje wrócić do normy. Ale są dane które nie zostają przywrócone, w tym wypadku jest to lista.

Wystarczy że linijkę przed tym gdzie pojawia się błąd (masz opisane w komunikacie błędu) wstawisz:

GML
if(!ds_exist(onMeList,ds_type_list))

{onMeList=ds_list_create()}

Jest to proste sprawdzenie czy lista istnieje i w razie czego stworzenie jej od nowa.

 

Niestety wróżę że zaraz po poprawieniu tego jednego błędu pojawi się inny. Tak już jest jak robi się zlepki kodu.

Odnośnik do komentarza
Udostępnij na innych stronach

Rozwiązanie tego jednego problemu jest banalnie proste. ANtY ić stont.

 

Po wczytaniu gry wszystko próbuje wrócić do normy. Ale są dane które nie zostają przywrócone, w tym wypadku jest to lista.

Wystarczy że linijkę przed tym gdzie pojawia się błąd (masz opisane w komunikacie błędu) wstawisz:

GMLif(!ds_exist(onMeList,ds_type_list))

{onMeList=ds_list_create()}Jest to proste sprawdzenie czy lista istnieje i w razie czego stworzenie jej od nowa.

 

Niestety wróżę że zaraz po poprawieniu tego jednego błędu pojawi się inny. Tak już jest jak robi się zlepki kodu.

 

Powinno zadziałać Threefie...jutro zobacze dzięki;) jak co,to bede pisał;) ale myśle ,że ifem zadziała;)

Odnośnik do komentarza
Udostępnij na innych stronach

Threef no dobra a jest możliwość takiego zapisu gry,żeby nie musiał każdy obiekt wczytywać jego poprzedni stan głównie chodzi o to,żeby było wczytywane miejsce ostatniego stanu gry czyli byłem w 3 świecie i od tego zaczynam jeśli kliknę na load game ,nie muszą się wczytywać wrogowie,np zabiłem ich w tym świecie,ale nie muszą być zabici po wczytaniu stanu gry.Najważniejsze,to żeby wczytywał ilość żyć całą energie i świat w którym ostatnio wykonałem zapis gry.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

jest możliwość, zobacz operacje na plikach ini http://docs.yoyogames.com/source/dadiospic...iles/index.html (ini_open, close, write i read)

 

zapisujesz sobie do pliku tylko zmienną, na którym poziomie jesteś, przy wczytywaniu wczytujesz te zmienną i ten poziom odpalasz

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 tygodnie później...

Tak jak Treef dobrze powiedział problem jest z onMeList = ds_list_create(); część moich obiektów korzysta z tego,no i w momencie odczytu pliku save.dat dzieją się takie rzeczy.

Oczywiście dałem tą linijkę w kodzie w tym obiekcie co powodował problem a dokładnie tak to wpisałem:

 

w Stepie obiektu,który sprawia problem czyli obj_lód

 

GML
while place_meeting(x,y-1,par_entity) {

with instance_place(x,y-1,par_entity) {

ds_list_add(other.onMeList,id);

y -= 9999;

}

}

if(!ds_exist(onMeList,ds_type_list)) //dopisana linijka

{onMeList=ds_list_create()} // dopisana linijka

for (i=0;i<ds_list_size(onMeList);i++) {

with ds_list_find_value(onMeList,i) {

y += 9999;

 

multiF *= other.multiF;

}

}

 

ds_list_clear(onMeList);

 

Jak to wpisałem,to teraz się wywala błąd od razu przy kompilacji.

Odnośnik do komentarza
Udostępnij na innych stronach

Przydałby się komunikat błędu następnym razem. ;) Na szczęście dobrze wiem w czym jest problem. Nie zdefiniowałeś nigdzie tej zmiennej. W create daj:

GML
onMeList=ds_list_create()
To jest mądre rozwiązanie w tej sytuacji. Ale uniwersalnie możesz robić:
GML
onMeList=-1
Odnośnik do komentarza
Udostępnij na innych stronach

No właśnie w obiekcie lód mam już to;)

zobacz;)

 

obj_lód

 

CREATE

GML
///Setup

onMeList = ds_list_create();

multiF = .2;

 

 

DESTROY

GML
ds_list_destroy(onMeList);

 

 

BEGIN STEP

 

GML
///Move

while place_meeting(x,y-1,par_entity) {

with instance_place(x,y-1,par_entity) {

ds_list_add(other.onMeList,id);

y -= 9999;

}

}

 

for (i=0;i<ds_list_size(onMeList);i++) {

with ds_list_find_value(onMeList,i) {

y += 9999;

 

multiF *= other.multiF;

}

}

 

ds_list_clear(onMeList);

 

 

 

Tak Treefie dokładnie mam;) w tym moim problematycznym obiekcie lodu,który sprawia problem,przy odczytu gry.

 

obj_savegame kod jest taki:

 

CREATE

 

GML
checked = false;

list = ds_list_create();

 

 

EVENT kolizja z obj_playerem

 

GML
if( !checked )

{

checked = true;

game_save("Save.dat");

}

 

 

DRAW

 

GML
draw_self();

draw_set_color( c_white );

draw_text(x,y-20,checked);

 

 

 

Co jest ciekawe gra zapisuje się do save.dat i nawet jak wyjdę do głownego menu i nacisnę na load to odczytuje zapis gry,ale jak wyjdę całkowicie z gry i włączę ją na nowo,no to wywala błąd z obj_lód że jest z listą coś problem...

Odnośnik do komentarza
Udostępnij na innych stronach

Threefie o to treść tego błędu

 

 

GML
ERROR in

action number 1

of Step Event1

for object obj_ice:

 

Data structure with index does not exist.

at gml_Object_obj_ice_StepBeginEvent_1 (line 9) - for (i=0;i<ds_list_size(onMeList);i++) {

Odnośnik do komentarza
Udostępnij na innych stronach

No dobra, więc zmieńmy ten cały twój event:

GML
if(ds_exist(onMeList,ds_type_list))

{

while place_meeting(x,y-1,par_entity) {

with instance_place(x,y-1,par_entity) {

ds_list_add(other.onMeList,id);

y -= 9999;

}

}

 

for (i=0;i<ds_list_size(onMeList);i++) {

with ds_list_find_value(onMeList,i) {

y += 9999;

 

multiF *= other.multiF;

}

}

 

ds_list_clear(onMeList);

}

 

 

Jestem po kilku piwach więc w razie jakbym palnął jakąś głupotę to liczę że ktoś mnie poprawi i nie będzie miał mi to za złe.

Odnośnik do komentarza
Udostępnij na innych stronach

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

Jedynie 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ę poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...