Kavramlar - Temel Sınıflar

Terimler ve Tanımlar

Bir Sınıf (Class), kodda tanımlanmış ve Örnekler (Instances) için bir şablon görevi gören Fonksiyonlar ve Değişkenler topluluğudur.
Örnek olarak Oyuncu (The Player), Varlıklar (Entities), Oyun Modları (Gamemodes), VGUI Elemanları (VGUI Elements) ve daha fazlası verilebilir.

Bir Örnek (Instance), oyunda aktif olan bir Sınıfın kopyasıdır. Tek bir Sınıfın birden fazla Örneği aynı anda aktif olabilir.
Örneğin: Sandbox Oluşturma Menüsünden bir nesne (prop) oluşturulduğunda, oyun prop_physics Sınıfının bir Örneğini oluşturur.
prop_physics Sınıfı kodda yalnızca bir kez tanımlanır, ancak herhangi bir sayıda Örnek oluşturmak için kullanılabilir.
Bilgisayar donanımını verimli kullanmak için, bir Sınıfın mantığı her Örneğe kopyalanmaz, bunun yerine tüm Örnekler Sınıftaki aynı tanıma geri döner. Bu işlem Meta Tabloları (Meta Tables) aracılığıyla gerçekleştirilir.

Bir Temel Sınıf (Base Class) (veya Ebeveyn Sınıf - Parent Class), bir Sınıfın (Ebeveyn Sınıfın Alt Sınıfı - Child Class) varsayılan olarak sahip olduğu Fonksiyonlar ve Değişkenler kümesidir. Ebeveyn Sınıf tarafından verilen (veya miras alınan) davranış, Ebeveyn Sınıftan Miras Alınan Fonksiyonlara ve Değişkenlere ekleme yapılarak, bunların üzerine yazılarak ve değiştirilerek Alt Sınıfta düzenlenir. Bu, bir Sınıfın, diğer Sınıfın mantığını sıfırdan yeniden oluşturmaya gerek kalmadan davranışını kopyalamasına olanak tanır. Mantığın gereksiz yere kopyalanmasını önlemek için, bir Alt Sınıf, bir Fonksiyon veya Değişken için üzerine yazılmış bir tanıma sahip olmadığı durumlarda Ebeveyn Sınıfının Meta Tablosuna başvurur.
Not: Tüm Sınıfların tam olarak bir (1) Temel Sınıfı olmalıdır, ancak herhangi bir sayıda Alt Sınıfı olabilir.

Temel Sınıfları Nasıl Kullanırsınız?

Örnek

Aşağıdaki örnek, bir Varlığın (Entity) birden fazla Alt Varlık için nasıl Temel Sınıf olarak kullanılabileceğini göstermektedir.

Ebeveyn Sınıf (sent_parentclass.lua), Varlığın modelini ve fiziğini ayarlamaya yönelik tüm mantığı ve Varlığın benzersiz davranışının arkasındaki mantığı yönetir. Bu durumda, benzersiz davranış, varlık çizilmeden önce rastgele bir görsel efektin etkinleştirilmesi ve çizildikten sonra devre dışı bırakılmasıdır. Ebeveyn Sınıfta, bu görsel efekt Varlığı sadece maviye çevirir.

Alt Sınıflar (sent_childclass_1.lua ve sent_childclass_2.lua), Temel Sınıflarının (sent_parentclass.lua) mantığını koruduğu için, farklı görsel efektler oluşturmak amacıyla çok az miktarda kod eklemeleri yeterlidir.

sent_childclass_1.lua, görsel efekti etkinleştiren fonksiyonun üzerine yazar ve Ebeveyn Sınıfın mavi renk efektini bir gökkuşağı renk efektiyle değiştirir.
sent_childclass_2.lua, görsel efektin hem etkinleştirme hem de devre dışı bırakma fonksiyonlarının üzerine yazar. Bunlar, Varlığın (artık bir lastik gibi görünen) hareketsizken bile sürekli dönüyormuş gibi görünmesini sağlayan fonksiyonlarla değiştirilir.

sent_parentclass.lua

