﻿1
00:00:04,380 --> 00:00:06,150
‫Merhaba ve tekrar hoş geldiniz.

2
00:00:06,240 --> 00:00:12,920
‫Şimdi -- için hareketimiz var, ancak taret olarak adlandırdığımız --'in üst kısmını döndürmüyoruz.

3
00:00:12,930 --> 00:00:16,290
‫Bu yüzden bunu faremizi kullanarak yapabilmek istiyoruz.

4
00:00:16,320 --> 00:00:18,800
‫Şimdi, burada neler olduğuna bir bakın.

5
00:00:18,810 --> 00:00:23,300
‫Fare imlecimi dünyada hareket ettirirken, bu kırmızı küreyi alıyorum.

6
00:00:23,310 --> 00:00:27,060
‫Bu, 3B uzayda çizdiğim bir hata ayıklama küresi.

7
00:00:27,300 --> 00:00:33,600
‫Şimdi bir duvara doğru hareket ettiğimde, bu kürenin duvarın yüzeyine doğru hareket ettiğine dikkat edin.

8
00:00:33,600 --> 00:00:40,410
‫Yani fare imlecim nereye hareket ederse etsin, imlecimin konumuna bağlı olarak vurduğum nesneye

9
00:00:40,410 --> 00:00:43,620
‫karşılık gelen bu korkuyu alıyorum.

10
00:00:43,620 --> 00:00:50,250
‫Ve bu bizim için yararlı olacak, böylece uzayda taretimizi döndürebileceğimiz bir konuma sahip

11
00:00:50,250 --> 00:00:51,200
‫olabiliriz.

12
00:00:51,210 --> 00:00:57,570
‫Şimdi, bunu yapmak için denetleyicide ihtiyacımız olan bazı işlevler var, bu nedenle denetleyicideki bu işlevlere

13
00:00:57,570 --> 00:00:59,250
‫erişmemiz gerekiyor.

14
00:00:59,250 --> 00:01:04,140
‫Ve bu videoda bunu ayarlamaya çalışacağız ve ayrıca bunun döküm olarak bilinen

15
00:01:04,140 --> 00:01:07,080
‫bir kavramı nasıl içereceğini tartışacağız.

16
00:01:07,080 --> 00:01:12,330
‫Şimdi, denetleyiciyi istememizin nedeni, denetleyicide imlecin altında isabet sonucunu

17
00:01:12,330 --> 00:01:14,820
‫almamızı sağlayan işlevler olmasıdır.

18
00:01:14,820 --> 00:01:16,860
‫Şimdi fare imlecinden bahsediyoruz.

19
00:01:16,860 --> 00:01:20,310
‫Diyelim ki bu bizim ekranımız ve bu da fare imlecimiz.

20
00:01:20,310 --> 00:01:25,530
‫Ve imlecin ucundaki nokta ekrandaki bir konuma karşılık gelir.

21
00:01:25,530 --> 00:01:31,740
‫Şimdi imleci hareket ettirirsek, amacımız tankımızın taret kısmının, ağımızın

22
00:01:31,740 --> 00:01:37,290
‫üst kısmının imlecin yönüne bakacak şekilde dönmesidir.

23
00:01:37,440 --> 00:01:44,370
‫Şimdi imleci hareket ettirirsek, denetleyicide bu imlece karşılık gelen konumu almak için kullanabileceğimiz

24
00:01:44,370 --> 00:01:47,190
‫bir işlev vardır.

25
00:01:47,190 --> 00:01:52,830
‫Eğer kameradan imlece doğru bir çizgi çizer ve dünyadaki bir nesneye çarparsak,

26
00:01:52,830 --> 00:01:59,700
‫bu konumu elde edebilir ve tank taretinin dönüşünü ayarlamak için bu konumu kullanabiliriz.

27
00:01:59,730 --> 00:02:00,960
‫Size ne demek istediğimi göstereyim.

28
00:02:00,960 --> 00:02:06,420
‫Şimdi, imlecimize karşılık gelen bu isabet konumunu elde etmek için denetleyiciyi kullanmamız gerekiyor.

29
00:02:06,420 --> 00:02:09,480
‫Şimdi, kısa bir süre için kontrolörden bahsedelim.

30
00:02:09,780 --> 00:02:11,880
‫Diyelim ki dünyada bir piyonumuz var.

31
00:02:11,880 --> 00:02:13,950
‫Bir piyonun bir kontrolörü olacaktır.

32
00:02:14,130 --> 00:02:18,210
‫Bu, piyonla ilişkili görünmez bir nesnedir.

