‫Tamam.
‫Bu derste multicast, delegeler ve olaylar hakkında bilgi edineceksiniz.
‫Öyleyse önce sorunu inceleyelim.
‫Sıfırdan bir video oyunu geliştirdiğimizi düşünün.
‫Kodumuz, grafik ve ses kütüphaneleri ile oynatıcımızın mantığının bir birleşimidir.
‫Öyleyse kodlamaya başlayalım.
‫Aşağıdaki basit sınıfları göz önünde bulundurun.
‫Her şeyden önce, oyunun başlangıcında render motorunu etkinleştirmek ve görselleri çizmeye başlamak
‫istediğimiz bu render sınıfımız var.
‫Yani render edecek ve sonra görselleri çizmeye başlayacak.
‫Ve ayrıca oyun bittiğinde, render motorumuzu durdurmak istiyoruz.
‫Dolayısıyla, daha sonra işleme motorunu durduracak olan bu oyun bitti yöntemine sahibiz.
‫Bu yüzden burada sadece konsol sağ satır ifadelerini kullanıyorum.
‫Bu elbette çok daha karmaşık bir kod olacaktır ve bu daha sonra gerçekten bir şeyler yapacaktır.
‫Bizim durumumuzda, olayların yanı sıra çok noktaya yayın delegeleri kavramını da anlamaya çalışıyoruz.
‫Bu yüzden bunu konsolda kırmızı bir çizgi ifadesiyle göstereceğiz.
‫İşte bu bizim render sınıfımız.
‫Şimdi ses sistemi sınıfımıza bakalım.
‫Yani burada ses sisteminde, ses sistemini başlatacak ve biraz ses çalacak olan bu dart oyunu yöntemine
‫de sahibiz.
‫Ve sonra temelde ses sistemini durduracak olan oyun bitirme yöntemimiz var.
‫Ve son olarak bir oyuncumuz var ve oyuncunun bir oyuncu adı var ve bu adı, oluşturulan nesneye
‫ne aktarıldığına bağlı olarak ayarladığımız basit bir kurucumuz var.
‫Ve burada ayrıca oyun başlatma ve oyun bitirme yöntemlerimiz de var.
‫Yani bu, oyuncuyu bir ID ile ortaya çıkaracak ve bu sadece oyuncu adı olarak
‫atadığımız belirli bir ID'ye sahip oyuncuyu kaldıracak.
‫Bunlar üç sınıfımız ve bunlarla oldukça basit tutacağım.
‫Şimdi devam edelim ve ana yöntemimize geçelim.
‫Şimdi ana metodumuzun içinde bu sistemlerin nesnelerini oluşturacağız.
‫Öncelikle ses sistemi ve ardından işleme motoru, yani çok basit, burada sadece basit nesneler
‫var.
‫Ve sonra da ID ile iki oyuncu oluşturuyoruz.
‫Yani birinci oyuncumuz CAO, ikinci oyuncumuz ise De Silva olacak.
‫Bu yüzden render motorumuzu, ses sistemimizi başlatmamız ve her bir sınıftan start game metodunu çağırarak oyuncuları
‫ortaya çıkarmamız gerekiyor.
‫O zaman bunu yapalım.
‫Ve bunu bu şekilde yapacağım.
‫Bu yüzden sadece ses sistemi diyeceğim, oyun işleme motorunu başlatın, oyunu başlatmayın oyuncu bir ve oyuncu her
‫biri oyunu başlatmak için.
‫Ve sonra sadece oyunun çalıştığını söyleriz oyunu bitirmek için herhangi bir tuşa basın.
‫Şimdi yapmak istediğimiz şey, oyuncu düğmeye bastığında temel olarak oyunu bitirmek istiyoruz.
‫Bu yüzden elbette çok daha karmaşık olacaktır.
‫Diyelim ki oyuncu seçenekler menüsündeki tüm for veya tuşlarına bastı.
‫Oyunu kapatır, ardından bir sonraki kod çalışır.
‫Dolayısıyla, bir sonraki kod elbette ses sistemi game over, yöntem oluşturma motoru game over yönteminin yanı sıra oyuncu
‫bir ve oyuncu iki game over yöntemlerini çağırmak olacaktır.
‫O zaman bunu halledelim.
‫Bunu da buraya ekleyelim.
‫Ve bu arada, okunmuş bir bildiriye ihtiyacımız olacak çünkü aksi takdirde doğrudan kapatılacaktır.
‫Bu yüzden buraya hızlıca bir okuma ifadesi ekleyeyim, böylece her şeyi kapatmak ve temelde oyunu bitirmek için
‫bir tuşa manuel olarak basabiliriz.
‫Şimdi bunu hızlıca çalıştıralım ve ne olacağını görelim.
‫Böylece ses sisteminin başlatıldığını, sesin çalındığını, render motorunun başlatıldığını, şimdi görselleri gördüğümüzü ve ardından
‫oyuncuların ortaya çıktığını görüyoruz.
‫Böylece oyuncu bir ve oyuncu iki ortaya çıkar.
‫Şimdi oyun çalışıyor ve onunla oynayabiliriz.
‫Ve bitirmek istediğimizde bir tuşa basıyoruz.
‫Bu yüzden bir tuşa basacağım.
‫Ve render motorunun durduğunu, ses sisteminin durduğunu ve her iki oyuncuyu da kaldırdığımızı görüyorsunuz.
‫Yani bunu kurmak için epey çaba sarf ettik.
‫Şimdi bunu çok daha fazla şeyle yapmamız gerektiğini ve birkaç şeyin yanlış gidebileceğini hayal ediyorum,
‫değil mi?
‫Diyelim ki daha fazla sistem ekledik, o zaman bu çok daha karmaşık hale gelir, böylece oyunu başlat veya oyun bitti
‫yöntemini çağırmayı kolayca unutabiliriz.
‫Daha da kötüsü, bu yöntemlerden birini iki kez çağırabiliriz, bu da her türlü soruna neden olabilir ve çok
‫fazla koruyucu kod yerleştirmemizi gerektirebilir.
‫Bu yüzden gerçekten emin olmalıyız, bu nesne canlı mı?
‫Bu yöntemi mi çağırdı yoksa bu yöntemi mi çağırdı vb. çok karmaşık.
‫İşte bu noktada çok noktaya yayın delegeleri işe yarar.
‫Çok noktaya yayın delegesi, birden fazla yönteme referans depolayabildiği bir liste olarak
‫çalışan bir delegedir ve temelde budur.
‫Tamam, bu kulağa oldukça karmaşık geliyor, ancak bunu inşa edelim ve o zaman muhtemelen daha anlamlı olacaktır.
‫Öyleyse Game Event Manager adında statik bir sınıf oluşturalım.
‫Evet.
‫Tamam.
‫Öyleyse devam edelim ve yeni bir tane oluşturalım.
‫Sınıf burada.
‫Ve ben buna oyun etkinlik yöneticisi diyeceğim.
‫Tamam.
‫Yani bu oyun etkinliği yöneticisinin artık bir temsilcisi olacak.
‫Bu yüzden Game Event adında yeni bir temsilci oluşturacağım.
‫Yani hiçbir şey döndürmeyecek, ancak delege türünde olacak ve public olacak, böylece
‫bu sınıfın dışında kullanabileceğiz.
‫Genel olarak delegelerin nasıl çalıştığını gördük ve şimdi bu delegeyi temelde birden
‫fazla olay eklememize izin vermek için kullanacağız.
‫Şimdi oyun başlangıcında ve oyun sonunda adında iki değişken oluşturalım ve bunlar game event türünde
‫olsun.
‫Yani delegemizin tipine uygun olmayacaklar.
‫Yani bu bir oyun olayı delegesi olacak ve bu da bir oyun olayı delegesi olacak.
‫Artık kullanabileceğimiz iki temsilci değişkenimiz var.
‫Üç sınıfımıza geri dönelim.
‫Oyuna başlama ve oyun bitirme yöntemlerini oyuna başlama ve oyun bitirme delegelerine ekleyelim.
‫Ayrıca, bu yöntemlerin herkese açık olmasına gerek yoktur.
‫Şimdi ses sistemine gidelim ve bu iki yöntemi private yapalım çünkü olayları eklemek
‫ya da olaylara abone olmak için ses sisteminin yapıcısını kullanacağımızdan bunları ifşa etmemize gerek yok.
‫Dolayısıyla, burada yöntemlerimizi oyun yöneticisi delegelerine eklemek için en iyi yer kurucunun kendisidir.
‫Burada yaptığımız şey de bu.
‫Ve bir nesne oluşturulduğunda, yöntemleri otomatik olarak temsilcilere eklenecek veya başka
‫bir deyişle onlara abone olacaklardır.
‫Şimdi olacak olan şey, oyun başlatma ve oyun bitirme yöntemimizin oyun başlatma delegesinde
‫oyun olay yöneticisine eklenecek olmasıdır.
‫Ve burada artı eşittir işaretini kullanarak şunu söylüyoruz: Tamam, bu yöntemi çok noktaya yayın delegesine eklemek
‫istiyoruz.
‫Yani temelde buna abone oluyoruz ve bu olayın tetiklenmesini bekliyoruz çünkü bu
‫olay tetiklendiğinde yöntemimiz çağrılacak.
‫İşin güzel yanı, artık aynı şeyi render motoru sınıfı ve oyuncu sınıfı ile de yapabiliyoruz.
‫Burada önemli olan, sadece eşittir işaretini değil, artı eşittir işaretini kullanıyorum, bu yüzden onu atamıyorum.
‫İmzanın ne anlama geleceğini ve bizim için ne ifade edeceğini daha sonra göreceğiz.
‫Ama burada sadece bir tane daha ekliyoruz.
‫Tabiri caizse etkinlik koleksiyoncularımıza veya etkinlik yöneticimize yöntem.
‫Böylece, daha sonra yürütmesi gereken tüm bu olayları veya yöntemleri toplar.
‫Yani bu çoklu bir delege.
‫Şimdi aynı şeyi render motorumuz için yapalım.
‫Bunu kendin yapmanı istiyorum.
‫Bu yüzden videoyu çok hızlı bir şekilde duraklatın ve aynı kodu atamaya veya burada ses sisteminde yaptığımız gibi
‫aynı kodu oluşturmaya çalışın.
‫Her şeyden önce, metotlarımın özel olacağından emin oldum çünkü artık onları ifşa etmemize
‫gerek yok.
‫Bu gerekli olmadığından, onları bu sınıfın dışında asla çağırmayacağız.
‫Bu yüzden onları özel kılmak her zaman iyi bir uygulamadır.
‫Bununla birlikte, çağırabileceğimiz şey kurucudur, değil mi?
‫Böylece, public olduğu için render motorumuzun bir nesnesini oluşturabiliriz.
‫Şimdi devam edebilir ve start game metodumuzu oyun olay yöneticimizin oyun başlangıcına da ekleyebiliriz.
‫Ve aynı şey oyunun bitmesi için de geçerli.
‫Yani burada da artı eşittir kullanıyoruz.
‫Yani oyun başladığında ve oyun bittiğinde olaylarına abone olduğumuzu söylüyoruz.
‫Yani temel olarak oyun başladığında olayın tetikleneceğini söylüyoruz.
‫Oyuna başlama yöntemimiz olarak da adlandırılır.
‫Lütfen.
‫Bizim derken render motorlarının oyunu başlatma yöntemini kastediyorum.
‫Böylece bu yöntemi çağıracaktır.
‫Ve elbette oyun biterse, oyun bitirme yöntemi buradaki yöntem olarak adlandırılacaktır.
‫Biz de bu yaklaşımı bu şekilde kullanıyoruz.
‫Şimdi sizin için küçük bir meydan okuma.
‫Aynı şeyi oyuncu sınıfı için de yapın lütfen.
‫Tamam.
‫Her şeyden önce, umarım geçmişsinizdir.
‫Ayrıca, bu iki metodun private olacağından da emin olmayacağım çünkü hiç kimsenin oyunu başlat
‫ve oyunu bitir metotlarını dışarıdan çağırmaması gerekiyor.
‫Ancak burada zaten bir kurucumuz var ve ben de bu kurucuyu on game start ve on game over
‫metotlarını on game start ve on game over olaylarına abone olmak için kullanacağım.
‫Şimdi oyun olay yöneticimizde.
‫Olayları main yönteminden tetiklemek için iki genel statik yöntem ekleyelim.
‫O zaman burada yapabiliriz.
‫Call of, yani, temel olarak bu olayı çalıştırın çünkü şimdi bu noktada, yani, tüm bu işleme motorları, ses
‫sistemleri ve oynatıcılar oluşturulduktan sonra, bu olay tetiklendiğinde, bir şey çalıştıracaktır.
‫Ancak böyle bir durumda ne olması gerektiğini henüz söylemedik.
‫Yani bu olay tetiklenecekse.
‫Öyleyse oyun başladığında tetiklemek için statik bir yöntem oluşturalım.
‫Dolayısıyla, buradaki yöntem öncelikle on game start olayının boş olup olmadığını, yani diğer yöntemlerin zaten buna abone
‫olup olmadığını kontrol edecektir, ki temelde bir işleme motoru oluşturduğumuzda durum böyle olacaktır.
‫Buradaki kod çalıştırıldığında, örneğin ses sistemi oluşturulduğunda ve bu kod çalıştırıldığında ya
‫da oynatıcı oluşturulduğunda ve bu kod çalıştırıldığında, buradaki ifade doğru olacaktır.
‫Böylece oyun başlangıcında oyun olayı boş olmayacaktır, yani null olmayacaktır.
‫Ve sonra buradaki kod çalıştırılacaktır.
‫Şimdi yapacağı şey, oyunun başladığını söylemek ve ardından oyun başlangıcını çağırmak
‫olacak.
‫Bu olaya abone olan tüm yöntemleri tetikleyecektir.
‫Yani bu, bu yöntemi burada çağırdığımızda, yani bu oyun olayı, tabiri caizse, onu çağırdığımızda
‫bu yöntemin burada yürütüleceği anlamına gelir.
‫Bu yöntemin yanı sıra bu yöntem de yürütülecektir ve bunu da birazdan göreceğiz.
‫Yani bu tetikleyici kazanç başlangıcıdır.
‫İşte bu şekilde tetikleyeceğiz.
‫Ve sadece bu yöntemi çağırarak, oyun olaylarının kendisinde yaptığımız gibi statik hale getirdiğimizi görüyorsunuz,
‫çünkü bu yöntemleri çağırmak için bir oyun olayı yöneticisi oluşturmamız gerekmiyor.
‫İşte biz de bunu başarmak istiyoruz ve bu yüzden bu statik yapıyı oluşturuyoruz.
‫Dolayısıyla, bu yöntemleri çağırmak için bir nesne oluşturmanıza gerek yoktur ve ardından kendi oyunumuz için
‫başka bir statik yöntem oluşturalım.
‫Videoyu duraklatmanızı ve kendinizi şimdi gerçekten hızlı bir şekilde inşa etmeye çalışmanızı tavsiye ederim.
‫Tamam.
‫Umarım geçmişsindir.
‫Temelde burada yaptığımızla aynı şey, ancak şimdi bunu buradaki son oyunla yapacak.
‫Bu yüzden, olayı tetikleyecek ve oyun bittiğinde null değilse, bu public static void triggered game over yöntemine
‫sahibim.
‫Dolayısıyla, olaya abone olan yöntemler varsa, bu yanlış olmayacak ve temelde doğru olacaktır, bu da bu kodun
‫yürütüleceği ve oyun bittiğinde yürütüleceği anlamına gelir, bu
‫da daha sonra tüm oyun bitti yöntemlerini veya bu oyun bitti olayına atanan veya abone olan tüm yöntemleri çağıracaktır,
‫bu da buradaki bu yöntemin yanı sıra bu yöntem ve son olarak elbette bu yöntem anlamına gelir.
‫Şimdi yeni bir motor oluşturacak olursak, artık işleme motoruna ve ses motoruna sahibiz.
‫Diyelim ki üçüncü motoru oluşturduk, o zaman artık bu şeyleri manuel olarak çağırmamıza gerek yok, ancak bu olaya
‫abone olmak istediğimizi söylediğimiz motorda doğrudan ayarlayabileceğimiz ve bu olayı tetiklediğimizde
‫yöntemin otomatik olarak çağrılacağı şekilde gönderdik.
‫Tamam.
‫Şimdi main metodundaki kodumuza bir göz atalım, çünkü burada çok şey oluyor.
‫Şimdi tüm bu kodun artık çalışmadığını görüyorsunuz, elbette, çünkü tüm bu oyun başlatma
‫yöntemleri daha önce herkese açıktı, ancak artık değiller.
‫Artık öyleler.
‫Olacak.
‫Özel oldukları için kapalılar.
‫Şimdi devam edelim ve bu oyun olayını gerçekten tetiklediğimizden emin olalım.
‫Burada oyun olay yöneticimiz var ve bu tetikleyici oyun başlangıcına sahip çünkü bu noktada yapmak istediğimiz
‫şey bu, değil mi?
‫Tüm oyuncular, tüm sistemleriniz ve her şey hazır olduğunda, devam edebilir ve çalıştırabiliriz.
‫Ve şimdi aynı şeyi burada game over yöntemiyle yapabiliriz.
‫Oyun bitti olayını burada tetikleyelim.
‫Yani şimdi olacak olan şey, temelde çok daha basit ve temiz bir koda sahip olduğumuzdan emin olmamızı sağlayacak.
‫Böylece kodumuzun kusursuz bir şekilde çalışacağından emin oluruz.
‫Şimdi diyelim ki buna başka bir oyuncu ekledik.
‫Bunu düşünmek ve tüm bu yöntemleri çağırmak zorunda değiliz.
‫Doğru, oyuna başlama metodunu çağırdı, oyunu bitirme metodunu çağırdı vb.
‫Devam edip bu yeni oyuncuyu oluşturabiliriz ve otomatik olarak yöntemleri buna göre çağıracaktır.
‫Yani burada oyunun ses sistemini başlattığını ve ses oluşturma, motor çizimi, görseller ve ardından
‫hala toggle silver ve Dragon Dock adı verilen oyuncuyu ortaya çıkarmaya başladığını görüyorsunuz.
‫Şimdi bir düğmeye basalım.
‫Ve oyunun bittiğini görebilirsiniz.
‫Ses sistemi durdu.
‫Oluşturma motoru durdu ve tüm oyuncuları kaldırdık.
‫İşte çok noktaya yayın delegelerinin gücü budur.
‫Süper, süper kullanışlı, çok güçlü.
‫Üçüncü nesne oyuncumuzun oyuna başlama ve oyun bitirme yöntemlerinin otomatik olarak çağrıldığını
‫görebiliriz çünkü nesnelerimiz hem oyuna başlama hem de oyun bitirme olayları tetiklendiğinde bilgilendirilmiştir.
‫Şimdi temsilci kullanırken bazı şeyler yanlış gidebilir.
‫Öncelikle düzeltmek için saatler harcayabileceğimiz bazı hataları görelim.
‫Diyelim ki yanlışlıkla, artı eşittir işaretini kullanarak olaylarımıza bir yöntem
‫abone etmek yerine, örneğin oyuncunun sınıfına gidelim.
‫Yanlışlıkla eşittir işaretini kullanmış olabiliriz.
‫Dolayısıyla derleyici bunun yanlış olduğunu söylemez çünkü bu yanlış değildir.
‫Tek bir yöntemle mevcut olayın üzerine de yazabilirsiniz.
‫Yani burada yaptığımız şey, bu noktada abone olunan başka ne varsa, onu geçersiz kılacağımızı
‫söylemektir.
‫Burada olan da temelde bu.
‫Bu nedenle, oyun başlangıcında ve oyun bitiminde olaylarına atıfta bulunan tüm yöntemleri kaldıracağız
‫ve oyuncuyu tüm bu olaylara tek abone olarak oluşturulan son oyuncu nesnesi olarak ayarlayacağız.
‫Ayrıca, oyun başladığında ve oyun bittiğinde aslında herkese açık olduğundan, bunları doğrudan herhangi bir yerden
‫çağırabiliriz.
‫Diyelim ki oyun başladığında oyun olay yöneticisini buradan çağırmak istiyoruz, o zaman bunu da yapabiliriz.
‫Şimdi kodu çalıştıralım ve siz de görün.
‫Kimliği hala Dragon Silver Dragon Dong olan sportif oyuncu.
‫Oyun, bir ejderha köpek ve bir ejderha dong ile oynanmaya başladı.
‫Evet, olay önce Kes programımız tarafından tetiklendi ve ardından ejderha köpeğimiz olan son
‫oyuncumuzdan da bir kez daha Oyun Başlangıcını çağırdı.
‫Yani burada olan şey temelde buydu.
‫Bu yüzden burada gerçekten dikkatli olmamız gerekiyor.
‫Bu, düzeltilmesi çok zor olabilecek bir şeydir.
‫Artık olaylarımızı private olarak işaretleyemeyiz çünkü sınıf kurucularımızda onlara abone olmak için
‫public olmaları gerekir.
‫Delegelerden bahsederken event adını kullanıyorduk çünkü delegelerimiz tam anlamıyla event
‫gibi davranıyordu.
‫Ama aslında olay adı verilen ve bu tür hataları önlemek için yapılan özel bir delege türü
‫vardır.
‫Tamam.
‫Şimdi bu hatayı önlememize yardımcı olan güzel bir anahtar kelime var ve bu da olay anahtar kelimesi, çünkü
‫temelde burada oyun olay yöneticimizde oluşturduğumuz bu temsilci, bu genel çalışma
‫oyun olayı bir olaydır.
‫Dolayısıyla, burada sadece bu olay anahtar sözcüğünü kullanabilirdik ve bu, bu hatayı yapmamızı bile önlerdi
‫çünkü şimdi burada yaptığımız şeyden memnun olmadığını görüyorsunuz, böylece bir delegeyi geçersiz kılabiliriz.
‫Ancak olaylar söz konusu olduğunda, bunlara yalnızca abone olabiliriz ve bu olayı doğrudan çağıramayız.
‫Doğrudan oyun olay yöneticisinden tetiklenecektir, bu nedenle artık olayı doğrudan çağıramayız.
‫Game Start artık bir olay olduğundan ve onu yalnızca oluşturulduğu sınıfın içinden çağırmamıza izin
‫verileceğinden.
‫Ayrıca bizi bir liste gibi davranmaya zorluyor.
‫Dolayısıyla, eşittir işaretinin sol tarafında bir olay olmasına izin verilmez.
‫Gördüğümüz gibi böyle bir şeye izin verilmiyor.
‫Pekala, şimdi uygulamayı tekrar çalıştırırsak, kusursuz bir şekilde çalıştığını göreceksiniz.
‫Kodu çalıştırayım.
‫Ve gayet iyi gitti.
‫Bu oldukça yoğun ve basit bir örnekti çünkü delegeleri, çoklu yayın delegelerini ve olayları tek bir videoda
‫inceledik.
‫Ancak umarım bu video, delegeler ve etkinliklerle çalışma konusunda ne gibi avantajlara sahip olduğunuzu açıkça ortaya koymuştur.
‫Ve işin güzel yanı, artık kendi delegelerinizi ve kendi olaylarınızı nasıl oluşturacağınızı
‫gördünüz, çünkü daha sonra kullanıcı arayüzünü kullanmaya gelince bir sürü olay göreceğiz.
‫Örneğin, bir şeye tıkladığınızda bir olay tetiklenir ve birden fazla şey abone olabilir.
‫Birden fazla yöntem, tetiklenen bu olaya abone olabilir ve ardından, örneğin düğmeye tıklandığında
‫veya klavyedeki herhangi bir tuşa tıklandığında bir kez çalıştırılabilir.
‫Pekâlâ, şimdi hızlıca özetleyelim.
‫Bir olay, bir liste gibi davranmaya zorlanmış bir delegenin kısıtlı bir biçimidir, bu nedenle yalnızca ondan yöntem ekleyebilir veya kaldırabiliriz,
‫böylece artı eşittir veya eksi eşittir işaretini kullanarak abone olabilir veya abonelikten çıkabiliriz, ancak eşittir işaretini
‫kullanamayız.
‫Bir temsilci, temsilcim eşittir yöntemim aracılığıyla doğrudan bir atamaya izin verir.
‫Bunu yapmak, daha önce eklenmiş olan diğer yöntemlerin yerini alır.
‫Bu yüzden dikkatli olun.
‫Ayrıca, olaylar yalnızca onları tanımlayan sınıf tarafından kendi sınıflarının dışından çağrılabilir.
‫Bunlara yalnızca kayıtlı ve kayıtsız yöntemleri kaydedebilirsiniz.
‫Tamam, umarım bu videoyu beğenmişsinizdir ve size etkinlikler ve delegeler hakkında iyi bir fikir vermiştir ve bir
‫sonraki videoda görüşmek üzere.