MTA için LUA Eğitimi #7 (GUİ and DX Animation)

Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

xcagrihd

Onaylı Üye
Katılım
2 May 2017
Mesajlar
66
Beğeni Puanı
16
Puanları
208
Herkese merhabalar. Bu konuda sizlere DX veya GUI elementlerinize nasıl animasyon ekleyeceğinizi anlatacağım. Genelde animasyonlar konum ve boyut değiştirilerek yapılır. Konum ve boyutlar bildiğiniz gibi sayısal değerler. MTA bizlere sayısal değerler arasında rahatça geçiş yapabilmemiz için çok güzel bir fonksiyon vermiş, interpolateBetween. Bu fonksiyonu bir çok şey için kullanabilirsiniz, sadece animasyonlarınız için değil. Şimdi gelelim fonksiyonun kullanılışına.

Sözdizimi:
Lua:
interpolateBetween ( sayi1, sayi2, sayi3, sayi11, sayi22, sayi33, zaman, geçiş şekli )
Argümanlar
  • sayi1,sayi11: ilk değerden (sayi1) geçiş yapılacak 2. değer(sayi11)
  • sayi2,sayi22: ilk değerden (sayi2) geçiş yapılacak 2. değer(sayi22)
  • sayi3,sayi33: ilk değerden (sayi3) geçiş yapılacak 2. değer(sayi33)
- yukarıdaki 3 değer sıralı şekilde birbirleri arasında geçiş yapar
  • zaman: 2 getTickCount() değeri arasında kurulan orantıyla iki sayı arasında orantıyı kurup size yeni değeri verir
  • geçiş şekli: Bu değerler arasında olması gereken değer ile biraz oynama yapmanızı sağlar. Örneğin panelin olması gereken konumdan biraz daha fazla gidip geri olması gereken konuma gelmesi gibi.
    Lütfen, Giriş yap veya Kayıt ol içerikteki bağlantıyı görüntülemek için!
    denilen fonksiyonlar ile bunu yapabilirsiniz.
Şimdi bir örnek ile bunu daha iyi kavrayın

GUI için:

Lua:
tus = "F2" -- açma kapatma tuşu
sx,sy = guiGetScreenSize() -- ekran boyutları
pg,pu = 700,500 -- panel genişlik ve uzunluğu
px,py = sx/2-pg/2,sy/2-pu/2 -- panel koordinatları ayarlama

panel = guiCreateStaticImage(px,py,pg,pu,"img.png",false) -- arkaplandaki resmi oluşturma (window,label vb diğer elementlere çevirebilirsin)
guiSetVisible(panel,false) -- paneli görünmez yap

-- RENDER FUNCTION
addEventHandler("onClientRender",root,function()
    local now = getTickCount() -- şuanın milisaniyesi
    if panel_durum == false then -- eğer panel kapatılacaksa
        local _,pyy = guiGetPosition(panel,false) -- panelin x ve y koordinatlarını getirdik
        local yy = interpolateBetween(
            pyy, -- panelin şuanki y koordinatı
            0,0, -- buraya başka değerler yazabilirsiniz ama bu animasyon için başka değere ihtiyacımız yok
            (sy+1), -- panelin olması gereken konum
            0,0, -- buralar da boş kalıyor çünkü kullanmıyoruz
            (now-pTick)/1500, -- burda şuanın milisaniyesinden tuşa basıldığındaki milisaniyeyi çıkarıp 1500'e bölüyoruz
            -- 1500 arttığında animasyon yavaşlar, azaldığında animasyon hızlanır
            "Linear" -- panelin gitmesi gereken konuma nasıl gideceği
            -- şuanki animasyonda nasıl gideceği önemsiz, bunun sebebini fonksiyonu kavradığınızda gelin açıklarım
        )
        guiSetPosition(panel,px,yy,false) -- panelin yeni konumunu ayarladık
        showCursor(false) -- mouseu görünmez yaptık
        if yy == (sy+pu+1) then  -- eğer panel ekrandan dışarı çıkmışsa
            guiSetVisible(panel,false) -- paneli görünmez yaptık
        end
    elseif panel_durum == true then
        local _,pyy = guiGetPosition(panel,false) -- panelin x ve y koordinatlarını getirdik
        local yy = interpolateBetween(
            pyy, -- panelin şuanki y koordinatı
            0,0, -- buraya başka değerler yazabilirsiniz ama bu animasyon için başka değere ihtiyacımız yok
            py, -- panelin olması gereken konum
            0,0, -- buralar da boş kalıyor çünkü kullanmıyoruz
            (now-pTick)/1500, -- burda şuanın milisaniyesinden tuşa basıldığındaki milisaniyeyi çıkarıp 1500'e bölüyoruz
            -- 1500 arttığında animasyon yavaşlar, azaldığında animasyon hızlanır
            "Linear" -- panelin gitmesi gereken konuma nasıl gideceği
            -- şuanki animasyonda nasıl gideceği önemsiz, bunun sebebini fonksiyonu kavradığınızda gelin açıklarım
        )
        guiSetPosition(panel,px,yy,false) -- panelin yeni konumunu ayarladık
        if yy < py+20 then -- eğer panel olması gereken konuma yanaşmış ise
            showCursor(true) -- mouseu görünür yaptık
        end
    end
end)

-- PANEL BIND
panel_durum = false -- panelin durumunu kontrol edeceğimiz bir boolean
pTick = getTickCount() -- scriptin başlatıldığı milisaniye
bindKey(tus,"down",function() -- fonksiyon bind ekledik
    guiSetVisible(panel,true) -- fonksiyon her başlatıldığında panel görünür olacak
    panel_durum = not panel_durum -- booleanı zıttına çevirdik (true ise false, false ise true olacak)
    pTick = getTickCount() -- milisaniyeyi güncelledik
end)
DX için (test edilmedi):

Lua:
tus = "F2" -- açma kapatma tuşu
sx,sy = guiGetScreenSize() -- ekran boyutları
pg,pu = 700,500 -- panel genişlik ve uzunluğu
px,py = sx/2-pg/2,sy/2-pu/2 -- panel koordinatları ayarlama
yy = sy+1

-- RENDER FUNCTION
addEventHandler("onClientRender",root,function()
    local now = getTickCount() -- şuanın milisaniyesi
    if panel_durum == false then -- eğer panel kapatılacaksa
        yy = interpolateBetween(
            yy, -- panelin şuanki y koordinatı
            0,0, -- buraya başka değerler yazabilirsiniz ama bu animasyon için başka değere ihtiyacımız yok
            (sy+1), -- panelin olması gereken konum
            0,0, -- buralar da boş kalıyor çünkü kullanmıyoruz
            (now-pTick)/1500, -- burda şuanın milisaniyesinden tuşa basıldığındaki milisaniyeyi çıkarıp 1500'e bölüyoruz
            -- 1500 arttığında animasyon yavaşlar, azaldığında animasyon hızlanır
            "Linear" -- panelin gitmesi gereken konuma nasıl gideceği
            -- şuanki animasyonda nasıl gideceği önemsiz, bunun sebebini fonksiyonu kavradığınızda gelin açıklarım
        )
        dxDrawRectangle(px,yy,pg,pu) -- rectangleyi konuma getirdik
        showCursor(false) -- mouseu görünmez yaptık
    elseif panel_durum == true then
        yy = interpolateBetween(
            yy, -- panelin şuanki y koordinatı
            0,0, -- buraya başka değerler yazabilirsiniz ama bu animasyon için başka değere ihtiyacımız yok
            py, -- panelin olması gereken konum
            0,0, -- buralar da boş kalıyor çünkü kullanmıyoruz
            (now-pTick)/1500, -- burda şuanın milisaniyesinden tuşa basıldığındaki milisaniyeyi çıkarıp 1500'e bölüyoruz
            -- 1500 arttığında animasyon yavaşlar, azaldığında animasyon hızlanır
            "Linear" -- panelin gitmesi gereken konuma nasıl gideceği
            -- şuanki animasyonda nasıl gideceği önemsiz, bunun sebebini fonksiyonu kavradığınızda gelin açıklarım
        )
        dxDrawRectangle(px,yy,pg,pu) -- rectangleyi konuma getirdik
        if yy < py+20 then -- eğer panel olması gereken konuma yanaşmış ise
            showCursor(true) -- mouseu görünür yaptık
        end
    end
end)

-- PANEL BIND
panel_durum = false -- panelin durumunu kontrol edeceğimiz bir boolean
pTick = getTickCount() -- scriptin başlatıldığı milisaniye
bindKey(tus,"down",function() -- fonksiyon bind ekledik
    panel_durum = not panel_durum -- booleanı zıttına çevirdik (true ise false, false ise true olacak)
    pTick = getTickCount() -- milisaniyeyi güncelledik
end)
Bu animasyonlarda GUI/DX element ekranın altında ekranın ortasına gelip, ekranın ortasından aşağı kayarak ekranın dışına çıkar. Fonksiyonun mantığını anlamanız için bu konu biraz yetersiz, kendi animasyonlarınızı yapmaya çalışırken daha iyi öğrenirsiniz. Unutmayın bu fonksiyonu sadece animasyon için değil, her şey için kullanabilirsiniz.
 

#LiteraryStar

Cezalı Üye
Banlı Üye
Katılım
29 Ara 2018
Mesajlar
258
Beğeni Puanı
104
Puanları
43
Yaş
18
Güzel anlatımda bi özele gelir misin? Bişey sorcam.
 

xcagrihd

Onaylı Üye
Katılım
2 May 2017
Mesajlar
66
Beğeni Puanı
16
Puanları
208
Teşekkürler Bro Oğrenmeye Çalışacağım
Yardımcı olduysam ne mutlu bana :)
Mesajın otomatik olarak birleştirildi:

Güzel anlatımda bi özele gelir misin? Bişey sorcam.
Mesaj atarsan bakarım veya discord üzerinden yazabilirsin.
Mesajın otomatik olarak birleştirildi:

Rica ederim.
Mesajın otomatik olarak birleştirildi:

Yararlı paylaşım teşekkürler.
Rica ederim iyi geceler.
 

#LiteraryStar

Cezalı Üye
Banlı Üye
Katılım
29 Ara 2018
Mesajlar
258
Beğeni Puanı
104
Puanları
43
Yaş
18
Yardımcı olduysam ne mutlu bana :)
Mesajın otomatik olarak birleştirildi:


Mesaj atarsan bakarım veya discord üzerinden yazabilirsin.
Mesajın otomatik olarak birleştirildi:


Rica ederim.
Mesajın otomatik olarak birleştirildi:


Rica ederim iyi geceler.
Özel mesaj kapalı discord ismini verebilir misin?
 
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

Üst Alt