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
Dosya oluşturmanın ve/veya dosyalara erişmenin birçok farklı yolu vardır. Dosya yolları ve dosyalara erişme yöntemleri, dosyanın türüne ve konumuna göre değişir.
Defold, dosyalarla çalışmak için çeşitli işlevler sunar:
io.* işlevlerini kullanabilirsiniz. Bu işlevler, giriş/çıkış (I/O) sürecinin tamamı üzerinde çok ayrıntılı denetim sağlar.-- open myfile.txt for writing in binary mode
-- returns nil plus error message on failure
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
-- write to the file, flush it to disk and then close the file
f:write("Foobar")
f:flush()
f:close()
-- open myfile.txt for reading in binary mode
-- returns nil plus error message on failure
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
-- read the entire file as a string
-- returns nil on failure
local s = f:read("*a")
if not s then
print("Error while reading file")
return
end
print(s) -- Foobar
Dosyaları yeniden adlandırmak ve silmek için os.rename() ve os.remove() işlevlerini kullanabilirsiniz.
Lua tablolarını okumak ve yazmak için sys.save() ve sys.load() işlevlerini kullanabilirsiniz. Dosya yollarını platformdan bağımsız olarak çözümlemeye yardımcı olan başka sys.* işlevleri de vardır.
-- get a platform independent path to the file "highscore" for application "mygame"
local path = sys.get_save_file("mygame", "highscore")
-- save a Lua table with some data
local ok = sys.save(path, { highscore = 100 })
if not ok then
print("Failed to save", path)
return
end
-- load the data
local ok, data = pcall(sys.load, path)
if not ok then
-- The file exists, but is corrupt, foreign, or uses an unsupported format.
print("Failed to load save data:", data)
data = {}
end
print(data.highscore) -- 100
sys.load(), dosya yoksa boş bir tablo döndürür. Dosya varsa ancak sys.save() ile oluşturulmamışsa, bozuksa veya desteklenmeyen bir serileştirilmiş tablo biçimi kullanıyorsa sys.load() bir Lua hatası oluşturur. Bozulmuş veya dışarıdan değiştirilmiş kayıt verilerinin kurtarılabilmesi gerektiğinde yukarıdaki gibi pcall() kullanın.
Dosya ve klasör konumları üç kategoriye ayrılabilir:
En yüksek puanlar, kullanıcı ayarları ve oyun durumu gibi uygulamaya özgü dosyaları kaydederken ve yüklerken işletim sisteminin bu amaç için ayırdığı bir konumu kullanmanız önerilir. Bir dosyanın işletim sistemine özgü mutlak yolunu almak için sys.get_save_file() işlevini kullanabilirsiniz. Mutlak yolu aldıktan sonra sys.*, io.* ve os.* işlevlerini kullanabilirsiniz (yukarıya bakın).
sys.save() ve sys.load() işlevlerinin kullanımını gösteren örneği inceleyin.
Dağıtım paketine eklenen kaynakları (bundle resources) ve özel kaynakları (custom resources) kullanarak uygulamanıza dosya ekleyebilirsiniz.
Özel kaynaklar (custom resources), Custom Resources alanı üzerinden game.project dosyasında belirtilerek ana oyun arşivine eklenir.
Custom Resources alanının, ana oyun arşivine dahil edilecek kaynakları virgülle ayrılmış bir liste olarak içermesi önerilir. Dizinler belirtilirse, bu dizinlerdeki tüm dosyalar ve alt dizinler özyinelemeli olarak dahil edilir. Dosyaları sys.load_resource() kullanarak okuyabilirsiniz.
Eklentiler de ext.properties aracılığıyla bu dosyaları ekleyebilir. Bu dosyaların yolları, hem düzenleyici derlemelerinde hem de Bob arşivlerinde projenin özel kaynaklarıyla birleştirilir. Eklentilerde özel kaynaklar bölümüne bakın.
-- Load level data into a string
local data, error = sys.load_resource("/assets/level_data.json")
-- Decode json string to a Lua table
if data then
local data_table = json.decode(data)
pprint(data_table)
else
print(error)
end
Dağıtım paketine eklenen kaynaklar (bundle resources), Bundle Resources alanı kullanılarak game.project dosyası üzerinden uygulamanızın dağıtım paketine dahil edilen ek dosya ve klasörlerdir.
Bundle Resources alanı, paketleme sırasında oluşan pakete olduğu gibi kopyalanması gereken kaynak dosyalarını ve klasörlerini içeren dizinlerin virgülle ayrılmış bir listesini içermelidir. Dizinler, proje kökünden başlayan mutlak bir yolla belirtilmelidir; örneğin /res. Kaynak dizini, platform veya architecture-platform biçiminde adlandırılmış alt klasörler içermelidir.
Desteklenen platformlar ios, android, osx, win32, linux, web, switch şeklindedir. Tüm platformlar için ortak kaynak dosyalarını içeren common adlı bir alt klasöre de izin verilir. Örnek:
res
├── win32
│ └── mywin32file.txt
├── common
│ └── mycommonfile.txt
└── android
├── myandroidfile.txt
└── res
└── xml
└── filepaths.xml
Uygulamanın depolandığı konumun yolunu almak için sys.get_application_path() işlevini kullanabilirsiniz. Erişmeniz gereken dosyaların nihai mutlak yolunu oluşturmak için bu uygulama temel yolunu kullanın. Bu dosyaların mutlak yolunu elde ettikten sonra dosyalara erişmek için io.* ve os.* işlevlerini kullanabilirsiniz.
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)
Güvenlik nedeniyle tarayıcıların (ve dolayısıyla tarayıcıda çalışan tüm JavaScript kodlarının) sistem dosyalarına erişmesi engellenir. Defold HTML5 derlemelerinde dosya işlemleri çalışmaya devam eder, ancak yalnızca tarayıcıdaki IndexedDB API üzerinden bir “sanal dosya sistemi” üzerinde çalışır. Bu, dağıtım paketine eklenen kaynaklara io.* veya os.* işlevleriyle erişilemeyeceği anlamına gelir. Ancak bu kaynaklara http.request() ile erişebilirsiniz.
| Özellik | Özel kaynaklar | Dağıtım paketine eklenen kaynaklar |
|---|---|---|
| Yükleme hızı | Daha hızlı - dosyalar ikili arşivden yüklenir | Daha yavaş - dosyalar dosya sisteminden yüklenir |
| Dosyanın bir kısmını yükleme | Hayır - yalnızca dosyaların tamamı yüklenir | Evet - dosyadan istediğiniz baytları okuyabilirsiniz |
| Paketlemeden sonra dosyaları değiştirme | Hayır - dosyalar ikili bir arşiv içinde saklanır | Evet - dosyalar yerel dosya sisteminde saklanır |
| HTML5 desteği | Evet | Evet - ancak erişim dosya I/O işlemleriyle değil, http üzerinden sağlanır |
Sistem dosyalarına erişim, güvenlik nedeniyle işletim sistemi tarafından kısıtlanabilir. Yaygın kullanılan bazı sistem dizinlerinin (örneğin documents, resource, temp) mutlak yolunu almak için extension-directories yerel kod eklentisini (native extension) kullanabilirsiniz. Bu dosyaların mutlak yolunu aldıktan sonra dosyalara erişmek için io.* ve os.* işlevlerini kullanabilirsiniz (yukarıya bakın).
Güvenlik nedeniyle tarayıcıların (ve dolayısıyla tarayıcıda çalışan tüm JavaScript kodlarının) sistem dosyalarına erişmesi engellenir. Defold HTML5 derlemelerinde dosya işlemleri çalışmaya devam eder, ancak yalnızca tarayıcıdaki IndexedDB API üzerinden bir “sanal dosya sistemi” üzerinde çalışır. Bu, HTML5 derlemelerinde sistem dosyalarına erişmenin mümkün olmadığı anlamına gelir.
Asset Portal, dosya ve klasör erişimini kolaylaştıran çeşitli varlıklar içerir. Bazı örnekler: