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

Defold’da girdinin (input) genel olarak nasıl çalıştığını, girdinin nasıl alındığını ve betik dosyalarınızın girdiyi hangi sırayla aldığını öğrenmeniz önerilir. Girdi sistemi hakkında daha fazla bilgi için Girdiye genel bakış kılavuzuna bakın.

Fare tetikleyicileri

Fare tetikleyicileri (mouse triggers), fare düğmelerinden ve tekerleklerinden gelen girdiyi oyun eylemlerine bağlamanızı sağlar.

MOUSE_BUTTON_LEFT, MOUSE_BUTTON_RIGHT ve MOUSE_BUTTON_MIDDLE fare düğmesi girdileri, sırasıyla MOUSE_BUTTON_1, MOUSE_BUTTON_2 ve MOUSE_BUTTON_3 ile eşdeğerdir.

Aşağıdaki örnekler, yukarıdaki görüntüde gösterilen eylemleri kullanır. Tüm girdilerde olduğu gibi, girdi eylemlerinize (input action) istediğiniz adı verebilirsiniz.

Fare düğmeleri

Fare düğmeleri pressed, released ve repeated olayları üretir. Aşağıdaki örnek, sol fare düğmesinin girdisinin (basılma veya bırakılma) nasıl algılandığını gösterir:

function on_input(self, action_id, action)
    if action_id == hash("mouse_button_left") then
        if action.pressed then
            -- left mouse button pressed
        elseif action.released then
            -- left mouse button released
        end
    end
end

MOUSE_BUTTON_LEFT (veya MOUSE_BUTTON_1) girdi eylemleri, tekli dokunma girdileri için de gönderilir.

Fare tıklamalarını dokunmadan ayırt etme

action.source, ilk basma anı dahil, fiziksel fare basmasını dokunmayla benzetilen bir tıklamadan ayırt eder. MOUSE_BUTTON_LEFT girdisini mouse_button_left eylemine bağlayın ve şu kodu bir betikte veya GUI betiğinde kullanın:

function init(self)
    msg.post(".", "acquire_input_focus")
end

function on_input(self, action_id, action)
    if action_id == hash("mouse_button_left") and action.pressed then
        if action.source == hash("mouse") then
            print("Mouse pressed at:", action.x, action.y)
        elseif action.source == hash("touch") then
            print("Touch pressed at:", action.x, action.y)
        end
    end
end

Fare tıklaması olarak benzetilen bir dokunma, ayrı bir Touch Trigger olmadan bile hash("touch") bildirir. Dokunmayı tanımak için bir action.touch tablosuna veya önceki bir hareket olayına ihtiyaç yoktur. Tüm kaynak değerleri ve birden çok eşlemenin aynı eylem adını paylaştığında kaynakların nasıl çalıştığı için Girdi cihazının kaynağı bölümüne bakın.

iOS’ta bu ayrımın çalışması için özel bir Info.plist dosyası UIApplicationSupportsIndirectInputEvents özelliğini etkinleştirmelidir. Yerleşik bildirim bunu zaten etkinleştirir.

Fare tekerleği

Fare tekerleği girdileri kaydırma eylemlerini algılar. Tekerlek döndürüldüğünde action.value alanı 1, aksi durumda 0 olur. (Kaydırma eylemleri, düğmeye basma gibi işlenir. Defold şu anda dokunmatik yüzeylerde hassas kaydırma girdisini desteklemez.)

function on_input(self, action_id, action)
    if action_id == hash("mouse_wheel_up") then
        if action.value == 1 then
            -- mouse wheel is scrolled up
        end
    end
end

Fare hareketi

Fare hareketi ayrı olarak işlenir. Girdi eşlemelerinizde (input binding) en az bir fare tetikleyicisi ayarlanmadıkça fare hareketi olayları alınmaz.

İşaretçi hareketi bir eylem adına bağlanmaz: action_id değeri nil olur ve action tablosu işaretçinin konumunu ve hareket farkını içerir. Kaynağı, fiziksel fare için hash("mouse"), dokunmadan benzetilen hareket için hash("touch") olur. İvmeölçer örnekleri de action_id == nil kullandığı için Girdi cihazının kaynağı bölümünde gösterildiği gibi bunları ayırt etmek üzere kaynağı kontrol edin.

function on_input(self, action_id, action)
    if action_id == nil and
        (action.source == hash("mouse") or action.source == hash("touch")) then
        -- let game object follow mouse/touch movement
        local pos = vmath.vector3(action.x, action.y, 0)
        go.set_position(pos)
    end
