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
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.
Defold udostępnia kilka różnych funkcji do pracy z plikami:
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 można podzielić na trzy kategorie:
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().
Pliki możesz dołączać do aplikacji za pomocą zasobów pakietu i zasobów niestandardowych.
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 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().
| 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 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.
W Asset Portal znajduje się kilka zasobów, które upraszczają dostęp do plików i folderów. Na przykład: