Manuals
Manuals




This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English

Praca z plikami

Istnieje wiele różnych sposobów tworzenia plików i uzyskiwania do nich dostępu. Ścieżki do plików oraz sposób korzystania z nich zależą od typu pliku i jego lokalizacji.

Funkcje dostępu do plików i folderów

Defold udostępnia kilka różnych funkcji do pracy z plikami:

  • Możesz użyć standardowych funkcji io.* do odczytu i zapisu plików. Funkcje te dają bardzo precyzyjną kontrolę nad całym procesem I/O.
-- otwórz myfile.txt do zapisu w trybie binarnym
-- w razie błędu zwraca nil oraz komunikat o błędzie
local f, err = io.open("path/to/myfile.txt", "wb")
if not f then
	print("Something went wrong while opening the file", err)
	return
end

-- zapisz do pliku, wymuś zapis na dysk, a potem zamknij plik
f:write("Foobar")
f:flush()
f:close()

-- otwórz myfile.txt do odczytu w trybie binarnym
-- w razie błędu zwraca nil oraz komunikat o błędzie
local f, err = io.open("path/to/myfile.txt", "rb")
if not f then
	print("Something went wrong while opening the file", err)
	return
end

-- odczytaj cały plik jako łańcuch znaków
-- w razie błędu zwraca nil
local s = f:read("*a")
if not s then
	print("Error while reading file")
	return
end

print(s) -- Foobar
  • Możesz użyć os.rename() i os.remove() do zmieniania nazw plików i ich usuwania.

  • Możesz użyć sys.save() i sys.load() do odczytu i zapisu tabel Lua. Dodatkowe funkcje sys.* pomagają w rozwiązywaniu ścieżek do plików w sposób niezależny od platformy.

-- pobierz ścieżkę niezależną od platformy do pliku "highscore" dla aplikacji "mygame"
local path = sys.get_save_file("mygame", "highscore")

-- zapisz tabelę Lua z danymi
local ok = sys.save(path, { highscore = 100 })
if not ok then
	print("Failed to save", path)
	return
end

-- wczytaj dane
local data = sys.load(path)
print(data.highscore) -- 100

Lokalizacje plików i folderów

Lokalizacje plików i folderów można podzielić na trzy kategorie:

  • Pliki specyficzne dla aplikacji, tworzone przez twoją aplikację
  • Pliki i foldery dołączone do aplikacji
  • Pliki systemowe, do których uzyskuje dostęp twoja aplikacja

Jak zapisywać i odczytywać pliki specyficzne dla aplikacji

Podczas zapisywania i odczytywania plików specyficznych dla aplikacji, takich jak wyniki, ustawienia użytkownika i stan gry, zaleca się używanie lokalizacji dostarczonej przez system operacyjny i przeznaczonej właśnie do tego celu. Możesz użyć sys.get_save_file(), aby uzyskać bezwzględną ścieżkę do pliku zależną od systemu operacyjnego. Gdy masz już tę ścieżkę bezwzględną, możesz korzystać z funkcji sys.*, io.* i os.* (patrz wyżej).

Sprawdź przykład pokazujący, jak używać sys.save() i sys.load().

Jak uzyskiwać dostęp do plików dołączonych do aplikacji

Pliki możesz dołączać do aplikacji za pomocą zasobów pakietu i zasobów niestandardowych.

Zasoby niestandardowe

Zasoby niestandardowe są dołączane do głównego archiwum gry za pomocą pola Custom Resources w pliku game.project.

Pole Custom Resources powinno zawierać listę zasobów rozdzielonych przecinkami, które zostaną uwzględnione w głównym archiwum gry. Jeśli podasz katalogi, wszystkie pliki i katalogi w danym katalogu zostaną dołączone rekurencyjnie. Pliki możesz odczytywać za pomocą sys.load_resource().

-- Wczytaj dane poziomu do łańcucha znaków
local data, error = sys.load_resource("/assets/level_data.json")
-- Zdekoduj łańcuch JSON do tabeli Lua
if data then
  local data_table = json.decode(data)
  pprint(data_table)
else
  print(error)
end

Zasoby pakietu