end

Dokunma tetikleyicileri

Tekli dokunma (single-touch) ve çoklu dokunma (multi-touch) türündeki tetikleyiciler, iOS ve Android cihazlarda hem yerel uygulamalarda hem de HTML5 dağıtım paketlerinde kullanılabilir.

Tekli dokunma

Tekli dokunma türündeki tetikleyiciler, girdi eşlemelerinin Touch Triggers bölümünden ayarlanmaz. Bunun yerine MOUSE_BUTTON_LEFT veya MOUSE_BUTTON_1 için fare düğmesi girdisini ayarladığınızda tekli dokunma tetikleyicileri otomatik olarak ayarlanır.

Çoklu dokunma

Çoklu dokunma türündeki tetikleyiciler, eylem tablosunun içindeki touch adlı tabloyu doldurur. Tablonun elemanları 1–N aralığındaki tam sayılarla indekslenir; burada N, dokunma noktalarının sayısıdır. Tablodaki her eleman girdi verileri içeren alanlar barındırır:

function on_input(self, action_id, action)
    if action_id == hash("touch_multi") then
        -- Spawn at each touch point
        for i, touchdata in ipairs(action.touch) do
            local pos = vmath.vector3(touchdata.x, touchdata.y, 0)
            factory.create("#factory", pos)
        end
    end
end

Çoklu dokunmaya, MOUSE_BUTTON_LEFT veya MOUSE_BUTTON_1 fare düğmesi girdisiyle aynı eylem atanmamalıdır. Aynı eylemi atamak, tekli dokunmanın yerini alır ve herhangi bir tekli dokunma olayı almanızı engeller.

Defold-Input varlığı, çoklu dokunma desteğine sahip düğmeler ve analog çubuklar gibi sanal ekran kontrollerini kolayca oluşturmak için kullanılabilir.

Nesnelere tıklamayı veya dokunmayı algılama

Kullanıcının görsel bir bileşene (component) ne zaman tıkladığını veya dokunduğunu algılamak, birçok oyunda ihtiyaç duyulan çok yaygın bir işlemdir. Bu, kullanıcının bir düğmeyle veya başka bir kullanıcı arayüzü (UI) öğesiyle etkileşimi olabilir. Strateji oyununda oyuncunun yönettiği bir birim, zindan keşif oyununda bir bölümdeki hazine veya rol yapma oyununda (RPG) görev veren bir karakter gibi bir oyun nesnesiyle (game object) etkileşim de olabilir. Kullanılacak yaklaşım, görsel bileşenin türüne göre değişir.

GUI düğümleriyle etkileşimi algılama

Kullanıcı arayüzü öğeleri için gui.pick_node(node, x, y) işlevi bulunur. Bu işlev, belirtilen koordinatın bir GUI düğümünün (GUI node) sınırları içinde olup olmamasına göre true veya false döndürür. Daha fazla bilgi için API belgelerine, işaretçinin öğe üzerinde olmasını algılama örneğine veya düğme örneğine bakın.

Oyun nesneleriyle etkileşimi algılama

Kamera ötelemesi ve işleme betiğinin (render script) izdüşümü gibi etkenler gerekli hesaplamaları etkilediğinden, oyun nesneleriyle etkileşimi algılamak daha karmaşıktır. Oyun nesneleriyle etkileşimi algılamak için iki genel yaklaşım vardır:

  1. Kullanıcının etkileşim kurabileceği oyun nesnelerinin konumunu ve boyutunu takip edin ve fare ya da dokunma koordinatının bu nesnelerden herhangi birinin sınırları içinde olup olmadığını kontrol edin.
  2. Kullanıcının etkileşim kurabileceği oyun nesnelerine çarpışma nesneleri (collision object) ekleyin. Fareyi veya parmağı takip eden bir çarpışma nesnesi de ekleyin ve aralarında çarpışma olup olmadığını kontrol edin.

Çarpışma nesneleriyle kullanıcı girdisini algılamak için sürükleme ve tıklama desteğine sahip, kullanıma hazır bir çözümü Defold-Input varlığında bulabilirsiniz.

Her iki durumda da fare veya dokunma olayının ekran uzayı (screen space) koordinatları ile oyun nesnelerinin dünya uzayı (world space) koordinatları arasında dönüşüm yapmak gerekir. Bunu birkaç farklı yolla yapabilirsiniz: