﻿1
00:00:04,290 --> 00:00:05,340
‫Merhaba ve hoş geldiniz.

2
00:00:05,340 --> 00:00:11,610
‫Bu derste, C++'da bir ateş düğümü uygulayarak düşmanımızı daha büyük bir tehdit haline getireceğiz.

3
00:00:11,610 --> 00:00:13,800
‫Şimdi nasıl yapılacağını görelim.

4
00:00:14,580 --> 00:00:19,980
‫Dolayısıyla, davranış ağacımızda açıkça eksik olan bir işlevsellik parçası, ateş etme yeteneğidir.

5
00:00:19,980 --> 00:00:24,930
‫İdeal olarak yapmak istediğim şey oyuncunun bulunduğu yere gitmek ve sonra ateş etmek.

6
00:00:24,930 --> 00:00:28,560
‫Ama önce hareketi nasıl yaptığımızı biraz değiştirmek istiyoruz.

7
00:00:28,560 --> 00:00:33,150
‫Değiştirmek istediğim birkaç şey var, bu yüzden Düğüme taşı'yı seçersem, değiştirmek istediğim şeylerden

8
00:00:33,150 --> 00:00:34,290
‫biri yarıçap.

9
00:00:34,290 --> 00:00:39,990
‫Düşmanın bana doğru gelmesini istemiyorum, bu yüzden kabul edilebilir yarıçapı değiştirirsem, benden

10
00:00:39,990 --> 00:00:42,930
‫beş metre uzakta hareket etmeyi bırakacak.

11
00:00:42,930 --> 00:00:43,740
‫Bu yüzden duracak.

12
00:00:43,740 --> 00:00:45,690
‫Bana güzel bir beş metre mesafe ver.

13
00:00:45,690 --> 00:00:46,650
‫Bana doğru geliyor, işte böyle.

14
00:00:46,650 --> 00:00:48,180
‫Ve durup bakıyor.

15
00:00:48,180 --> 00:00:53,670
‫Şimdi yapmak istediğim bir diğer şey ise aşağıda, karatahta bölümünde, gözlemlenen bir karatahta değeri olduğunu

16
00:00:53,670 --> 00:00:54,780
‫görebilirsiniz.

17
00:00:54,780 --> 00:00:58,470
‫Eğer bunu kontrol ettirmezsek, ben hareket ettikçe neler olacağını görelim.

18
00:00:58,500 --> 00:01:03,660
‫Temel olarak ve daha küçük bir kabul edilebilir yarıçapımız olduğunda bu biraz daha belirgindi.

19
00:01:03,660 --> 00:01:06,780
‫Şimdi bunu beş dörde indirelim.

20
00:01:06,990 --> 00:01:09,840
‫Ve eğer oynat tuşuna basarsam, hareket ettiğimi görebilirsiniz.

21
00:01:09,840 --> 00:01:14,940
‫Son konumuma gidiyor ve ancak oraya ulaştığında bir güncelleme yapıyor.

22
00:01:14,940 --> 00:01:16,320
‫İstediğimiz bu değil.

23
00:01:16,320 --> 00:01:19,530
‫İstediğimiz şey sürekli olarak bize doğru gelmesidir.

24
00:01:19,530 --> 00:01:25,320
‫Ve eğer observe blackboard değerini kontrol ederseniz, esasen söylediği şey, oyuncu konumu

25
00:01:25,320 --> 00:01:30,180
‫her değiştiğinde, nereye hareket ettiğimizi güncelleyeceğimizdir.

26
00:01:30,180 --> 00:01:37,770
‫Eğer devam edip oynat tuşuna basar ve hareket edersem, beni sürekli takip ettiğini ve yolunu güncellediğini görebilirsiniz.

27
00:01:37,770 --> 00:01:39,180
‫Biz de tam olarak bunu istiyoruz.

28
00:01:39,180 --> 00:01:43,830
‫Şimdi kabul yarıçapımızı 500 olarak değiştirebiliriz ve daha az belirgin hale gelir.

29
00:01:43,830 --> 00:01:47,250
‫Ancak yine de orada gözlemlediğimiz kara tahta değerine sahip olmamız iyi bir şey.

30
00:01:47,250 --> 00:01:53,220
‫Ve sonra istediğimiz davranış, yarıçapımıza yaklaştığında durup bize ateş

31
00:01:53,220 --> 00:01:54,330
‫etmesidir.

32
00:01:54,330 --> 00:01:56,730
‫Bunun için yeni bir görev türüne ihtiyacımız var.

33
00:01:56,730 --> 00:01:58,950
‫Bu yüzden burada yeni bir C++ görevi oluşturacağız.

34
00:01:58,950 --> 00:02:02,100
‫Bu yüzden yeni, yeni C++ sınıfı ekleyeceğiz.

35
00:02:02,100 --> 00:02:06,990
‫Sonra gidip tüm sınıfları göstereceğiz ve beat görevini arayacağız.

36
00:02:07,020 --> 00:02:12,030
‫Şimdi, hangisini istiyoruz, ritim görevi düğümünü mü yoksa ritim görevi karatahta tabanını mı?

37
00:02:12,030 --> 00:02:16,500
‫Aslında anahtar kullanmamıza gerek yok çünkü sadece ateş etmeyi deneyeceğiz.

38
00:02:16,500 --> 00:02:17,520
‫Yapacağımız tek şey bu.

39
00:02:17,520 --> 00:02:23,520
‫Silahımızın tetiğini çekeceğiz ya da nişan alma işlemini davranış ağacımızın başka bir yerinde yapacağız.

40
00:02:23,610 --> 00:02:31,650
‫Buradaki temel sınıf olan görev düğümünü açalım ve bu görevi beat görevi olarak adlandıralım.

41
00:02:32,420 --> 00:02:33,320
‫Alt çizgi.

42
00:02:33,350 --> 00:02:34,190
‫Ateş et.

43
00:02:34,760 --> 00:02:36,700
‫Devam edelim ve bu sınıfı oluşturalım.

44
00:02:36,710 --> 00:02:39,470
‫O zaman böyle bir şeyle karşılaşırız.

45
00:02:39,470 --> 00:02:41,960
‫Bu yüzden aynı kurulumu yapmak istiyoruz.

46
00:02:41,960 --> 00:02:47,690
‫Bu nedenle, kara tahtamız için sahip olduğumuz aynı tür kurulumu yapmanız için size küçük bir meydan okuma, kara tahta

47
00:02:47,690 --> 00:02:48,920
‫değerini temizleyin.

48
00:02:48,920 --> 00:02:52,220
‫Bir adımız olsun istiyoruz, bir yürütme görevimiz olsun istiyoruz.

49
00:02:52,220 --> 00:02:54,020
‫Şimdi videoyu varsayalım ve bunu deneyelim.

50
00:02:54,050 --> 00:02:54,920
‫Tamam, tekrar hoş geldin.

51
00:02:54,920 --> 00:02:56,480
‫Yani bu küçük bir görevdi.

52
00:02:56,480 --> 00:03:02,330
‫İmzaları, halka açık ve korumalı bölümler de dahil olmak üzere, çekim yapmak için şeffaf bir karatahta

53
00:03:02,330 --> 00:03:04,610
‫değerinden kopyalayacağım.

54
00:03:04,610 --> 00:03:07,640
‫Yapıcımızın adını değiştireceğim.

55
00:03:07,640 --> 00:03:10,130
‫Devam edeceğim ve kurucumuzu uygulayacağım.

56
00:03:10,130 --> 00:03:12,050
‫Peki yapmamız gereken neydi?

57
00:03:12,080 --> 00:03:16,490
‫Düğüm adını çekime eşit olarak ayarlamamız gerekiyordu.

58
00:03:16,490 --> 00:03:17,690
‫Biz de öyle diyeceğiz.

59
00:03:17,690 --> 00:03:23,420
‫Daha sonra çekim görevi için başlığa geri dönüyoruz ve şimdi yürütme görevini uygulamaya çalışacağız

60
00:03:23,420 --> 00:03:25,820
‫ve sadece super'i çağırmamız gerekiyor.

61
00:03:25,820 --> 00:03:32,600
‫Bu yüzden bunu clear blackboard value CP dosyamızdan kopyalayacağım ve sonra uygulamaya başlamaya hazırız.

62
00:03:32,600 --> 00:03:37,220
‫Burada yapmamız gereken ilk şey, biraz daha yer açalım, piyonumuzu

63
00:03:37,220 --> 00:03:39,860
‫ele geçirmemiz gerekecek.

64
00:03:39,860 --> 00:03:41,540
‫Neden piyonumuzu ele geçirmemiz gerekiyor?

65
00:03:41,540 --> 00:03:45,020
‫Peki, bir piyon olan nişancı karakterine bir göz atalım.

66
00:03:45,020 --> 00:03:46,580
‫Tetikçi karakterini hatırlıyor musun?

67
00:03:46,580 --> 00:03:48,890
‫Dot H'nin bir atış yöntemi var.

68
00:03:48,890 --> 00:03:54,770
‫Bu, esasen oyuncunun yaptığının aynısını yapmak istediğimiz şeydir.

69
00:03:54,770 --> 00:03:58,460
‫Tetik düğmesini basılı tutuyor ve bu ateş etme yöntemini çağırıyor.

70
00:03:58,460 --> 00:04:01,100
‫Yapay zekanın da aynısını yapabilmesini istiyoruz.

71
00:04:01,100 --> 00:04:06,830
‫Ateş etme görevine sahip olduğunuzda, tetik düğmesini basılı tutacak veya tetik düğmesine tekrar tekrar basacaktır,

72
00:04:06,830 --> 00:04:10,070
‫bu nedenle yürütme görevi bunu yapmak için doğru yer olacaktır.

73
00:04:10,100 --> 00:04:15,260
‫Muhtemelen buraya geri döneceğiz, çünkü unutmayın, bu eylem sadece bir atış.

74
00:04:15,260 --> 00:04:16,760
‫Sürekli çekim değil.

75
00:04:16,760 --> 00:04:17,570
‫Ne yapacağız?

76
00:04:17,600 --> 00:04:22,430
‫Eğer başarılı olursak ET düğümü sonucunu başarılı olarak döndüreceğiz.

77
00:04:22,430 --> 00:04:28,430
‫Başarılı olsaydık, sürekli kene soğutmamıza gerek kalmazdı.

78
00:04:28,430 --> 00:04:32,630
‫Bu görevin tek bir kareden daha uzun süre çalışmasına ihtiyacımız yok.

79
00:04:32,630 --> 00:04:36,950
‫Yapmamız gereken bir diğer şey de, dediğim gibi, piyon sınıfını ele geçirmek.

80
00:04:36,950 --> 00:04:41,330
‫Şimdi size yapay zeka kontrolörünü nasıl ele geçirebileceğinizi göstereceğim.

81
00:04:41,330 --> 00:04:47,540
‫Ve AI denetleyicisinden, kontrol edilen piyonu almak için get pawn'ı çağırabileceğimizi biliyoruz.

82
00:04:47,540 --> 00:04:53,570
‫Ve bu kontrollü piyonu tetikçi karakter uygulamamıza aktarabileceğimizi biliyoruz.

83
00:04:53,570 --> 00:04:58,850
‫Peki buradan yapay zeka kontrolörüne nasıl ulaşacağız?

84
00:04:58,850 --> 00:05:03,560
‫Bir AI denetleyicisinde olduğunu bildiğimiz davranış ağacı bileşenimiz var.

85
00:05:03,560 --> 00:05:09,440
‫Belki de Yu davranış ağacı bileşenine gidip burada yardımcı olabilecek herhangi bir yönteme

86
00:05:09,440 --> 00:05:12,350
‫bakarsak kullanabileceğimiz bir şey vardır.

87
00:05:12,350 --> 00:05:18,140
‫Burada çok şey var, ancak denetleyiciyi ararsak, hiçbir şey görmüyoruz, ancak belki de temel sınıflarından

88
00:05:18,140 --> 00:05:24,560
‫birinde bir yerde, çünkü YU davranış ağacı bileşeninin üst sınıfı Yu beyin bileşenidir.

89
00:05:24,560 --> 00:05:27,350
‫Bunu takip edeceğiz ve burada kontrolör arayacağız.

90
00:05:27,350 --> 00:05:29,420
‫Bunun için bir özellik olduğunu görebilirsiniz.

91
00:05:29,450 --> 00:05:31,100
‫Bir alıcı var mı?

92
00:05:31,100 --> 00:05:38,840
‫Evet, get AI owner deniyor ve bir AI denetleyici işaretçisinin üzerine geldiğimizde geri dönmesi gerekiyor.

93
00:05:38,840 --> 00:05:44,450
‫Yani piyonu ele geçirmek için bunu kullanabilmeli, onu bir atıcı karaktere atabilmeli ve ardından ateş etme

94
00:05:44,450 --> 00:05:46,370
‫yöntemini çağırabilmelisiniz.

95
00:05:46,370 --> 00:05:51,740
‫Bu nedenle, shoot yöntemini çağırmak, herkese açık hale getirmek, piyonu almak, piyonu yayınlamak, çağırmak,

96
00:05:51,740 --> 00:05:56,480
‫shoot yapmak ve ardından davranış ağacınızda test etmek sizin göreviniz olacak.

97
00:05:56,480 --> 00:05:57,890
‫Videoyu duraklatın ve deneyin.

98
00:05:57,980 --> 00:05:58,280
‫Tamam.

99
00:05:58,280 --> 00:05:58,880
‫Tekrar hoş geldiniz.

100
00:05:58,880 --> 00:06:04,580
‫Her şeyden önce, ilk adım olarak bu shoot yöntemini public yapmamız gerekecek çünkü bu sınıfın

101
00:06:04,580 --> 00:06:07,280
‫dışından çağrılması gerekiyor.

102
00:06:07,280 --> 00:06:09,200
‫Bu yüzden sadece hasarı üstleneceğim.

103
00:06:09,200 --> 00:06:12,200
‫Ateş edeceğiz, ona biraz yer vereceğiz, biraz nefes aldıracağız.

104
00:06:12,200 --> 00:06:13,670
‫Beyaz alanın görmeme yardımcı olmasını seviyorum.

105
00:06:13,700 --> 00:06:14,540
‫Düşünmeme yardım et.

106
00:06:14,540 --> 00:06:17,240
‫Sonra BT görev çekimine gideceğiz.

107
00:06:17,240 --> 00:06:21,500
‫Öncelikle kontrolörümüzün null olup olmadığını kontrol edeceğiz.

108
00:06:21,500 --> 00:06:24,380
‫Aksi takdirde üzerinde ok operatörünü kullanamayız.

109
00:06:24,380 --> 00:06:27,140
‫Sadece genel olarak, bu boş kontrolleri yapmak için iyi bir uygulama.

110
00:06:27,140 --> 00:06:35,420
‫Yani bu AI sahibi eşit değilse, üzgünüm null pointer'a eşitse, bir hata ile erken dönmek isteyeceğiz.

111
00:06:35,420 --> 00:06:38,570
‫Yani bir yapay zeka denetleyicimiz yoksa bu görev başarısız olacaktır.

112
00:06:38,570 --> 00:06:39,920
‫Bu oldukça açık.

113
00:06:39,920 --> 00:06:43,730
‫Bu yüzden ET düğümü sonuç iki nokta üst üste dönüşü yapacağım.

114
00:06:43,730 --> 00:06:45,590
‫Kolon böyle başarısız oldu.

115
00:06:45,590 --> 00:06:52,580
‫Ve sonra sahip bileşenini yapacağız, AI sahibini alacağız, bunun üzerine -- alacağız.

116
00:06:52,580 --> 00:06:54,680
‫Aslında, buraya bir başlık dosyası eklememiz gerekebilir.

117
00:06:54,680 --> 00:07:02,240
‫Şimdi bir karma ekleme yapalım ve bu oyun çerçevesi ve denetleyici olacak.

118
00:07:02,240 --> 00:07:08,240
‫Ve aslında bence, evet, herhangi bir kontrolör işe yaramalı, ama bence AI kontrolörüne ihtiyacımız var

119
00:07:08,240 --> 00:07:13,250
‫çünkü bu geri döndüğümüz işaretçinin türü ve sonra bir ok yapacağız ve burada dosya kafamdaki

120
00:07:13,250 --> 00:07:16,850
‫bir şey hakkında şikayet eden bir get piyonu yapacağız.

121
00:07:16,850 --> 00:07:18,620
‫Belki de doğru anlamadığım bir şey vardır.

122
00:07:18,620 --> 00:07:21,440
‫Yani ileri eğik çizgi, yanlış anlamışım gibi görünüyor.

123
00:07:21,440 --> 00:07:23,000
‫Aslında oyun çerçevesi içinde değil.

124
00:07:23,000 --> 00:07:26,300
‫Bunu dahil etmek için sadece bir kontrol cihazınız var.

125
00:07:26,300 --> 00:07:28,640
‫Bu konuda bu kadar umursamaz olduğum için bana ders ver.

126
00:07:28,640 --> 00:07:29,180
‫İşte böyle.

127
00:07:29,180 --> 00:07:31,040
‫Şimdi piyonu alabiliriz.

128
00:07:32,100 --> 00:07:34,890
‫Ve dediğim gibi, bir oyuncu kadrosu da yapmamız gerekiyor.

129
00:07:34,890 --> 00:07:41,610
‫Bu yüzden, atıcı karakterin A'sına hangi tipte atmamız gerektiğine dair bir döküm yapacağız.

130
00:07:41,610 --> 00:07:45,780
‫Yani bu tam anlamıyla bir nişancı karakteri, bir nişancı karakteri.

131
00:07:45,780 --> 00:07:48,990
‫Ve bunun sonucunu da kontrol etmemiz gerekecek.

132
00:07:48,990 --> 00:07:51,360
‫Ancak atıcı karakterimizi de dahil etmemiz gerekiyor.

133
00:07:51,360 --> 00:07:55,650
‫Yani hash en üstte atıcı karakteri içerir.

134
00:07:56,040 --> 00:07:57,000
‫Todd H.

135
00:07:57,570 --> 00:08:02,100
‫Bunun gibi ve bunu bir işaretçi tipi atıcı karakterinde saklayacağız.

136
00:08:02,100 --> 00:08:04,440
‫Star bizim karakterimiz olacak.

137
00:08:04,650 --> 00:08:05,430
‫Biz de öyle diyeceğiz.

138
00:08:05,430 --> 00:08:06,510
‫Orada saklayacağız.

139
00:08:06,870 --> 00:08:14,070
‫Ve temel olarak, göz o anda bir piyonu kontrol etmiyorsa get'in null dönebileceğinden

140
00:08:14,070 --> 00:08:17,520
‫emin olmamız gerekir.

141
00:08:18,310 --> 00:08:25,810
‫Ya da bu döküm, karakterin farklı bir -- türünü kontrol etmesi durumunda tür bir sorun değilse null döndürebilir.

142
00:08:25,840 --> 00:08:30,640
‫Neyse ki, bu ikisi birlikte oldukça iyi gider, bu nedenle bir null pointer'ı cast etmeye çalışırsanız, sonuç sadece

143
00:08:30,640 --> 00:08:33,040
‫bir null pointer olur, bu yüzden bunu yapabiliriz.

144
00:08:33,130 --> 00:08:34,870
‫Bu kontrollerin hepsi tek bir satırda.

145
00:08:35,380 --> 00:08:37,690
‫Sonra bir if karakteri yapabiliriz.

146
00:08:39,150 --> 00:08:41,250
‫Null işaretçisine eşittir.

147
00:08:42,390 --> 00:08:44,670
‫O zaman tekrar başarısız olmak isteriz.

148
00:08:44,670 --> 00:08:45,960
‫O zaman geri dön.

149
00:08:46,990 --> 00:08:49,090
‫ET düğümü sonucu.

150
00:08:49,480 --> 00:08:49,900
‫Kolon.

151
00:08:49,900 --> 00:08:51,910
‫Kolon böyle başarısız oldu.

152
00:08:51,910 --> 00:08:56,260
‫Ve son olarak, tüm bu kontrollerden sonra ve kendimize bir nişancı

153
00:08:56,260 --> 00:09:04,810
‫karakteri bulduğumuzu bildiğimize göre, ateş et karakterine ok ve ateş et diyebilmeliyiz, böylece sonunda ateş edebileceğiz.

154
00:09:04,810 --> 00:09:07,570
‫Davranış ağacımıza gidelim.

155
00:09:07,840 --> 00:09:15,070
‫Ve burada yeni bir düğüm yerleştirmek için aşağı çekmek ve burada sahip olduğumuz yeni çekim görevini aramak

156
00:09:15,070 --> 00:09:16,330
‫isteyeceğiz.

157
00:09:16,330 --> 00:09:20,680
‫Ve derleyip derlemediğimden emin değilim, bu yüzden her şeyin tekrar derlendiğinden emin olacağım.

158
00:09:20,680 --> 00:09:25,870
‫Ve bu bittiğinde, gidip oynat düğmesine basabiliriz ve bu adamın gelip ateş edip etmediğini görebiliriz.

159
00:09:26,560 --> 00:09:27,400
‫Evet, öyle.

160
00:09:27,400 --> 00:09:32,860
‫Ne yazık ki, sürekli ateş ediyor ve kendi ayağına kurşun sıkıyor.

161
00:09:32,860 --> 00:09:35,950
‫Yani orada bir şeyler tam olarak doğru yazılmıyor.

162
00:09:35,950 --> 00:09:37,900
‫Yani iki şey yanlış gidiyor.

163
00:09:37,900 --> 00:09:43,330
‫Başlangıç olarak, iki atışla kendini öldürmeyi başardı ve ayrıca her karede ateş ediyor gibi görünüyor,

164
00:09:43,330 --> 00:09:48,160
‫bu da mantıklı çünkü oyuncuyu görüyoruz, onlara doğru hareket ediyoruz ve sonra ateş etmek burada

165
00:09:48,160 --> 00:09:52,210
‫sahip olduğumuz son eylem ve bunu tekrar tekrar gerçekleştireceğiz.

166
00:09:52,210 --> 00:09:56,350
‫Yani yapmak istediğimiz şey aslında bunu bir diziye dönüştürmek.

167
00:09:56,350 --> 00:10:00,280
‫Bu yüzden burada bir dizi düğümü oluşturmak adlı bir düğüm sürükleyeceğim.

168
00:10:00,280 --> 00:10:04,120
‫Ve yapacağımız şey ateş etmek, sonra beklemek, sonra ateş etmek, sonra beklemek ve bunu sonsuza kadar tekrarlamak

169
00:10:04,120 --> 00:10:04,810
‫olacak.

170
00:10:04,810 --> 00:10:07,690
‫O yüzden önce ateş et, biraz bekle.

171
00:10:07,690 --> 00:10:13,510
‫Belki de çekimler arasında 1/2 süre bekleriz ve sonra bunu bir dekoratörle yapabileceğimiz şekilde

172
00:10:13,510 --> 00:10:14,950
‫tekrarlamak isteriz.

173
00:10:14,950 --> 00:10:21,490
‫Dekoratör ekle'ye sağ tıklayıp döngü dekoratörünü ararsam, kaç kez dönmesini istediğinizi görebilirsiniz.

174
00:10:21,520 --> 00:10:22,540
‫Üç kez yazıyor.

175
00:10:22,540 --> 00:10:23,470
‫Üç kez istemiyoruz.

176
00:10:23,470 --> 00:10:29,020
‫Hareket etmemiz gerekene veya oyuncuyu gözden kaybedip gidip araştırmamız gerekene kadar temelde sonsuz döngüde

177
00:10:29,020 --> 00:10:30,340
‫olmasını istiyoruz.

178
00:10:30,430 --> 00:10:32,970
‫Bu yüzden devam edip oynat düğmesine basacağız ve çalışıp çalışmadığını göreceğiz.

179
00:10:32,990 --> 00:10:33,610
‫Bana doğru geliyor.

180
00:10:33,610 --> 00:10:35,890
‫Vuruyor, vuruyor, vuruyor.

181
00:10:35,890 --> 00:10:37,510
‫Ama aslında bana vurmuyor.

182
00:10:37,510 --> 00:10:41,860
‫Atışlarının aslında kendi üzerine düştüğünü görebilirsiniz.

183
00:10:42,520 --> 00:10:46,660
‫Ve bu hatayı gelecek bir konferansta ele alacağız.

184
00:10:46,660 --> 00:10:47,380
‫Orada görüşürüz.

