This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this tutorial in English
Defold kullanmaya yeni başladıysanız bu kılavuz düzenleyiciyi tanımanıza yardımcı olacaktır. Ayrıca temel fikirleri ve Defold’un en yaygın yapı taşlarını açıklar: oyun nesneleri, koleksiyonlar, betikler ve sprite bileşenleri.
Boş bir projeyle başlayıp adım adım çok küçük, oynanabilir bir uygulama oluşturacağız. Sonunda Defold’un nasıl çalıştığı hakkında bir fikir edinmiş ve daha kapsamlı bir öğreticiyi izlemeye ya da doğrudan kılavuzlara geçmeye hazır olacağınızı umuyoruz.
Öğretici boyunca kavramlara ve belirli işlemlerin nasıl yapıldığına ilişkin ayrıntılı açıklamalar, bu paragraf gibi işaretlenmiştir. Bu bölümlerin fazla ayrıntıya girdiğini düşünüyorsanız onları atlayabilirsiniz.

Yeni bir proje oluşturup düzenleyicide açarak başlayın. main/main.collection dosyasına çift tıklarsanız dosya açılır:

Düzenleyici şu ana alanlardan oluşur:
print() ve pprint() hata ayıklama iletilerini gösterir. Uygulamanız veya oyununuz başlamıyorsa ilk kontrol etmeniz gereken yer konsoldur. Konsolun arkasında hata bilgilerini gösteren bir dizi sekme ve parçacık efektleri oluşturulurken kullanılan bir eğri düzenleyicisi bulunur.“Empty” proje şablonu gerçekten de tamamen boştur. Yine de projeyi derleyip oyunu başlatmak için Project ▸ Build seçeneğini seçin.

Siyah bir ekran pek heyecan verici olmayabilir, ancak bu, çalışan bir Defold oyun uygulamasıdır ve onu kolayca daha ilginç bir şeye dönüştürebiliriz. Öyleyse bunu yapalım.
Defold düzenleyicisi dosyalar üzerinde çalışır. Assets bölmesinde bir dosyaya çift tıklayarak onu uygun bir düzenleyicide açarsınız. Ardından dosyanın içeriği üzerinde çalışabilirsiniz.
Bir dosyayı düzenlemeyi bitirdiğinizde onu kaydetmeniz gerekir. Ana menüden File ▸ Save seçeneğini seçin. Düzenleyici, kaydedilmemiş değişiklikler içeren dosyaların sekmelerindeki dosya adına bir yıldız işareti ‘*’ ekleyerek bunu belirtir.

İlk yapacağımız şey yeni bir koleksiyon (collection) oluşturmak. Koleksiyon, yerleştirdiğiniz ve konumlandırdığınız oyun nesnelerini barındıran bir kapsayıcıdır. Koleksiyonlar en yaygın olarak oyun bölümleri oluşturmak için kullanılır, ancak bir arada bulunması gereken oyun nesnesi gruplarını ve/veya hiyerarşilerini yeniden kullanmanız gerektiğinde de çok yararlıdır. Koleksiyonları bir tür yeniden kullanılabilir nesne tanımı, yani prefab olarak düşünmek faydalı olabilir.
Assets bölmesindeki main klasörüne tıklayın, ardından sağ tıklayıp New ▸ Collection File seçeneğini seçin. Ana menüden File ▸ New ▸ Collection File seçeneğini de seçebilirsiniz.

Yeni koleksiyon dosyasına car.collection adını verin ve dosyayı açın. Bu yeni, boş koleksiyonu kullanarak birkaç oyun nesnesinden küçük bir araba oluşturacağız. Oyun nesnesi (game object), oyununuzu oluşturmak için kullandığınız bileşenleri (component; sprite bileşenleri, sesler, oyun mantığı betikleri vb.) barındıran bir kapsayıcıdır. Her oyun nesnesi, oyunda id değeriyle benzersiz olarak tanımlanır. Oyun nesneleri ileti aktarımı (message passing) yoluyla birbirleriyle iletişim kurabilir; buna daha sonra değineceğiz.
Ayrıca burada yaptığımız gibi bir koleksiyonun içinde yerinde bir oyun nesnesi oluşturmak da mümkündür. Bunun sonucunda kendine özgü bir nesne oluşur. Bu nesneyi kopyalayabilirsiniz, ancak her kopya ayrıdır—birini değiştirmek diğerlerini etkilemez. Yani bir oyun nesnesinin 10 kopyasını oluşturup hepsini değiştirmek istediğinizi fark ederseniz nesnenin 10 örneğinin tamamını düzenlemeniz gerekir. Bu nedenle, yerinde oluşturulan oyun nesneleri çok sayıda kopyasını oluşturmayı düşünmediğiniz nesneler için kullanılmalıdır.
Buna karşılık, bir dosyada saklanan oyun nesnesi bir prototip (prototype; diğer motorlarda “prefab” veya “taslak”, yani “blueprint” olarak da bilinir) işlevi görür. Dosyada saklanan bir oyun nesnesinin örneklerini koleksiyona yerleştirdiğinizde her nesne başvuru yoluyla yerleştirilir—yani prototipe dayalı bir klondur. Prototipi değiştirmeniz gerektiğine karar verirseniz o prototipe dayalı olarak yerleştirilen her oyun nesnesi anında güncellenir.

Outline görünümünde kök “Collection” düğümünü seçin, sağ tıklayıp Add Game Object seçeneğini seçin. Koleksiyonda id değeri “go” olan yeni bir oyun nesnesi görünür. Bu nesneyi seçin ve Properties görünümünde id değerini “car” olarak ayarlayın. “car” şu ana kadar pek ilgi çekici değil. Boş; ne görsel bir temsili ne de herhangi bir mantığı var. Görsel bir temsil eklemek için bir sprite bileşeni eklememiz gerekir.
Bileşenler, oyun nesnelerine görsel ve işitsel varlık (grafikler, ses) ve işlevsellik (fabrikalarla (factory) çalışma sırasında nesne oluşturma, çarpışmalar, betiklerle tanımlanan davranışlar) eklemek için kullanılır. Bir bileşen kendi başına var olamaz; bir oyun nesnesinin içinde bulunmalıdır. Bileşenler genellikle oyun nesnesiyle aynı dosyada yerinde tanımlanır. Ancak bir bileşeni yeniden kullanmak istiyorsanız onu ayrı bir dosyada saklayabilir (oyun nesnelerinde olduğu gibi) ve herhangi bir oyun nesnesi dosyasına başvuru olarak ekleyebilirsiniz. Bazı bileşen türlerinin (örneğin Lua betiklerinin) ayrı bir bileşen dosyasına yerleştirilmesi ve ardından nesnelerinize başvuru olarak eklenmesi gerekir.
Bileşenleri doğrudan değiştirmediğinizi unutmayın—bileşenleri barındıran oyun nesnelerini taşıyabilir, döndürebilir, ölçekleyebilir ve özelliklerine animasyon uygulayabilirsiniz.

“car” oyun nesnesini seçin, sağ tıklayıp Add Component seçeneğini seçin; ardından Sprite seçeneğini seçip Ok düğmesine tıklayın. Outline görünümünde sprite bileşenini seçerseniz bazı özelliklerinin ayarlanması gerektiğini görürsünüz:
Oyunumuz için görüntüler:

Bu görüntüleri atlasa ekleyin:
![]()
![]()
Koleksiyona iki oyun nesnesi daha ekleyerek devam edin. Bunlara “left_wheel” ve “right_wheel” adlarını verin ve her birine, sprites.atlas dosyasına eklediğimiz lastik görüntüsünü gösteren bir sprite bileşeni koyun. Ardından tekerlek oyun nesnelerini tutup “car” üzerine bırakarak onları “car” nesnesinin alt nesneleri yapın. Başka oyun nesnelerinin alt nesnesi olan oyun nesneleri, üst nesneleri hareket ettiğinde ona bağlı kalır. Ayrı ayrı da hareket ettirilebilirler, ancak tüm hareketler üst nesneye göredir. Bu, lastikler için tam istediğimiz davranıştır; çünkü onların arabaya bağlı kalmasını isteriz ve arabayı yönlendirirken onları hafifçe sola ve sağa döndürmemiz yeterlidir. Bir koleksiyon, yan yana duran, karmaşık üst-alt nesne ağaçları biçiminde düzenlenmiş veya bu iki biçimi bir arada kullanan istenen sayıda oyun nesnesi içerebilir.
Lastik oyun nesnelerini seçip Scene ▸ Move Tool seçeneğini seçerek yerlerine taşıyın. Nesneyi uygun bir noktaya taşımak için ok tutamaçlarını veya ortadaki yeşil kareyi tutun. Son olarak lastiklerin arabanın altında çizildiğinden emin olmamız gerekir. Bunu, konumun Z bileşenini -0.5 olarak ayarlayarak yaparız. Oyundaki her görsel öğe, Z değerine göre sıralanarak arkadan öne doğru çizilir. Z değeri 0 olan bir nesne, Z değeri -0.5 olan bir nesnenin üzerine çizilir. Araba oyun nesnesinin varsayılan Z değeri 0 olduğundan lastik nesnelerinin yeni değeri onları araba görüntüsünün altına yerleştirir.