AddCSLuaFile() -- Tüm Varlıkların bir Temel Sınıfı olmalıdır. -- Bu durumda, "base_anim" Sınıfı kullanılmaktadır. -- Bu, Garry's Mod'da mevcut olan varsayılan Varlık Sınıflarından biridir. DEFINE_BASECLASS( "base_anim" ) ENT.PrintName = "Parent Class" ENT.Category = "BaseClass Example" ENT.RenderGroup = RENDERGROUP_TRANSLUCENT ENT.Spawnable = true -- Bu değişken, bir Temel Sınıfın alt sınıflarına hem fonksiyonlar -- hem de değişkenler sağladığını göstermek için vardır. -- Bu, normal genişlikte bir sandık modelidir. ENT.ModelToSpawnWith = "models/props_junk/wood_crate001a_damaged.mdl" -- Varlığı ayarla function ENT:Initialize() if SERVER then self:SetModel( self.ModelToSpawnWith ) self:PhysicsInit( SOLID_VPHYSICS ) self:SetMoveType( MOVETYPE_VPHYSICS ) self:SetSolid( SOLID_VPHYSICS ) end end -- Bu, alt sınıfların Temel Sınıflarındaki fonksiyonların üzerine -- yazabildiğini göstermek için kullanacağımız özel bir fonksiyondur. function ENT:EnableVisualEffects() -- Yaklaşan render işlemini mavi görünecek şekilde değiştir. render.SetColorModulation( 0, 0, 1 ) end -- Bu özel fonksiyon, alt Varlık tarafından üzerine yazılmayacaktır, ancak bu -- tamamen gösterim amaçlıdır. Temel Sınıftaki herhangi bir fonksiyon, -- alt sınıfları tarafından üzerine yazılabilir. function ENT:DisableVisualEffects() -- Render sisteminin rengini sıfırla. render.SetColorModulation( 1, 1, 1 ) end -- Burada, varlığın nasıl çizildiğini değiştirmek için yukarıdaki özel fonksiyonları kullanıyoruz. -- Bu fonksiyonu alt sınıfta üzerine yazmadığımız için, bu fonksiyon -- alt Varlığın Draw (Çizim) fonksiyonu olacaktır. function ENT:Draw() self:EnableVisualEffects() self:DrawModel() self:DisableVisualEffects() end

sent_childclass_1.lua

AddCSLuaFile() -- Temel Sınıfımızı, fonksiyonları ve değerleri miras almak istediğimiz Sınıf olarak ayarlıyoruz. -- DEFINE_BASECLASS kullanmak da aynı derecede geçerli olurdu. -- baseclass.Get(), her iki seçeneğin de uygulanabilir olduğunu göstermek için burada kullanılıyor. ENT.BaseClass = baseclass.Get( "sent_parentclass" ) ENT.PrintName = "Rainbow Child Example" ENT.Category = "BaseClass Examples" ENT.Spawnable = true -- Temel Sınıfımızda Varlığın modelini ayarlamak için kullanılan değişkenin üzerine yaz -- ENT:Initialize() fonksiyonunun üzerine yazmadığımız için, bu mantık -- tam olarak Temel Sınıfımızda göründüğü gibi çalışacak, ancak Temel Sınıfta -- tanımlanan değer yerine bu değerle çalışacaktır. -- Bu, ekstra geniş bir sandık modelidir. ENT.ModelToSpawnWith = "models/props_junk/wood_crate002a.mdl" -- Varlığın rengini rastgele hale getirmek için görsel efektler fonksiyonunun üzerine yaz. function ENT:EnableVisualEffects() local red = math.Remap( math.sin( CurTime() * 2 + 1 ), -1, 1, 0, 1 ) local green = math.Remap( math.cos( CurTime() * 3 + 2 ), -1, 1, 0, 1 ) local blue = math.Remap( math.sin( CurTime() * 4 + 3 ), -1, 1, 0, 1 ) render.SetColorModulation( red, green, blue ) end

sent_childclass_2.lua

AddCSLuaFile() ENT.BaseClass = baseclass.Get( "sent_parentclass" ) ENT.PrintName = "Perpetual Motion Child Example" ENT.Category = "BaseClass Examples" ENT.Spawnable = true ENT.ModelToSpawnWith = "models/props_vehicles/tire001c_car.mdl" -- Temel Sınıfın mavi efektini, dönüyormuşuz gibi gösteren bir efektle değiştir function ENT:EnableVisualEffects() local matrix = Matrix( ) matrix:SetAngles( Angle( 0, 0, CurTime() * 200 ) ) self:EnableMatrix( "RenderMultiply", matrix ) end -- Varlığın rengini Temel Sınıfın yaptığı gibi değiştirmediğimiz için, -- efekti uygun şekilde devre dışı bıraktığımızdan emin olmak için bu fonksiyonun üzerine yazmamız gerekiyor. function ENT:DisableVisualEffects() self:DisableMatrix( "RenderMultiply" ) end
Çıktı: Aşağıda, soldan sağa doğru sırasıyla şunları görebilirsiniz:
1. Ebeveyn Sınıf sent_parentclass (Mavi sandık)
2. Birinci Alt Sınıf sent_childclass_1 (Gökkuşağı sandık)
3. İkinci Alt Sınıf sent_childclass_2 (Dönen lastik)

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