33
00:02:18,210 --> 00:02:24,180
‫Şimdi, piyonumuz için, kontrol cihazımız A tipi oyuncu kontrol cihazına sahip olacak ve

34
00:02:24,180 --> 00:02:27,720
‫oyunun başında kontrol cihazı piyona sahip olacak.

35
00:02:27,750 --> 00:02:32,790
‫Bu yüzden piyon tankımıza ait olan kameranın bakış açısından görebiliriz.

36
00:02:32,790 --> 00:02:34,890
‫Şimdi bu denetleyiciye erişebiliriz.

37
00:02:34,920 --> 00:02:38,970
‫Tank sınıfımız Get Controller adlı bir fonksiyonu miras alır.

38
00:02:38,970 --> 00:02:41,100
‫Bu -- sınıfından miras alınmıştır.

39
00:02:41,100 --> 00:02:46,950
‫Yapmak istediğimiz şey, bu denetleyiciyi ele geçirmek ve bunu bir değişkende saklamaktır, böylece imlecin altındaki

40
00:02:46,950 --> 00:02:51,270
‫isabet sonucunu almak için ihtiyaç duyduğumuz işleve erişmek için kullanabiliriz.

41
00:02:51,270 --> 00:02:53,010
‫O yüzden kendimizi buna hazırlayalım.

42
00:02:53,010 --> 00:02:58,650
‫Şimdi burada tank sınıfındayım ve kontrolcümüze erişmemiz gereken yer begin play.

43
00:02:58,680 --> 00:03:05,190
‫Bunu yapıcıda yaparsak, bu çok erken olur ve henüz geçerli bir denetleyicimiz olmayabilir.

44
00:03:05,190 --> 00:03:08,910
‫Bu yüzden tank sınıfında begin play fonksiyonuna ihtiyacımız olacak.

45
00:03:08,910 --> 00:03:15,090
‫Ş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.

46
00:03:15,270 --> 00:03:18,450
‫Yapmak istediğim şey bunu tank sınıfına taşımak.

47
00:03:18,450 --> 00:03:24,150
‫Bu nedenle, yorum ve korumalı bölüm de dahil olmak üzere oyuna başlamayı vurgulayacağım ve

48
00:03:24,150 --> 00:03:25,500
‫basitçe keseceğim.

49
00:03:25,500 --> 00:03:28,710
‫Ve sonra tank aşamasına geri dönüp yapıştıracağım.

50
00:03:28,710 --> 00:03:33,960
‫Bu korumalı bölümü, içinde oynamaya başlayacağınız özel bölümün hemen üstüne ekleyelim.

51
00:03:33,960 --> 00:03:36,270
‫Şimdi temel piyondan Oyuna Başla'yı kaldırdık.

52
00:03:36,840 --> 00:03:41,430
‫Artık burada yok, ancak base pond cpp'den de kaldırmamız gerekiyor.

53
00:03:41,460 --> 00:03:42,240
‫İşte burada.

54
00:03:42,240 --> 00:03:48,960
‫Devam edip buradan silebiliriz ve şimdi burada Tank H'de tanımladık, ancak bunu Tank CPP'de

55
00:03:48,960 --> 00:03:51,330
‫de tanımlamamız gerekiyor.

56
00:03:51,360 --> 00:03:55,830
‫Bu yüzden işlevi, oyuncu girişi bileşeninin hemen altında tanımlayacağım.

57
00:03:55,830 --> 00:04:00,660
‫Bu yüzden hiçbir girdi parametresi olmadan oyuna başlamak geçersiz olacaktır.

58
00:04:00,870 --> 00:04:06,840
‫Fonksiyon gövdesi var ve ayrıca fonksiyon adını sabitleyen bir ön tanka ihtiyacımız var.

59
00:04:06,840 --> 00:04:09,930
‫Artık oyunda süper büyük aramanın önemli olduğunu biliyoruz.

60
00:04:09,930 --> 00:04:17,010
‫Bu şekilde, begin play işlevindeki ve herhangi bir üst sınıftaki herhangi bir işlev çağrılmaya devam edecektir.

61
00:04:17,340 --> 00:04:18,960
‫İşte oyuna başlıyoruz.

62
00:04:18,990 --> 00:04:22,560
‫Burası denetleyicimizi alabileceğimiz ve bir değişkende saklayabileceğimiz yerdir.

63
00:04:22,560 --> 00:04:25,920
‫Şimdi Tank H'ye geri dönelim ve bir değişken oluşturalım.

64
00:04:25,920 --> 00:04:30,750
‫Şimdi bu özel olacak ve onu buraya, özel bölümün altına yapıştıracağım

