‫Merhaba ve tekrar hoş geldiniz.
‫Şimdi -- için hareketimiz var, ancak taret olarak adlandırdığımız --'in üst kısmını döndürmüyoruz.
‫Bu yüzden bunu faremizi kullanarak yapabilmek istiyoruz.
‫Şimdi, burada neler olduğuna bir bakın.
‫Fare imlecimi dünyada hareket ettirirken, bu kırmızı küreyi alıyorum.
‫Bu, 3B uzayda çizdiğim bir hata ayıklama küresi.
‫Şimdi bir duvara doğru hareket ettiğimde, bu kürenin duvarın yüzeyine doğru hareket ettiğine dikkat edin.
‫Yani fare imlecim nereye hareket ederse etsin, imlecimin konumuna bağlı olarak vurduğum nesneye
‫karşılık gelen bu korkuyu alıyorum.
‫Ve bu bizim için yararlı olacak, böylece uzayda taretimizi döndürebileceğimiz bir konuma sahip
‫olabiliriz.
‫Şimdi, bunu yapmak için denetleyicide ihtiyacımız olan bazı işlevler var, bu nedenle denetleyicideki bu işlevlere
‫erişmemiz gerekiyor.
‫Ve bu videoda bunu ayarlamaya çalışacağız ve ayrıca bunun döküm olarak bilinen
‫bir kavramı nasıl içereceğini tartışacağız.
‫Şimdi, denetleyiciyi istememizin nedeni, denetleyicide imlecin altında isabet sonucunu
‫almamızı sağlayan işlevler olmasıdır.
‫Şimdi fare imlecinden bahsediyoruz.
‫Diyelim ki bu bizim ekranımız ve bu da fare imlecimiz.
‫Ve imlecin ucundaki nokta ekrandaki bir konuma karşılık gelir.
‫Şimdi imleci hareket ettirirsek, amacımız tankımızın taret kısmının, ağımızın
‫üst kısmının imlecin yönüne bakacak şekilde dönmesidir.
‫Şimdi imleci hareket ettirirsek, denetleyicide bu imlece karşılık gelen konumu almak için kullanabileceğimiz
‫bir işlev vardır.
‫Eğer kameradan imlece doğru bir çizgi çizer ve dünyadaki bir nesneye çarparsak,
‫bu konumu elde edebilir ve tank taretinin dönüşünü ayarlamak için bu konumu kullanabiliriz.
‫Size ne demek istediğimi göstereyim.
‫Şimdi, imlecimize karşılık gelen bu isabet konumunu elde etmek için denetleyiciyi kullanmamız gerekiyor.
‫Şimdi, kısa bir süre için kontrolörden bahsedelim.
‫Diyelim ki dünyada bir piyonumuz var.
‫Bir piyonun bir kontrolörü olacaktır.
‫Bu, piyonla ilişkili görünmez bir nesnedir.
‫Şimdi, piyonumuz için, kontrol cihazımız A tipi oyuncu kontrol cihazına sahip olacak ve
‫oyunun başında kontrol cihazı piyona sahip olacak.
‫Bu yüzden piyon tankımıza ait olan kameranın bakış açısından görebiliriz.
‫Şimdi bu denetleyiciye erişebiliriz.
‫Tank sınıfımız Get Controller adlı bir fonksiyonu miras alır.
‫Bu -- sınıfından miras alınmıştır.
‫Yapmak istediğimiz şey, bu denetleyiciyi ele geçirmek ve bunu bir değişkende saklamaktır, böylece imlecin altındaki
‫isabet sonucunu almak için ihtiyaç duyduğumuz işleve erişmek için kullanabiliriz.
‫O yüzden kendimizi buna hazırlayalım.
‫Şimdi burada tank sınıfındayım ve kontrolcümüze erişmemiz gereken yer begin play.
‫Bunu yapıcıda yaparsak, bu çok erken olur ve henüz geçerli bir denetleyicimiz olmayabilir.
‫Bu yüzden tank sınıfında begin play fonksiyonuna ihtiyacımız olacak.
‫Şimdi burada temel pong sınıfında var ve şimdiye kadar temel pong sınıfında begin play'i gerçekten kullanmıyoruz.
‫Yapmak istediğim şey bunu tank sınıfına taşımak.
‫Bu nedenle, yorum ve korumalı bölüm de dahil olmak üzere oyuna başlamayı vurgulayacağım ve
‫basitçe keseceğim.
‫Ve sonra tank aşamasına geri dönüp yapıştıracağım.
‫Bu korumalı bölümü, içinde oynamaya başlayacağınız özel bölümün hemen üstüne ekleyelim.
‫Şimdi temel piyondan Oyuna Başla'yı kaldırdık.
‫Artık burada yok, ancak base pond cpp'den de kaldırmamız gerekiyor.
‫İşte burada.
‫Devam edip buradan silebiliriz ve şimdi burada Tank H'de tanımladık, ancak bunu Tank CPP'de
‫de tanımlamamız gerekiyor.
‫Bu yüzden işlevi, oyuncu girişi bileşeninin hemen altında tanımlayacağım.
‫Bu yüzden hiçbir girdi parametresi olmadan oyuna başlamak geçersiz olacaktır.
‫Fonksiyon gövdesi var ve ayrıca fonksiyon adını sabitleyen bir ön tanka ihtiyacımız var.
‫Artık oyunda süper büyük aramanın önemli olduğunu biliyoruz.
‫Bu şekilde, begin play işlevindeki ve herhangi bir üst sınıftaki herhangi bir işlev çağrılmaya devam edecektir.
‫İşte oyuna başlıyoruz.
‫Burası denetleyicimizi alabileceğimiz ve bir değişkende saklayabileceğimiz yerdir.
‫Şimdi Tank H'ye geri dönelim ve bir değişken oluşturalım.
‫Şimdi bu özel olacak ve onu buraya, özel bölümün altına yapıştıracağım
‫ve bir oyuncu denetleyicisi işaretçi türü olacak ve buna oyuncu denetleyicisi ref diyebiliriz.
‫Bu, oyuncu kontrolörüne referansımız olacaktır.
‫Şimdi bir C++ referansından bahsetmiyoruz.
‫Bu hala sadece bir işaretçidir, ancak bunu oyuncu denetleyicisine başvurmak için kullanacağız.
‫Şimdi A player controller tipinde bir player controller ref değişkenimiz var ve controller'ı bu pointer'da
‫saklamaya hazırız.
‫Şimdi Tank Dot CP'ye geri dönelim ve oynamaya başlayıp bunu yapmaya çalışalım.
‫Evet.
‫Yapacağım şey oyuncu, kontrolör, hakem eşittir demek ve kontrolörü al'ı çağırmaya çalışmak olacak.
‫Şimdi bahsettiğim gibi kontrolör -- sınıfında olsun.
‫Sağ tıklayıp tanıma gidelim ve bu işlevin bir A denetleyicisi döndürdüğüne dikkat edelim.
‫Şimdi değişkenimiz bir kontrolör değil, A oyuncu kontrolörü tipindedir.
‫Burada yapmaya çalıştığımız şey, bir kontrolör işaretçisi türünde olan get kontrolöründen dönen değeri
‫almak ve bunu bir A oyuncu kontrolör işaretçisinde saklamaya çalışmaktır.
‫Burada kırmızı dalgalı çizgiyi gördüğümüze dikkat edin.
‫Türünde bir değer olduğunu söylüyor.
‫Bir denetleyici işaretçisi, türdeki bir varlığa atanamaz.
‫Bir oyuncu kumandası.
‫Bir hata alıyoruz.
‫Şimdi bir kontrolörün belgelerine göz atalım.
‫Bir göz atın.
‫İşte bir kontrolör.
‫Ve miras, hiyerarşi diyor.
‫Ve bir kontrolörün altında bir kontrolör ve bir oyuncu kontrolörü görüyoruz.
‫Bu, bir oyuncu kontrolörünün bir kontrolörün alt sınıfı olduğu anlamına gelir.
‫Şimdi, C++'da, tipte bir işaretçiye sahip olamayız.
‫Bir oyuncu kontrolörü bir A kontrolörünün adresinin değerini saklar.
‫Bir kontrolör ana tiptir.
‫Bir oyuncu kontrolörü alt tiptir.
‫Üst tipte bir nesneyi alıp alt tipte bir göstericide saklayamazsınız.
‫Peki bunu nasıl aşacağız?
‫İşte sorunumuz.
‫get controller işlevi bir A denetleyicisinin adresini döndürür.
‫Şimdi, bu bir A denetleyici işaretçisinde saklayabileceğimiz bir şeydir, ancak bunu bir A oyuncu denetleyici işaretçisinde
‫saklayamayız.
‫Komik olan şey ise get controller tarafından döndürülen nesnenin aslında bir oyuncu denetleyicisi olmasıdır.
‫Yani bu adrese bir A denetleyici işaretçisi şeklinde sahibiz ve bunun bir oyuncu denetleyicisini sakladığını biliyoruz,
‫ancak bir A denetleyicisi şeklinde sahipsek, bir oyuncu denetleyicisinde bulunduğu için ihtiyacımız
‫olan işleve erişemeyiz.
‫İşlev, imleç altında isabet sonucu almak olarak adlandırılır.
‫Şimdi, A tipi bir denetleyici işaretçisine sahipsek ve bir oyuncu denetleyicisinde var olan
‫bu işlevi almaya çalışırsak, bunu yapamayız.
‫Bir derleme hatası alacağız.
‫Nesnenin kendisinin bir oyuncu denetleyicisi olduğunu bildiğimiz için, sadece bir A denetleyici işaretçisinde saklanır.
‫Bu sorunu nasıl aşabiliriz?
‫Cevap, oyuncu seçmemiz gerektiği.
‫Bir kontrolörün ana sınıf ve bir oyuncu kontrolörünün de alt sınıf olduğunu biliyoruz.
‫Ve bir A oyuncu kontrolörü işaretçisinde saklanan bir A kontrolörüne sahip olamayacağımızı biliyoruz.
‫Diğer yoldan gidebileceğimizi ve bir oyuncu denetleyicisinin nesnesi olan bir A denetleyici işaretçi deposuna sahip olabileceğimizi
‫biliyoruz.
‫Aslında get controller'ı çağırdığımızda gördüğümüz şey budur, bir A oyuncu denetleyicisine işaret eden bir A
‫denetleyici işaretçisi döndürür.
‫Dolayısıyla, elimizde A denetleyici işaretçisi türünde bir değer varsa, işaretçinin türünü A oyuncu denetleyici işaretçisine
‫dönüştürmek için cast adı verilen özel bir işlev kullanabiliriz.
‫Dolayısıyla, nesnenin kendisi cast etmeye çalıştığımız türde olduğu sürece, casting bir pointer'ın türünü başka bir
‫pointer türüne değiştirir.
‫Şimdi, geçersiz bir türe döküm yapmaya çalışırsak, örneğin, bir oyuncu denetleyici nesnesine işaret eden bir A
‫denetleyici işaretçimiz olur.
‫Diyelim ki bir karaktere döküm yapmaya çalışırsak, döküm işlevi null döndürür ve dökümde başarısız olduğumuzu
‫söyleriz.
‫Yani döküm işlevi şöyle görünür.
‫Tıpkı varsayılan alt nesne oluşturmak gibi bir şablondur.
‫Bu şablon işlevi seçilen türe uyum sağlayacaktır ve bu işlevde, aktardığımız tür bizim de döküm
‫yaptığımız türdür.
‫Bu yüzden bu türü geçiyoruz.
‫Köşeli parantezlerin içine iki tane döküm yapmak istiyoruz ve döküm yapmak istediğimiz işaretçiyi parantezlerin içine
‫geçiriyoruz.
‫İşte bir örnek.
‫Diyelim ki bir oyuncu denetleyicisine ve A denetleyici tipinde bir işaretçiye döküm yapmak istiyoruz.
‫İşaretçiyi parantezlerin içine ve döküm yaptığımız türü köşeli parantezlerin içine aktarıyoruz.
‫Ve döndürülen şey, A oyuncu denetleyicisi işaretçisi türünde bir değerdir.
‫İşte köşeli parantezler içinde türü geçirdiğimiz fonksiyon çağrısı ve get controller'dan
‫döndürdüğümüz A controller pointer değeri parantezler içine girebilir.
‫Bu yüzden get controller'dan döndürülen bu değeri cast etmemiz gerekiyor.
‫Bu sizin mücadeleniz olacak.
‫Begin Play'de get controller işlevini kullanın ve bu değeri cast işlevine aktarın ve bir oyuncu denetleyicisine
‫aktarın.
‫Ve sonra sonucu, A tipi oyuncu denetleyicisi işaretçisi olan oyuncu denetleyicisi ref işaretçimizde saklayabilirsiniz.
‫Videoyu duraklatın ve alçıyı gerçekleştirin.
‫Tamam.
‫Neredeyse tüm işi hallettik, sadece döküm yapmamız gerekiyor.
‫Bu yüzden yapacağımız şey, açılı parantezlerin yanı sıra parantezlere de sahip olan cast fonksiyonunu çağırmaktır.
‫Parantezin içinde yer alan değer ise atmak istediğimiz değerdir.
‫Şimdi get controller, A Tipi denetleyicinin bir işaretçisini döndürür.
‫Bunu tam burada parantezin içine taşıyacağım.
‫Ve döküm yaptığımız tür bir oyuncu kontrolörüdür.
‫Yani yine get comptroller tarafından döndürülen değeri alıyoruz.
‫Bu, bir comptroller işaretçisi veya bir adres döndürür.
‫Sonra bunu bir A oyuncu denetleyicisine atmak için cast kullanıyoruz.
‫Kapı denetleyicisi tarafından döndürülen nesnenin bir A denetleyici işaretçisinde saklanan bir A oyuncu denetleyici nesnesi olduğunu
‫biliyoruz.
‫Bunu attıktan sonra, döndürülen şey A oyuncu denetleyicisi türünde bir işaretçidir.
‫Bu yüzden bunu oyuncu kontrolörü ref'inde saklıyoruz.
‫Artık denetleyiciye bir A oyuncu denetleyici işaretçisi biçiminde erişebildiğimize göre, imlecin altındaki
‫izleme vuruşu sonucunu almak için ihtiyaç duyduğumuz işleve erişebiliriz.
‫Özetle, denetleyiciye erişmek için get controller kullandık.
‫Ayrıca, A tipi denetleyici işaretçisinden A tipi oyuncu denetleyici işaretçisine döküm yapmak için döküm işlevini kullanırız.
‫Şimdi ihtiyacımız olan fonksiyona erişebiliriz, bu da A player controller sınıfında bulunan cursor altındaki isabet
‫sonuçlarını almaktır.
‫Bu yüzden bir sonraki videoda bu fonksiyonu kullanmaya başlayacağız.
‫Yakında görüşürüz.