Derma Temel Rehberi

Derma Nedir?

Derma, Garry ve TAD2020 tarafından oluşturulmuştur ve oyun modunuz veya eklentiniz için ekran menüleri oluşturmanın en kolay yoludur.

Derma, kodunun yalnızca bir kez çalıştırılması gerektiği için vgui'den farklıdır, bu nedenle Derma kodunu ASLA GM:HUDPaint veya benzeri fonksiyonların içine koymamalısınız, çünkü bunlar her karede çağrılır. Hayatınızı kolaylaştırmak için Derma kodunuzu bir fonksiyona sarmalı ve bir menü oluşturmanız gerektiğinde onu çağırmalısınız ve her zaman yerel değişkenler kullanmalısınız. Global bir işaretçi kullanmanız gerekiyorsa, onu spesifik veya bir tablo üyesi yapın. DLabel = vgui.Create( "DLabel" ) kötü bir kodlama pratiğidir ve muhtemelen bir şeyin üzerine yazacaktır.

Derma istemci taraflıdır ve sunucudan çağırmak isterseniz net kütüphanesini kullanmanız gerekir.

Derma'nın yaşı nedeniyle, Garry's Mod'da bazı öğeler kullanımdan kaldırılmıştır, bkz. VGUI_Element_List. Bu wikideki Derma sayfalarının çoğu işlevsel panellere yönlendirir.

Başlarken

Yapmanız gereken ilk şey bir DFrame oluşturmaktır, çünkü bu, Derma'yı yerleştirmek için tabiri caizse tuvaliniz olacaktır.

Kod

local Frame = vgui.Create( "DFrame" ) Frame:SetPos( 5, 5 ) Frame:SetSize( 300, 150 ) Frame:SetTitle( "İsim penceresi" ) Frame:SetVisible( true ) Frame:SetDraggable( false ) Frame:ShowCloseButton( true ) Frame:MakePopup()

Çıktı

Derma'yı Boyama

Bu Nedir?

Derma, Lua kodlayıcısı için ne kadar yararlı olsa da, görünüşü oldukça çirkindir ve bazen gerçekten güzel görünen bir menü istersiniz. Bunu, her bir Derma öğesinde yapabileceğiniz panelin Paint fonksiyonunu geçersiz kılarak çözebilirsiniz. Fonksiyonu geçersiz kılmak, üzerine bir şey çizene kadar panelin görünmez olacağı anlamına gelir; mevcut panelin üzerine çizim yapmak isterseniz PANEL:PaintOver fonksiyonunu deneyebilirsiniz.

Örnek Kod

local Frame = vgui.Create( "DFrame" ) Frame:SetTitle( "Test paneli" ) Frame:SetSize( 300,300 ) Frame:Center() Frame:MakePopup() Frame.Paint = function( self, w, h ) -- 'function Frame:Paint( w, h )' de çalışır draw.RoundedBox( 0, 0, 0, w, h, Color( 231, 76, 60, 150 ) ) -- Çerçeve yerine kırmızı bir kutu çizin end local Button = vgui.Create("DButton", Frame) Button:SetText( "Bana tıkla, çok güzelim!" ) Button:SetTextColor( Color(255,255,255) ) Button:SetPos( 100, 100 ) Button:SetSize( 100, 30 ) Button.Paint = function( self, w, h ) draw.RoundedBox( 0, 0, 0, w, h, Color( 41, 128, 185, 250 ) ) -- Mavi bir buton çizin end Button.DoClick = function() print( "Bana tıklandı!" ) end

Çıktı

Kullanıcı Girdileri

Onlardan nasıl veri alacağınızı bilmiyorsanız Derma menüleriniz pek işe yaramayabilir; bu veri kullanıcı tarafından yazılmış bir metin, bir düğme tıklaması veya bir onay kutusu olabilir.

Oyuncunun adını girebileceği ve enter'a bastığında tepki veren bir DTextEntry oluşturalım! Ardından girilen değeri daha sonra başvurmak üzere bir değişkene atayabilir veya hatta net kütüphanesini kullanarak adlarını kaydetmek için sunucuya gönderebiliriz.

Örnek Kod

local PlayerName = nil local NameEntry = vgui.Create( "DTextEntry", Frame ) NameEntry:SetPos( 25, 50 ) NameEntry:SetSize( 75, 85 ) NameEntry:SetText( "Adınız" ) NameEntry.OnEnter = function( self ) PlayerName = self:GetValue() print( "Bu kullanıcının adı "..PlayerName ) end