65
00:04:30,750 --> 00:04:38,460
‫ve bir oyuncu denetleyicisi işaretçi türü olacak ve buna oyuncu denetleyicisi ref diyebiliriz.

66
00:04:38,460 --> 00:04:40,920
‫Bu, oyuncu kontrolörüne referansımız olacaktır.

67
00:04:40,950 --> 00:04:43,590
‫Şimdi bir C++ referansından bahsetmiyoruz.

68
00:04:43,590 --> 00:04:48,750
‫Bu hala sadece bir işaretçidir, ancak bunu oyuncu denetleyicisine başvurmak için kullanacağız.

69
00:04:48,750 --> 00:04:55,560
‫Şimdi A player controller tipinde bir player controller ref değişkenimiz var ve controller'ı bu pointer'da

70
00:04:55,590 --> 00:04:57,600
‫saklamaya hazırız.

71
00:04:57,600 --> 00:05:02,730
‫Şimdi Tank Dot CP'ye geri dönelim ve oynamaya başlayıp bunu yapmaya çalışalım.

72
00:05:02,730 --> 00:05:03,330
‫Evet.

73
00:05:03,400 --> 00:05:12,100
‫Yapacağım şey oyuncu, kontrolör, hakem eşittir demek ve kontrolörü al'ı çağırmaya çalışmak olacak.

74
00:05:12,880 --> 00:05:17,440
‫Şimdi bahsettiğim gibi kontrolör -- sınıfında olsun.

75
00:05:17,470 --> 00:05:24,070
‫Sağ tıklayıp tanıma gidelim ve bu işlevin bir A denetleyicisi döndürdüğüne dikkat edelim.

76
00:05:24,100 --> 00:05:29,020
‫Şimdi değişkenimiz bir kontrolör değil, A oyuncu kontrolörü tipindedir.

77
00:05:29,020 --> 00:05:35,260
‫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

78
00:05:35,260 --> 00:05:40,270
‫almak ve bunu bir A oyuncu kontrolör işaretçisinde saklamaya çalışmaktır.

79
00:05:40,300 --> 00:05:42,330
‫Burada kırmızı dalgalı çizgiyi gördüğümüze dikkat edin.

80
00:05:42,340 --> 00:05:43,940
‫Türünde bir değer olduğunu söylüyor.

81
00:05:43,960 --> 00:05:48,080
‫Bir denetleyici işaretçisi, türdeki bir varlığa atanamaz.

82
00:05:48,100 --> 00:05:49,630
‫Bir oyuncu kumandası.

83
00:05:49,660 --> 00:05:51,210
‫Bir hata alıyoruz.

84
00:05:51,220 --> 00:05:55,390
‫Şimdi bir kontrolörün belgelerine göz atalım.

85
00:05:55,420 --> 00:05:56,400
‫Bir göz atın.

86
00:05:56,410 --> 00:05:58,030
‫İşte bir kontrolör.

87
00:05:58,030 --> 00:06:00,460
‫Ve miras, hiyerarşi diyor.

88
00:06:00,460 --> 00:06:05,690
‫Ve bir kontrolörün altında bir kontrolör ve bir oyuncu kontrolörü görüyoruz.

89
00:06:05,710 --> 00:06:10,210
‫Bu, bir oyuncu kontrolörünün bir kontrolörün alt sınıfı olduğu anlamına gelir.

90
00:06:10,240 --> 00:06:14,500
‫Şimdi, C++'da, tipte bir işaretçiye sahip olamayız.

91
00:06:14,530 --> 00:06:20,200
‫Bir oyuncu kontrolörü bir A kontrolörünün adresinin değerini saklar.

92
00:06:20,530 --> 00:06:22,600
‫Bir kontrolör ana tiptir.

93
00:06:22,780 --> 00:06:25,450
‫Bir oyuncu kontrolörü alt tiptir.

94
00:06:25,450 --> 00:06:30,960
‫Üst tipte bir nesneyi alıp alt tipte bir göstericide saklayamazsınız.

95
00:06:30,970 --> 00:06:32,680
‫Peki bunu nasıl aşacağız?

96
00:06:32,680 --> 00:06:34,000
‫İşte sorunumuz.

97
00:06:34,000 --> 00:06:38,630
‫get controller işlevi bir A denetleyicisinin adresini döndürür.

98
00:06:38,650 --> 00:06:44,410
‫Şimdi, bu bir A denetleyici işaretçisinde saklayabileceğimiz bir şeydir, ancak bunu bir A oyuncu denetleyici işaretçisinde

99
00:06:44,410 --> 00:06:45,410
‫saklayamayız.

100
00:06:45,430 --> 00:06:52,000
‫Komik olan şey ise get controller tarafından döndürülen nesnenin aslında bir oyuncu denetleyicisi olmasıdır.

101
00:06:52,000 --> 00:06:58,630
‫Yani bu adrese bir A denetleyici işaretçisi şeklinde sahibiz ve bunun bir oyuncu denetleyicisini sakladığını biliyoruz,

102
00:06:58,630 --> 00:07:03,910
‫ancak bir A denetleyicisi şeklinde sahipsek, bir oyuncu denetleyicisinde bulunduğu için ihtiyacımız

103
00:07:03,910 --> 00:07:06,210
‫olan işleve erişemeyiz.

104
00:07:06,220 --> 00:07:08,810
‫İşlev, imleç altında isabet sonucu almak olarak adlandırılır.

105
00:07:08,830 --> 00:07:15,250
‫Şimdi, A tipi bir denetleyici işaretçisine sahipsek ve bir oyuncu denetleyicisinde var olan

106
00:07:15,250 --> 00:07:18,430
‫bu işlevi almaya çalışırsak, bunu yapamayız.

107
00:07:18,460 --> 00:07:20,020
‫Bir derleme hatası alacağız.

108
00:07:20,020 --> 00:07:25,960
‫Nesnenin kendisinin bir oyuncu denetleyicisi olduğunu bildiğimiz için, sadece bir A denetleyici işaretçisinde saklanır.

109
00:07:25,960 --> 00:07:27,610
‫Bu sorunu nasıl aşabiliriz?

110
00:07:27,610 --> 00:07:29,980
‫Cevap, oyuncu seçmemiz gerektiği.

111
00:07:30,010 --> 00:07:36,100
‫Bir kontrolörün ana sınıf ve bir oyuncu kontrolörünün de alt sınıf olduğunu biliyoruz.

112
00:07:36,100 --> 00:07:41,320
‫Ve bir A oyuncu kontrolörü işaretçisinde saklanan bir A kontrolörüne sahip olamayacağımızı biliyoruz.

113
00:07:41,320 --> 00:07:46,750
‫Diğer yoldan gidebileceğimizi ve bir oyuncu denetleyicisinin nesnesi olan bir A denetleyici işaretçi deposuna sahip olabileceğimizi

114
00:07:46,750 --> 00:07:47,530
‫biliyoruz.

115
00:07:47,620 --> 00:07:53,290
‫Aslında get controller'ı çağırdığımızda gördüğümüz şey budur, bir A oyuncu denetleyicisine işaret eden bir A

116
00:07:53,290 --> 00:07:55,120
‫denetleyici işaretçisi döndürür.

117
00:07:55,120 --> 00:08:01,810
‫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

118
00:08:01,810 --> 00:08:05,920
‫dönüştürmek için cast adı verilen özel bir işlev kullanabiliriz.

119
00:08:05,920 --> 00:08:13,720
‫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

120
00:08:13,720 --> 00:08:15,640
‫pointer türüne değiştirir.

121
00:08:15,670 --> 00:08:21,430
‫Şimdi, geçersiz bir türe döküm yapmaya çalışırsak, örneğin, bir oyuncu denetleyici nesnesine işaret eden bir A

122
00:08:21,430 --> 00:08:23,140
‫denetleyici işaretçimiz olur.

123
00:08:23,140 --> 00:08:30,070
‫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

124
00:08:30,070 --> 00:08:30,820
‫söyleriz.

125
00:08:30,820 --> 00:08:33,160
‫Yani döküm işlevi şöyle görünür.

126
00:08:33,190 --> 00:08:36,790
‫Tıpkı varsayılan alt nesne oluşturmak gibi bir şablondur.

127
00:08:36,790 --> 00:08:42,850
‫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

128
00:08:42,850 --> 00:08:44,230
‫yaptığımız türdür.

129
00:08:44,230 --> 00:08:45,400
‫Bu yüzden bu türü geçiyoruz.

130
00:08:45,400 --> 00:08:51,700
‫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

131
00:08:51,700 --> 00:08:52,570
‫geçiriyoruz.

132
00:08:52,570 --> 00:08:53,710
‫İşte bir örnek.

133
00:08:53,710 --> 00:08:59,410
‫Diyelim ki bir oyuncu denetleyicisine ve A denetleyici tipinde bir işaretçiye döküm yapmak istiyoruz.

134
00:08:59,410 --> 00:09:04,240
‫İşaretçiyi parantezlerin içine ve döküm yaptığımız türü köşeli parantezlerin içine aktarıyoruz.

135
00:09:04,240 --> 00:09:08,590
‫Ve döndürülen şey, A oyuncu denetleyicisi işaretçisi türünde bir değerdir.

136
00:09:08,590 --> 00:09:13,720
‫İşte köşeli parantezler içinde türü geçirdiğimiz fonksiyon çağrısı ve get controller'dan

137
00:09:13,720 --> 00:09:18,550
‫döndürdüğümüz A controller pointer değeri parantezler içine girebilir.

138
00:09:18,550 --> 00:09:22,630
‫Bu yüzden get controller'dan döndürülen bu değeri cast etmemiz gerekiyor.

139
00:09:22,630 --> 00:09:24,250
‫Bu sizin mücadeleniz olacak.

140
00:09:24,250 --> 00:09:31,840
‫Begin Play'de get controller işlevini kullanın ve bu değeri cast işlevine aktarın ve bir oyuncu denetleyicisine

141
00:09:31,840 --> 00:09:33,550
‫aktarın.

142
00:09:33,550 --> 00:09:40,120
‫Ve sonra sonucu, A tipi oyuncu denetleyicisi işaretçisi olan oyuncu denetleyicisi ref işaretçimizde saklayabilirsiniz.

143
00:09:40,120 --> 00:09:42,580
‫Videoyu duraklatın ve alçıyı gerçekleştirin.

144
00:09:45,530 --> 00:09:45,860
‫Tamam.

145
00:09:45,860 --> 00:09:49,570
‫Neredeyse tüm işi hallettik, sadece döküm yapmamız gerekiyor.

146
00:09:49,580 --> 00:09:56,000
‫Bu yüzden yapacağımız şey, açılı parantezlerin yanı sıra parantezlere de sahip olan cast fonksiyonunu çağırmaktır.

147
00:09:56,000 --> 00:09:59,990
‫Parantezin içinde yer alan değer ise atmak istediğimiz değerdir.

148
00:09:59,990 --> 00:10:05,060
‫Şimdi get controller, A Tipi denetleyicinin bir işaretçisini döndürür.

149
00:10:05,060 --> 00:10:07,850
‫Bunu tam burada parantezin içine taşıyacağım.

150
00:10:07,850 --> 00:10:12,110
‫Ve döküm yaptığımız tür bir oyuncu kontrolörüdür.

151
00:10:14,050 --> 00:10:17,620
‫Yani yine get comptroller tarafından döndürülen değeri alıyoruz.

152
00:10:17,620 --> 00:10:21,160
‫Bu, bir comptroller işaretçisi veya bir adres döndürür.

153
00:10:21,160 --> 00:10:25,000
‫Sonra bunu bir A oyuncu denetleyicisine atmak için cast kullanıyoruz.

154
00:10:25,000 --> 00:10:31,330
‫Kapı denetleyicisi tarafından döndürülen nesnenin bir A denetleyici işaretçisinde saklanan bir A oyuncu denetleyici nesnesi olduğunu

155
00:10:31,330 --> 00:10:32,320
‫biliyoruz.

156
00:10:32,320 --> 00:10:38,500
‫Bunu attıktan sonra, döndürülen şey A oyuncu denetleyicisi türünde bir işaretçidir.

157
00:10:38,500 --> 00:10:41,410
‫Bu yüzden bunu oyuncu kontrolörü ref'inde saklıyoruz.

158
00:10:41,410 --> 00:10:46,990
‫Artık denetleyiciye bir A oyuncu denetleyici işaretçisi biçiminde erişebildiğimize göre, imlecin altındaki

159
00:10:46,990 --> 00:10:50,830
‫izleme vuruşu sonucunu almak için ihtiyaç duyduğumuz işleve erişebiliriz.

160
00:10:50,830 --> 00:10:55,570
‫Özetle, denetleyiciye erişmek için get controller kullandık.

161
00:10:55,930 --> 00:11:03,670
‫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.

162
00:11:03,670 --> 00:11:10,000
‫Şimdi ihtiyacımız olan fonksiyona erişebiliriz, bu da A player controller sınıfında bulunan cursor altındaki isabet

163
00:11:10,000 --> 00:11:11,290
‫sonuçlarını almaktır.

164
00:11:11,290 --> 00:11:14,500
‫Bu yüzden bir sonraki videoda bu fonksiyonu kullanmaya başlayacağız.

165
00:11:14,860 --> 00:11:15,850
‫Yakında görüşürüz.

