Skocz do zawartości

Przenoszenie utworzonych plików manualnie


Rekomendowane odpowiedzi

Witam serdecznie. Stworzyłem fundamenty gry, w której na początku (jeśli plik z zapisanymi zmiennymi) tworzony jest plik INI. W tym pliku, zapisywany jest powiedzmy, że wygląd statku. Gracz, odpalając grę, może sobie dowolnie budować własny statek kosmiczny, po czym od razu dane statku są zapisywane w pliku INI. Po ponownym odpaleniu gry, statek jest wczytywany z tego samego pliku, jednak gdy gra zostanie na nowo zainstalowana, gracz po włączeniu gry, ma pustą siatkę zamiast gotowego statku, który powinien być czytany z gotowego pliku.

 

Moje pierwsze pytanie brzmi, jak tworzyć widoczne pliki zapisów, które będę mógł dołączać na przykład do archiwum z grą, żeby gracz już na samym początku posiadał jakiś domyślny statek odczytany z pliku?

 

Natomiast moje drugie pytanie brzmi, jak dołączać takie pliki do gry, żeby gracz nie mógł ich widzieć i na przykład usunąć, ponieważ wtedy byłby problem z pustym statkiem.

 

Pozdrawiam serdecznie i dzięki za uwagę. Liczę na jakąś zaawansowaną pomoc ;).

Odnośnik do komentarza
Udostępnij na innych stronach

Funkcje odczytywania przyjmują argument który odpowiada za defaultową wartość, jeśli żadnej innej nie odczyta. Możesz też, sprawdzać czy plik istnieje, jeśli nie to odczytać defaultowe. A tak poza tym, to include files.

Odnośnik do komentarza
Udostępnij na innych stronach

Ciekawe czy Threef ten temat widział c:

 

 

Edit: A zeby odpowiedziec:

 

Funkcje odczytywania i zapisywania plikow sa sandboxowane, tj. tylko to co w included files oraz folder APPDATA.

 

Mozesz sprawdzic czy istnieje plik "nazwa_mojego_pliku.ini" czy jak to tam nazywasz a jezeli nie ma to stworzyc tam plik o konkretnej, wbudowanej zawartosci, jako template.

Moglbys tez pojsc z opcja included files, gdzie includowany plik to bylby schemat podstawowy, ale wtedy gracz moglby oszukac edytujac ten plik i usuwajac swoj statek z APPDATA bo wtedy by stworzylo plik nowy na podstawie tego zedytowanego template'a.

 

Jak juz mowimy o "zeby uzytkownik nie mogl edytowac", to tutaj wchodzi wlasnie kwestia plikow INI: Slaby pomysl, powinienes stworzyc swoj wlasny, binarny, system pliku z zapisem, ktorego struktura jest znana tylko Tobie, aby inni nie mogli go edytowac.

Odnośnik do komentarza
Udostępnij na innych stronach

Ogółem możesz rozwiązać wszystkie problemy jednym rozwiązaniem... W grze sprawdzaj czy plik istnieje a jeżeli nie to twórz nowy z jakimiś podstawowymi wartościami. W ten sposób nie musisz się martwić o usunięcie danych i zawsze będziesz mieć jakieś które są stworzone przez ciebie.

 

Innym rozwiązaniem jest użycie Included Files, ale z tym jest dużo roboty.

 

Jeżeli chodzi o ukrycie plików na to nie poradzisz. GameMaker nie pozwoli Ci na ustawienie atrybutu Ukryty. Te pliki muszą tam być, ale nie powinno to być problemem. GameMaker zapisuje dane w Local Data o którego istnieniu mało kto wie. Poza tym takie dane powinieneś mieć w jakiś sposób zaszyfrowane.

 

Problemem może być to że używasz formatu INI który został stworzony po to aby być łatwo edytowalny przez użytkowników.

 

Ciekawe czy Threef ten temat widział c:

Jestem na "wakacjach" więc mało widzę poza kodem na monitorze.

Odnośnik do komentarza
Udostępnij na innych stronach

Chyba będę musiał użyć Included Files :/.

 

twórz nowy z jakimiś podstawowymi wartościami. W ten sposób nie musisz się martwić o usunięcie danych i zawsze będziesz mieć jakieś które są stworzone przez ciebie.

 