Bulmacanın son parçası, arabayı kontrol edecek bir betiktir (script). Betik, oyun nesnelerinin davranışlarını tanımlayan bir program içeren bileşendir. Betiklerle oyununuzun kurallarını ve nesnelerin çeşitli etkileşimlere (hem oyuncuyla hem de diğer nesnelerle) nasıl tepki vermesi gerektiğini belirleyebilirsiniz. Tüm betikler Lua programlama dilinde yazılır. Defold ile çalışabilmek için sizin veya ekibinizden birinin Lua ile programlamayı öğrenmesi gerekir.
Assets bölmesinde “main” klasörünü seçin, sağ tıklayıp New ▸ Script File seçeneğini seçin. Yeni dosyaya car.script adını verin; ardından Outline görünümünde “car” nesnesini seçip sağ tıklayın ve Add Component File seçeneğini seçerek dosyayı “car” oyun nesnesine ekleyin. car.script dosyasını seçin ve OK düğmesine tıklayın. Koleksiyon dosyasını kaydedin.
car.script dosyasını açmak için çift tıklayın.
Defold, oyun mantığını kodlamak için çeşitli yaşam döngüsü işlevleri sağlar. Bunlar hakkında daha fazla bilgiyi Betik kılavuzunda bulabilirsiniz.
Bu öğreticide ihtiyaç duymayacağımız için önce final, on_message ve on_reload işlevlerini
kaldırın.
Ardından init işlevinin başlangıcından önce aşağıdaki kod satırlarını ekleyin.
-- Constants
local turn_speed = 0.1 -- Slerp factor
local max_steer_angle_left = vmath.quat_rotation_z(math.pi / 6) -- 30 degrees
local max_steer_angle_right = vmath.quat_rotation_z(-math.pi / 6) -- -30 degrees
local steer_angle_zero = vmath.quat_rotation_z(0) -- Zero degrees
local wheels_vector = vmath.vector3(0, 72, 0) -- Vector from center of back and front wheel pairs
local acceleration = 100 -- The acceleration of the car
-- prehash the inputs
local left = hash("left")
local right = hash("right")
local accelerate = hash("accelerate")
local brake = hash("brake")
Burada yapılan değişiklikler oldukça basit; betiğimize, daha sonra arabamızın kodunu yazarken kullanacağımız bir dizi sabit (constants) ekledik.
Karma değerlerini (hash) önceden değişkenlerde nasıl sakladığımıza dikkat edin. Bunu yapmak iyi bir uygulamadır; çünkü kodunuzu daha okunabilir ve performanslı hâle getirir.
Ardından init işlevini aşağıdakileri içerecek şekilde düzenleyin:
function init(self)
-- Send a message to the render script (see builtins/render/default.render_script) to set the clear color.
-- This changes the background color of the game. The vector4 contains color information
-- by channel from 0-1: Red = 0.2. Green = 0.2, Blue = 0.2 and Alpha = 1.0
msg.post("@render:", "clear_color", { color = vmath.vector4(0.2, 0.2, 0.2, 1.0) } ) --<1>
-- Acquire input focus so we can react to input
msg.post(".", "acquire_input_focus") -- <2>
-- Some variables
self.steer_angle = vmath.quat() -- <3>
self.direction = vmath.quat()
-- Velocity and acceleration are car relative (not rotated)
self.velocity = vmath.vector3()
self.acceleration = vmath.vector3()
-- Input vector. This is modified later in the on_input function
-- to store the input.
self.input = vmath.vector3()
end
Az önce neleri değiştirdiğimizi merak ediyorsanız aşağıdaki açıklamaya bakın.
acquire_input_focus iletisinin gönderilmesi gerekir. Bu örnekte iletiyi araba betiğini barındıran oyun nesnesine gönderiyoruz.Kolaydı, değil mi? Şimdi update işlevini aşağıdakileri içerecek şekilde düzenleyerek devam edeceğiz:
function update(self, dt)
-- Set acceleration to the y input
self.acceleration.y = self.input.y * acceleration -- <1>
-- Calculate the new positions of front and back wheels
local front_vel = vmath.rotate(self.steer_angle, self.velocity)
local new_front_pos = vmath.rotate(self.direction, wheels_vector + front_vel)
local new_back_pos = vmath.rotate(self.direction, self.velocity) -- <2>
-- Calculate the car's new direction
local new_dir = vmath.normalize(new_front_pos - new_back_pos)
self.direction = vmath.quat_rotation_z(math.atan2(new_dir.y, new_dir.x) - math.pi / 2) -- <3>
-- Calculate new velocity based on current acceleration
self.velocity = self.velocity + self.acceleration * dt -- <4>
-- Update position based on current velocity and direction
local pos = go.get_position()
pos = pos + vmath.rotate(self.direction, self.velocity)
go.set_position(pos) -- <5>
-- Interpolate the wheels using vmath.slerp
if self.input.x > 0 then -- <6>
self.steer_angle = vmath.slerp(turn_speed, self.steer_angle, max_steer_angle_right)
elseif self.input.x < 0 then
self.steer_angle = vmath.slerp(turn_speed, self.steer_angle, max_steer_angle_left)
else
self.steer_angle = vmath.slerp(turn_speed, self.steer_angle, steer_angle_zero)
end
-- Update the wheel rotation
go.set_rotation(self.steer_angle, "left_wheel") -- <7>
go.set_rotation(self.steer_angle, "right_wheel")
-- Set the game object's rotation to the direction
go.set_rotation(self.direction)
-- reset acceleration and input
self.acceleration = vmath.vector3() -- <8>
self.input = vmath.vector3()
end
Bu oldukça büyük bir işlevdi! Ama endişelenmeyin; işte tüm bunların nasıl çalıştığı:
Sonunda arabamızın girdiye tepki vermesini sağlamanın zamanı geldi. on_input işlevini şu şekilde güncelleyin:
function on_input(self, action_id, action)
-- set the input vector to correspond to the key press
if action_id == left then
self.input.x = -1
elseif action_id == right then
self.input.x = 1
elseif action_id == accelerate then
self.input.y = 1
elseif action_id == brake then
self.input.y = -1
end
end
Bu işlev aslında oldukça basit; yalnızca girdiyi alıp girdi vektörümüzü ayarlarız.
Düzenlemelerinizi kaydetmeyi unutmayın.
Henüz hiçbir girdi eylemi ayarlanmadı; şimdi bunu yapalım. /input/game.input_bindings dosyasını açın ve “accelerate”, “brake”, “left” ve “right” için key_trigger girdi eşlemeleri (input binding) ekleyin. Bunları ok tuşlarına (KEY_LEFT, KEY_RIGHT, KEY_UP ve KEY_DOWN) eşliyoruz:

Araba artık sürüşe hazır. Onu “car.collection” içinde oluşturduk, ancak henüz oyunda mevcut değil. Bunun nedeni, motorun şu anda başlatılırken “main.collection” dosyasını yüklemesidir. Bunu düzeltmek için car.collection dosyasını main.collection dosyasına eklememiz yeterlidir. main.collection dosyasını açın, Outline görünümünde kök “Collection” düğümünü seçin, sağ tıklayıp Add Collection From File seçeneğini seçin; ardından car.collection dosyasını seçip OK düğmesine tıklayın. Artık car.collection dosyasının içeriği, yeni örnekler olarak main.collection içine yerleştirilir. car.collection dosyasının içeriğini değiştirirseniz koleksiyonun her örneği oyun derlendiğinde otomatik olarak güncellenir.

Şimdi Project ▸ Build seçeneğini seçin ve yeni arabanızla bir tur atın! Artık arabayı istediğiniz gibi hareket ettirebildiğinizi göreceksiniz. Ancak hâlâ yolunda gitmeyen bir şey var. Kontrolleri bıraktığınızda araba, durması gerektiği hâlde durmuyor. Şimdi bunu ekleme zamanı!
Gerçek dünyada bir nesne hareket ettiğinde sürükleme kuvveti (drag), nesnenin hareketine karşı koyarak yavaşlamasına neden olur. Bu kuvvet, hareketli nesnenin hızının karesiyle yaklaşık olarak orantılıdır ve dolayısıyla D = k * |V| * V olarak ifade edilebilir. Burada k bir sabit, V hız ve |V| hızın büyüklüğüdür (sürat). Bunu ekleyelim.
Betiğin başındaki sabitler bölümüne aşağıdaki sabiti ekleyin
local drag = 1.1 --the drag constant <1>
Ardından update işlevinde bu satırın hemen üstüne aşağıdaki satırları ekleyin ve dosyayı kaydedin.
function update(self, dt)
...
-- Calculate new velocity based on current acceleration
self.velocity = self.velocity + self.acceleration * dt
...
end
function update(self, dt)
...
-- Speed is the magnitude of the velocity
local speed = vmath.length_sqr(self.velocity)
-- Apply drag
self.acceleration = self.acceleration - speed * self.velocity * drag
-- Stop if we are already slow enough
if speed < 0.5 then self.velocity = vmath.vector3(0) end
...
end
Yukarıdaki adımları tamamladıktan sonra car.script dosyanız şöyle görünmelidir:
local turn_speed = 0.1 -- Slerp factor
local max_steer_angle_left = vmath.quat_rotation_z(math.pi / 6) -- 30 degrees
local max_steer_angle_right = vmath.quat_rotation_z(-math.pi / 6) -- -30 degrees
local steer_angle_zero = vmath.quat_rotation_z(0) -- Zero degrees
local wheels_vector = vmath.vector3(0, 72, 0) -- Vector from center of back and front wheel pairs
local acceleration = 100 -- The acceleration of the car
local drag = 1.1 -- the drag constant
function init(self)
-- Send a message to the render script (see builtins/render/default.render_script) to set the clear color.
-- This changes the background color of the game. The vector4 contains color information
-- by channel from 0-1: Red = 0.2. Green = 0.2, Blue = 0.2 and Alpha = 1.0
msg.post("@render:", "clear_color", { color = vmath.vector4(0.2, 0.2, 0.2, 1.0) } )
-- Acquire input focus so we can react to input
msg.post(".", "acquire_input_focus")
-- Some variables
self.steer_angle = vmath.quat()
self.direction = vmath.quat()
-- Velocity and acceleration are car relative (not rotated)
self.velocity = vmath.vector3()
self.acceleration = vmath.vector3()
-- Input vector. This is modified later in the on_input function
-- to store the input.
self.input = vmath.vector3()
end
function update(self, dt)
-- Set acceleration to the y input
self.acceleration.y = self.input.y * acceleration
-- Calculate the new positions of front and back wheels
local front_vel = vmath.rotate(self.steer_angle, self.velocity)
local new_front_pos = vmath.rotate(self.direction, wheels_vector + front_vel)
local new_back_pos = vmath.rotate(self.direction, self.velocity)
-- Calculate the car's new direction
local new_dir = vmath.normalize(new_front_pos - new_back_pos)
self.direction = vmath.quat_rotation_z(math.atan2(new_dir.y, new_dir.x) - math.pi / 2)
-- Speed is the magnitude of the velocity
local speed = vmath.length(self.velocity)
-- Apply drag
self.acceleration = self.acceleration - speed * self.velocity * drag
-- Stop if we are already slow enough
if speed < 0.5 then self.velocity = vmath.vector3() end
-- Calculate new velocity based on current acceleration
self.velocity = self.velocity + self.acceleration * dt
-- Update position based on current velocity and direction
local pos = go.get_position()
pos = pos + vmath.rotate(self.direction, self.velocity)
go.set_position(pos)
-- Interpolate the wheels using vmath.slerp
if self.input.x > 0 then
self.steer_angle = vmath.slerp(turn_speed, self.steer_angle, max_steer_angle_right)
elseif self.input.x < 0 then
self.steer_angle = vmath.slerp(turn_speed, self.steer_angle, max_steer_angle_left)
else
self.steer_angle = vmath.slerp(turn_speed, self.steer_angle, steer_angle_zero)
end
-- Update the wheel rotation
go.set_rotation(self.steer_angle, "left_wheel")
go.set_rotation(self.steer_angle, "right_wheel")
-- Set the game object's rotation to the direction
go.set_rotation(self.direction)
-- reset acceleration and input
self.acceleration = vmath.vector3()
self.input = vmath.vector3()
end
function on_input(self, action_id, action)
-- set the input vector to correspond to the key press
if action_id == hash("left") then
self.input.x = -1
elseif action_id == hash("right") then
self.input.x = 1
elseif action_id == hash("accelerate") then
self.input.y = 1
elseif action_id == hash("brake") then
self.input.y = -1
end
end
Şimdi ana menüden Project ▸ Build seçeneğini seçin ve yeni arabanızla bir tur atın!
Bu giriş öğreticisini tamamladık. İşte kendi başınıza çözmeyi deneyebileceğiniz bazı görevler:
properties) dönüştürerek arabanın farklı örnekleri için değiştirilebilmelerini sağlayın.Şimdi Defold’u keşfetmeye devam edin. Size yol göstermek için hazırladığımız pek çok kılavuz ve öğretici var; takıldığınızda sizi forumda görmekten memnuniyet duyarız.
Defold ile keyifli çalışmalar!