Zasoby pakietu aplikacji to dodatkowe pliki i katalogi dołączane do pakietu za pomocą pola Bundle Resources w game.project.

Pole Bundle Resources powinno zawierać listę katalogów rozdzielonych przecinkami. Katalogi te muszą zawierać pliki zasobów i podkatalogi, które podczas tworzenia pakietu zostaną skopiowane bez zmian do wynikowej aplikacji. Katalogi trzeba podawać jako ścieżki bezwzględne, liczone od katalogu głównego projektu, na przykład /res. Katalog zasobów musi zawierać podkatalogi nazwane według schematu platform albo architecture-platform.

Obsługiwane platformy to ios, android, osx, win32, linux, web, switch. Dozwolony jest również podkatalog common, zawierający pliki zasobów wspólne dla wszystkich platform. Przykład:

res
├── win32
│   └── mywin32file.txt
├── common
│   └── mycommonfile.txt
└── android
    ├── myandroidfile.txt
    └── res
        └── xml
            └── filepaths.xml

Możesz użyć sys.get_application_path() do pobrania ścieżki do katalogu, w którym znajduje się aplikacja. Użyj tej bazowej ścieżki aplikacji, aby zbudować końcową ścieżkę bezwzględną do plików, do których chcesz uzyskać dostęp. Gdy już znasz bezwzględną ścieżkę do tych plików, możesz użyć funkcji io.* i os.*, aby uzyskać do nich dostęp.

local path = sys.get_application_path()
local f = io.open(path .. "/mycommonfile.txt", "rb")
local txt, err = f:read("*a")
if not txt then
	print(err)
	return
end
print(txt)

Ze względów bezpieczeństwa przeglądarki internetowe, a przez to także każdy kod JavaScript uruchamiany w przeglądarce, nie mają dostępu do plików systemowych. Operacje na plikach w kompilacjach HTML5 w silniku Defold nadal działają, ale tylko na „wirtualnym systemie plików” korzystającym z API IndexedDB w przeglądarce. Oznacza to, że nie ma sposobu na dostęp do zasobów pakietu przy użyciu funkcji io.* lub os.*. Możesz jednak uzyskać do nich dostęp za pomocą http.request().

Porównanie zasobów niestandardowych i zasobów pakietu

Cecha Zasoby niestandardowe Zasoby pakietu
Szybkość wczytywania Szybsza - pliki wczytywane z archiwum binarnego Wolniejsza - pliki wczytywane z systemu plików
Wczytywanie części plików Nie - tylko całe pliki Tak - można odczytywać dowolne bajty z pliku
Modyfikacja po zbudowaniu Nie - pliki przechowywane są w archiwum binarnym Tak - pliki są przechowywane w lokalnym systemie plików
Obsługa HTML5 Tak Tak - ale dostęp odbywa się przez HTTP, a nie przez I/O plików

Dostęp do plików systemowych

Dostęp do plików systemowych może być ograniczony przez system operacyjny ze względów bezpieczeństwa. Możesz użyć natywnego rozszerzenia extension-directories, aby uzyskać bezwzględną ścieżkę do niektórych często używanych katalogów systemowych (np. documents, resource, temp). Gdy masz już bezwzględną ścieżkę do tych plików, możesz używać funkcji io.* i os.* do uzyskiwania do nich dostępu (patrz wyżej).

Ze względów bezpieczeństwa przeglądarki internetowe, a przez to także każdy kod JavaScript uruchamiany w przeglądarce, nie mają dostępu do plików systemowych. Operacje na plikach w kompilacjach HTML5 w silniku Defold nadal działają, ale tylko na „wirtualnym systemie plików” korzystającym z API IndexedDB w przeglądarce. Oznacza to, że nie ma sposobu na dostęp do plików systemowych w kompilacjach HTML5.

Rozszerzenia

W Asset Portal znajduje się kilka zasobów, które upraszczają dostęp do plików i folderów. Na przykład:

  • Lua File System (LFS) - funkcje do pracy z katalogami, uprawnieniami do plików itp.
  • DefSave - moduł pomagający zapisywać i wczytywać konfigurację oraz dane gracza między sesjami.