Şimdi diyelim ki oyuncunun bir renk seçmesini istiyoruz, bu renk oyuncu modelini veya sohbetteki adını renklendirmek için kullanılabilir ve ardından bir düğmeye basarak bunu onaylarlar.

Örnek Kod

local ChosenColor = nil local ColorPicker = vgui.Create( "DColorMixer", Frame ) ColorPicker:SetSize( 200, 200 ) ColorPicker:SetPos(50, 50) ColorPicker:SetPalette( true ) ColorPicker:SetAlphaBar( true ) ColorPicker:SetWangs( true ) ColorPicker:SetColor( Color( 255, 255, 255 ) ) local ConfirmColor = vgui.Create("DButton", Frame) ConfirmColor:SetText( "Bu rengi istiyorum" ) ConfirmColor:SetSize( 90, 30 ) ConfirmColor:SetPos( 100, Frame:GetTall() - 40 ) ConfirmColor.DoClick = function() ChosenColor = ColorPicker:GetColor() -- Kırmızı, yeşil, mavi ve alfa değerlerini bir Color nesnesi olarak alır PrintTable(ChosenColor) --[[ Yazdırır: r = 255 g = 255 b = 255 a = 255 ]] end

Çıktı

Ölçeklendirme

Bu Nedir?

Garry's Mod oynayan herkes sizinle aynı çözünürlüğe veya monitör boyutuna sahip değildir ve bu nedenle Derma'nızı neredeyse herkesin monitöründe çalışacak şekilde oluşturmalısınız. Bunu, ilgili boyutlarını tamsayı olarak döndüren ScrH ve ScrW fonksiyonlarını kullanarak başarabilirsiniz. Projenize başlarken bu konuda endişelenmeniz gerekmez, çünkü sabit boyutlarla çalışmak daha hızlıdır, ancak Derma'nız oldukça büyükse bu çok önemlidir.

Nasıl Yapılır?

Yapmanız gereken ilk şey monitör çözünürlüğünüzü bulmaktır, benimki 1920 x 1080 ve bu eğitim için bunu kullanacağım. Çözünürlüğünüzü bulmanın en kolay yolu print ve ekran boyutu fonksiyonlarını kullanmaktır.

Şimdi bu çerçeveyi oluşturduğumuzu ve oyuncunun ekranının ortasında olmasını ve buna göre boyutlandırılmasını istediğimizi varsayalım

MyFrame:SetSize( 400, 300 )

Bunu verimli bir şekilde yapmak için, istediğimiz boyutu ekran çözünürlüğümüze bölerek ve ScrW ile ScrH fonksiyonlarını kullanarak Panel:SetSize metoduna bir matematik işlemi koyabiliriz:

MyFrame:SetSize( ScrW() * 400/1920, ScrH() * 300/1080 )

Artık bu DFrame sizin çözünürlüğünüzde 400x300 olacak ve diğer tüm çözünürlüklerde de boyutlanacaktır. Daha sonra bu çerçeve üzerindeki bir DButton'ı, boyutunu çerçevenin boyutuna bölerek ölçeklendirebilirsiniz ve üst öğesine göre ölçeklenecektir.

Çizim kodundaki gereksiz işlemleri azaltmak için daha sonra statik hesaplamaları hesaplanmış değerlerle değiştirmeniz önerilir:

MyFrame:SetSize( ScrW() * 0.208, ScrH() * 0.277 )

Kaynaklar

Ne yazık ki, Derma'daki çok sayıda fonksiyon nedeniyle hepsi henüz belgelenmemiştir, ancak kaynak kodunu kendiniz arayabilir ve bu fonksiyonların nasıl çalıştığını çözebilirsiniz! Çevrimiçi bir depoyu burada bulabilirsiniz: https://github.com/garrynewman/garrysmod/tree/master/garrysmod/lua/vgui veya yerel Garry's Mod dizininizdeki garrysmod\lua\vgui klasörüne bakabilirsiniz.

Tüm Derma öğelerinin bir listesi burada bulunabilir.

Tüm sunucular · GmodTR Launcher · Rehber · GMod Wiki · GmodTR nedir? · Sunucu ekle · Discord