Tak by było najlepiej, z tym, że jeden statek jest odczytywany z 2.100 zmiennych :/, a bezpośrednio w programie raczej mało kto byłby taki cierpliwy, żeby wypisywać wartości po kolei w każdej z 2.100 zmiennych patrząc na kratkę, gdzie ma być jaki moduł statku... przerąbane, na co ja się piszę xd, ale gra świetnie śmiga na Androidzie z 4.200 obiektami, a to dodatkowo motywuje do pracy nad nią. 2.100 zmiennych jeszcze jakoś przy masie cierpliwości dałoby radę zdefiniować, ale to tylko 'szablon" jednego statku... a jeśli w grze będzie domyślnych statków przynajmniej ze 100? Zdefiniowanie 210.000 zmiennych bezpośrednio w skrypcie byłoby potężną stratą czasu, wymagałoby to nawet nie mnisiej cierpliwości... a przynajmniej cierpliwości komputera xD.

 

powinienes stworzyc swoj wlasny, binarny, system pliku z zapisem, ktorego struktura jest znana tylko Tobie, aby inni nie mogli go edytowac.

Chciałbym, ale nie mam ani zielonego ani bladego pojęcia, jak to zrobić :/.

Odnośnik do komentarza
Udostępnij na innych stronach

ediepl: Na co tobie 210000 zmiennych? Każdy pixel osobno zapisujesz?

xd, nie każdy piksel, ale jeden statek ma 2.100 możliwych modułów = 2.100 zmiennych czytanych na początku z pliku, a zakładając, że domyślnych statków w grze będzie 100, to 2.100 * 100 = 210.000 zmiennych. Wiem to wygląda naprawdę potężnie xd.

 

Sutikku: Nie wyobrażam sobie tego, 21 tysiące zmiennych? Na pewno nie da sie tego jakoś lepiej zorganizować?

210 tysięcy*. Właśnie nie bardzo da się to lepiej zorganizować, tym bardziej, że nie ogarniam do końca ds_list'ów, a korzystam z takiego [pewnie prymitywnego] patentu xd:

 

GML
lineX = 0;//obie te zmienne decydują o położeniu kolejnych wygenerowanych bloków z ich odczytanymi z pliku wartościami

lineY = 0;//wartości te to przykładowo 1,2,3,4,5, jednak w dalszej części kodu, tuż przy tworzeniu samego bloku, lineX i lineY są mnożone przez 5, żeby wszystkie bloki

//mieściły się w siatce 5x5 pikseli. Każdy sprite bloku ma wymiary 5x5 pikseli.

global.shovel = 0;//zmienna szukająca odpowiedniego ID bloku w pliku "myShip1.data"

global.nextLoad = 0;//zmienna do wyciągania wartości danego bloku z pliku "myShip1.data"

while(lineY < 55)//wczytywanie statku gracza

{

lineX = lineX + 1;//przesuwanie następnego bloku o 5 pikseli w prawo

if(lineX == 20)

{

lineX = 1;//rozpoczynanie nowej linii

lineY = lineY + 1;//przesuwanie następnego bloku o 5 pikseli w dół

}

if(lineY < 55)

{

ini_open(working_directory + "\" + "myShip1.data");//"working_directory" jakoś nic mi nie pomogło -_- w ukazaniu wygenerowanego pliku "myShip1.data"

global.nextLoad = ini_read_real("saved", string(global.shovel), 1);//odczyt po ID (global.shovel), zapisanej wartości i zapis w global.nextLoad

ini_close();

 

NOWY = instance_create(50+(lineX*5),210+(lineY*5),o_blockPlayer);//tworzenie następnego bloku. Przykładowo "lineX*5" oznacza wyrównanie do siatki (odstęp bloków o 5 pikseli)

NOWY.myVar = global.nextLoad;//zapis wartości wczytanej wcześniej do global.nextLoad dla stworzonego bloku

if(NOWY.myVar == 0)// POCZĄTEK NIEISTOTNEGO

{

NOWY.sprite_index = sp_gridShip;

}

else if(NOWY.myVar == 1)

{

NOWY.sprite_index = sp_hull1Tallium;

global.playerBlocks = global.playerBlocks + 1;

NOWY.myHP = 3;

}

else if(NOWY.myVar == 2)

{

global.playerBlocks = global.playerBlocks + 1;

NOWY.sprite_index = sp_hullTurret;

NOWY.myTurret = 1;

NOWY.myHP = 3;

with(NOWY)

{

TURRET = instance_create(x+2,y+2,o_turret1Player);

}

}//KONIEC NIEISTOTNEGO

NOWY.myID = global.shovel;

 

global.shovel = global.shovel + 1;

}

}

 

Threef: Możesz nam wytłumaczyć co Cię podkusiło do zapisywania 2100 zmiennych w pliku ini? Jak sobie to wyobrażałeś, jak przechowujesz i grupujesz dane?

To może w punktach xd.

1. Jak już wyżej pisałem, każdy statek ma 2.100 modułów (przykładowo jeśli modułu nie ma, czyli blok niczego = 0, jeśli jest = 1). ds_list'y słabo ogarniam, choć pytałem o nie na forum, to jednak wpadłem na prostszy sposób zapisu do pliku tylu zmiennych, z tym, że zwyczajnie nie widzę tego stworzonego pliku i nie mogę go na przykład załączyć do gry, żeby gracz miał gotowe statki w grze. Dodatkowo, żeby nie mógł usunąć załączonych plików domyślnych statków. Zapisywałem w plikach INI, ale eksperymentowałem też z DATA... nie wiem w sumie po co :/. Może liczyłem na to, że będą widoczne -_-

2. To myślę, że wyjaśniłem powyżej. Mogę jeszcze to jakoś streścić. Każdy blok ma swoje ID, które odczytywane jest ini_read_real("saved", TUTAJ, 1), a co do wartości każdego bloku, to zapis i odczyt tam, gdzie ta domyślna jedyneczka.

 

Myślałem też nad tym, żeby na przykład zapisać wszystkie 100 statków w jednym pliku, na przykład tak:

ini_write_real("statek1", string(myID), myVar);

ini_write_real("statek2", string(myID), myVar);

ini_write_real("statek3", string(myID), myVar); itd.

 

Nie wiem tylko, jak szybko (i czy w ogóle) by się to wczytywało xD, bo 210.000 wartości to chyba trochę za dużo, ale sam nie wiem, bo jeszcze tak nie eksperymentowałem ;).

Odnośnik do komentarza
Udostępnij na innych stronach

Chcę od razu zauważyć że nie potrzebnie w pętli ponad 1000 razy otwierasz i zamykasz plik. Wystarczy że zrobisz to raz.

 

W tym momencie masz listę zawierającą pewnie tonę nie potrzebnych informacji. Jedynym sensownym sposobem było by tu zapamiętywanie tylko i wyłącznie tych które mają wartość nie równą 0.

 

Nie mogę niestety teraz napisać jak powinno być to rozwiązane bo nie ma mnie przy komputerze. Może zanim wrócę to ktoś już poda jakieś rozwiązanie które nie będzie wymagało składania ofiar z dysku twardego.

Odnośnik do komentarza
Udostępnij na innych stronach

Tak wiem, ale wcześniej ten skrypt wyglądał tak:

 

GML
lineX = 0;

lineY = 0;

 

 

global.shovel = 0;

global.nextLoad = 0;

 

while(lineY < 55)

{

ini_open(working_directory + "\" + "myShip1.data");/////////////////////////////////////////////////////////////////////////////////////////////////////////

lineX = lineX + 1;

 

if(lineX == 20)

{

lineX = 1;

lineY = lineY + 1;

}

if(lineY < 55)

{

global.nextLoad = ini_read_real("saved", string(global.shovel), 1);/////////////////////////////////////////////////////////////////////////////////////////////////////////

NOWY = instance_create(50+(lineX*5),210+(lineY*5),o_blockPlayer);

NOWY.myVar = global.nextLoad;

if(NOWY.myVar == 0)

{

NOWY.sprite_index = sp_gridShip;

}

else if(NOWY.myVar == 1)

{

NOWY.sprite_index = sp_hull1Tallium;

global.playerBlocks = global.playerBlocks + 1;

NOWY.myHP = 3;

}

else if(NOWY.myVar == 2)

{

global.playerBlocks = global.playerBlocks + 1;

NOWY.sprite_index = sp_hullTurret;

NOWY.myTurret = 1;

NOWY.myHP = 3;

with(NOWY)

{

TURRET = instance_create(x+2,y+2,o_turret1Player);

}

}

 

NOWY.myID = global.shovel;

 

global.shovel = global.shovel + 1;

}

ini_close();/////////////////////////////////////////////////////////////////////////////////////////////////////////

}

 

, i prędkość wczytywania zmiennych była taka sama. Jestem świadomy tego, że z takim kodem, program otwiera i zamyka plik tylko 54 razy xD, ale otwieranie i zamykanie musi być w tej całej pętli, bo pod tym całym kodem jest podobna pętla dla statku wroga. Będę musiał prawdopodobnie użyć var'a w pętli :).

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