﻿1
00:00:04,380 --> 00:00:06,150
‫Witam ponownie.

2
00:00:06,240 --> 00:00:12,150
‫Teraz mamy ruch dla --, ale nie obracamy tej górnej części --, którą nazywamy

3
00:00:12,150 --> 00:00:12,920
‫wieżyczką.

4
00:00:12,930 --> 00:00:16,290
‫Chcielibyśmy więc móc to zrobić za pomocą naszej myszy.

5
00:00:16,320 --> 00:00:18,800
‫A teraz spójrz, co się tutaj dzieje.

6
00:00:18,810 --> 00:00:23,300
‫Gdy poruszam kursorem myszy po świecie, otrzymuję tę czerwoną kulę.

7
00:00:23,310 --> 00:00:27,060
‫To jest sfera debugowania, którą rysuję w przestrzeni 3D.

8
00:00:27,300 --> 00:00:33,600
‫Teraz zauważ, że kiedy poruszam się pod ścianą, ta kula porusza się na powierzchni ściany.

9
00:00:33,600 --> 00:00:40,410
‫Więc gdziekolwiek porusza się mój kursor myszy, odczuwam strach, który odpowiada dowolnemu obiektowi, w który

10
00:00:40,410 --> 00:00:43,620
‫uderzam, w oparciu o położenie mojego kursora.

11
00:00:43,620 --> 00:00:50,250
‫I to będzie dla nas przydatne, abyśmy mogli mieć miejsce w kosmosie, w którym moglibyśmy obracać

12
00:00:50,250 --> 00:00:51,200
‫naszą wieżę.

13
00:00:51,210 --> 00:00:57,570
‫Teraz, aby to zrobić, potrzebujemy pewnych funkcji na kontrolerze, więc musimy uzyskać dostęp do tych

14
00:00:57,570 --> 00:00:59,250
‫funkcji na kontrolerze.

15
00:00:59,250 --> 00:01:04,140
‫W tym filmie będziemy pracować nad ustawieniem tego i omówimy również, w jaki sposób

16
00:01:04,140 --> 00:01:07,080
‫będzie to obejmować koncepcję znaną jako casting.

17
00:01:07,080 --> 00:01:12,330
‫Powodem, dla którego chcemy kontrolera, jest to, że na kontrolerze znajdują się funkcje, które pozwalają

18
00:01:12,330 --> 00:01:14,820
‫nam uzyskać wynik trafienia pod kursorem.

19
00:01:14,820 --> 00:01:16,860
‫Teraz mówimy o kursorze myszy.

20
00:01:16,860 --> 00:01:20,310
‫Powiedzmy, że to jest nasz ekran, a oto nasz kursor myszy.

21
00:01:20,310 --> 00:01:25,530
‫Punkt na końcu kursora odpowiada miejscu na ekranie.

22
00:01:25,530 --> 00:01:31,740
‫Teraz, jeśli przesuniemy kursor, naszym celem jest, aby część wieży naszego czołgu, ta górna część

23
00:01:31,740 --> 00:01:37,290
‫naszej siatki, obróciła się tak, aby była zwrócona w kierunku tego kursora.

24
00:01:37,440 --> 00:01:44,370
‫Teraz, gdy przesuniemy kursor, na kontrolerze jest funkcja, której możemy użyć, aby uzyskać

25
00:01:44,370 --> 00:01:47,190
‫lokalizację odpowiadającą temu kursorowi.

26
00:01:47,190 --> 00:01:52,830
‫Gdybyśmy mieli narysować linię prosto od kamery w kierunku kursora i trafić w

27
00:01:52,830 --> 00:01:59,700
‫jakiś obiekt na świecie, moglibyśmy uzyskać tę lokalizację i użyć tej lokalizacji do ustawienia obrotu wieży czołgu.

28
00:01:59,730 --> 00:02:00,960
‫Pokażę ci, co mam na myśli.

29
00:02:00,960 --> 00:02:06,420
‫Teraz, aby uzyskać lokalizację trafienia odpowiadającą naszemu kursorowi, musimy użyć kontrolera.

30
00:02:06,420 --> 00:02:09,480
‫Porozmawiajmy teraz przez chwilę o kontrolerze.

31
00:02:09,780 --> 00:02:11,880
‫Powiedzmy, że mamy swojego pionka na świecie.

32
00:02:11,880 --> 00:02:13,950
‫Pionek będzie miał kontrolera.

33
00:02:14,130 --> 00:02:18,210
‫Jest to niewidzialny obiekt powiązany z pionkiem.

34
00:02:18,210 --> 00:02:24,180
‫Teraz dla naszego pionka nasz kontroler będzie miał kontroler gracza typu A i

35
00:02:24,180 --> 00:02:27,720
‫na początku gry kontroler będzie posiadał pionka.

36
00:02:27,750 --> 00:02:32,790
‫Dlatego widzimy z punktu widzenia kamery należącej do naszego pionka.

37
00:02:32,790 --> 00:02:34,890
‫Teraz możemy uzyskać dostęp do tego kontrolera.

38
00:02:34,920 --> 00:02:38,970
‫Nasza klasa czołgów dziedziczy funkcję o nazwie Get Controller.

39
00:02:38,970 --> 00:02:41,100
‫Jest odziedziczony po klasie --.

40
00:02:41,100 --> 00:02:46,950
‫Chcielibyśmy więc przechwycić ten kontroler i zapisać go w zmiennej, abyśmy mogli użyć go do uzyskania

41
00:02:46,950 --> 00:02:51,270
‫dostępu do funkcji, której potrzebujemy, aby uzyskać wynik trafienia pod kursorem.

42
00:02:51,270 --> 00:02:53,010
‫Więc przygotujmy się na to.

43
00:02:53,010 --> 00:02:58,650
‫Teraz jestem tutaj, w klasie czołgów, a miejscem, w którym musimy uzyskać dostęp do naszego kontrolera, jest rozpoczęcie gry.

44
00:02:58,680 --> 00:03:05,190
‫Jeśli zrobimy to w konstruktorze, to jest za wcześnie i możemy nie mieć jeszcze prawidłowego kontrolera.

45
00:03:05,190 --> 00:03:08,910
‫Więc będziemy potrzebować funkcji rozpoczęcia gry w klasie czołgów.

46
00:03:08,910 --> 00:03:14,250
‫Teraz mamy to tutaj w podstawowej klasie ponga i do tej pory tak naprawdę nie używamy rozpoczęcia gry w podstawowej

47
00:03:14,250 --> 00:03:15,090
‫klasie ponga.

48
00:03:15,270 --> 00:03:18,450
‫Więc chciałbym przenieść to do klasy czołgów.

49
00:03:18,450 --> 00:03:24,150
‫Więc zamierzam podkreślić rozpoczęcie gry, włączając komentarz i chronioną sekcję tutaj, i po

50
00:03:24,150 --> 00:03:25,500
‫prostu ją skrócę.

51
00:03:25,500 --> 00:03:28,710
‫A potem z powrotem na etapie czołgu, zamierzam to wkleić.

52
00:03:28,710 --> 00:03:33,960
‫Dodajmy tę chronioną sekcję tutaj, tuż nad sekcją prywatną, z rozpoczęciem gry w środku.

53
00:03:33,960 --> 00:03:36,270
‫Teraz usunęliśmy Rozpocznij grę z pionka podstawowego.

54
00:03:36,840 --> 00:03:41,430
‫Nie mamy go już tutaj, ale musimy go również usunąć z base pond cpp.

55
00:03:41,460 --> 00:03:42,240
‫Oto jest.

56
00:03:42,240 --> 00:03:48,960
‫Możemy iść dalej i usunąć go tutaj, a teraz mamy to zadeklarowane tutaj w Tank H, ale musimy

57
00:03:48,960 --> 00:03:51,330
‫również zdefiniować to w czołgu CPP.

58
00:03:51,360 --> 00:03:55,830
‫Więc zamierzam zdefiniować funkcję tuż pod komponentem wejściowym odtwarzacza konfiguracji.

59
00:03:55,830 --> 00:04:00,660
‫Więc to będzie void rozpocząć grę bez parametrów wejściowych.

60
00:04:00,870 --> 00:04:06,840
‫Jest ciało funkcji i potrzebujemy również zbiornika, który wstępnie ustala nazwę funkcji.

61
00:04:06,840 --> 00:04:09,930
‫Teraz wiemy, że ważne jest, aby sprawdzać bardzo duże w grze.

62
00:04:09,930 --> 00:04:16,320
‫W ten sposób wszystkie funkcje w funkcji begin play i dowolnej z klas nadrzędnych będą nadal

63
00:04:16,320 --> 00:04:17,010
‫wywoływane.

64
00:04:17,340 --> 00:04:18,960
‫Więc tutaj zaczynamy grę.

65
00:04:18,990 --> 00:04:22,560
‫Tutaj możemy pobrać nasz kontroler i przechowywać go w zmiennej.

66
00:04:22,560 --> 00:04:25,920
‫Wróćmy więc do Tanka H i stwórzmy zmienną.

67
00:04:25,920 --> 00:04:30,750
‫Teraz to będzie prywatne i zamierzam umieścić go tutaj na

68
00:04:30,750 --> 00:04:38,460
‫dole sekcji prywatnej i będzie to typ wskaźnika kontrolera gracza i możemy nazwać ten kontroler gracza ref.

69
00:04:38,460 --> 00:04:40,920
‫To będzie nasze odniesienie do kontrolera gracza.

70
00:04:40,950 --> 00:04:43,590
‫Teraz nie mówimy o odwołaniu do C++.

71
00:04:43,590 --> 00:04:48,750
‫To wciąż tylko wskaźnik, ale użyjemy go w odniesieniu do kontrolera gracza.

72
00:04:48,750 --> 00:04:55,560
‫Więc teraz mamy zmienną ref kontrolera odtwarzacza typu A kontroler odtwarzacza i jesteśmy gotowi do przechowywania

73
00:04:55,590 --> 00:04:57,600
‫kontrolera w tym wskaźniku.

74
00:04:57,600 --> 00:05:02,730
‫Wróćmy więc do Tank Dot CP, zacznijmy grać i spróbujmy to zrobić.

75
00:05:02,730 --> 00:05:03,330
‫Więc.

76
00:05:03,400 --> 00:05:12,100
‫Co mam zamiar zrobić, to powiedzieć player, controller, ref równa się i spróbuję wywołać get controller.

77
00:05:12,880 --> 00:05:17,440
‫Teraz pobierz kontroler, jak wspomniałem, znajduje się w klasie --.

78
00:05:17,470 --> 00:05:24,070
‫Kliknij prawym przyciskiem myszy i przejdź do definicji i zauważ, że ta funkcja zwraca kontroler A.

79
00:05:24,100 --> 00:05:29,020
‫Teraz nasza zmienna jest kontrolerem gracza typu A, a nie kontrolerem.

80
00:05:29,020 --> 00:05:35,260
‫Więc to, co próbujemy tutaj zrobić, to pobrać wartość zwracaną z get controller, która jest

81
00:05:35,260 --> 00:05:40,270
‫typem wskaźnika kontrolera i próbujemy zapisać ją we wskaźniku kontrolera odtwarzacza A.

82
00:05:40,300 --> 00:05:42,330
‫Zauważ, że widzimy tutaj czerwoną falistą.

83
00:05:42,340 --> 00:05:43,940
‫Mówi wartość typu.

84
00:05:43,960 --> 00:05:48,080
‫Nie można przypisać wskaźnika kontrolera do jednostki typu.

85
00:05:48,100 --> 00:05:49,630
‫Kontroler gracza.

86
00:05:49,660 --> 00:05:51,210
‫Otrzymujemy błąd.

87
00:05:51,220 --> 00:05:55,390
‫Przyjrzyjmy się tutaj dokumentacji kontrolera.

88
00:05:55,420 --> 00:05:56,400
‫Spójrz.

89
00:05:56,410 --> 00:05:58,030
‫Oto kontroler.

90
00:05:58,030 --> 00:06:00,460
‫I mówi o dziedziczeniu, hierarchii.

91
00:06:00,460 --> 00:06:05,690
‫A pod kontrolerem widzimy kontroler i kontroler gracza.

92
00:06:05,710 --> 00:06:10,210
‫Oznacza to, że kontroler gracza jest klasą podrzędną kontrolera.

93
00:06:10,240 --> 00:06:14,500
‫Teraz w C++ nie możemy mieć wskaźnika typu.

94
00:06:14,530 --> 00:06:20,200
‫Kontroler gracza przechowuje wartość adresu kontrolera A.

95
00:06:20,530 --> 00:06:22,600
‫Kontroler jest typem nadrzędnym.

96
00:06:22,780 --> 00:06:25,450
‫Kontroler gracza jest typem podrzędnym.

97
00:06:25,450 --> 00:06:30,960
‫Nie można wziąć obiektu typu rodzica i przechowywać go we wskaźniku typu podrzędnego.

98
00:06:30,970 --> 00:06:32,680
‫Jak więc obejść ten problem?

99
00:06:32,680 --> 00:06:34,000
‫Oto nasz problem.

100
00:06:34,000 --> 00:06:38,630
‫Funkcja get controller zwraca adres kontrolera A.

101
00:06:38,650 --> 00:06:44,410
‫To jest coś, co moglibyśmy przechowywać we wskaźniku kontrolera A, ale nie możemy tego przechowywać we wskaźniku kontrolera

102
00:06:44,410 --> 00:06:45,410
‫odtwarzacza A.

103
00:06:45,430 --> 00:06:52,000
‫Zabawne jest jednak to, że obiekt zwracany przez kontroler get jest w rzeczywistości kontrolerem gracza.

104
00:06:52,000 --> 00:06:58,630
‫Więc mamy ten adres w postaci wskaźnika kontrolera A i wiemy, że przechowuje on kontroler gracza, ale jeśli

105
00:06:58,630 --> 00:07:03,910
‫mamy go w postaci kontrolera A, nie możemy uzyskać dostępu do potrzebnej funkcji, ponieważ

106
00:07:03,910 --> 00:07:06,210
‫istnieje on na kontrolerze gracza .

107
00:07:06,220 --> 00:07:08,810
‫Funkcja nazywa się get hit hit pod kursorem.

108
00:07:08,830 --> 00:07:15,250
‫Teraz, jeśli mamy wartość wskaźnika kontrolera typu A i próbujemy pobrać tę funkcję, która istnieje na kontrolerze

109
00:07:15,250 --> 00:07:18,430
‫gracza, nie uda nam się tego zrobić.

110
00:07:18,460 --> 00:07:20,020
‫Otrzymamy błąd kompilacji.

111
00:07:20,020 --> 00:07:25,960
‫Ponieważ wiemy, że sam obiekt jest kontrolerem gracza, jest on po prostu przechowywany we wskaźniku kontrolera A.

112
00:07:25,960 --> 00:07:27,610
‫Jak obejść ten problem?

113
00:07:27,610 --> 00:07:29,980
‫Odpowiedź brzmi: musimy rzucić.

114
00:07:30,010 --> 00:07:36,100
‫Wiemy, że kontroler jest klasą nadrzędną, a kontroler gracza jest klasą podrzędną.

115
00:07:36,100 --> 00:07:41,320
‫I wiemy, że nie możemy przechowywać kontrolera A we wskaźniku kontrolera odtwarzacza A.

116
00:07:41,320 --> 00:07:46,750
‫Wiemy, że możemy pójść na odwrót i mieć magazyn wskaźników kontrolera A, obiekt kontrolera

117
00:07:46,750 --> 00:07:47,530
‫gracza.

118
00:07:47,620 --> 00:07:53,290
‫To właśnie widzimy, kiedy wywołujemy get controller, zwraca on wskaźnik kontrolera A, który wskazuje

119
00:07:53,290 --> 00:07:55,120
‫na kontroler gracza A.

120
00:07:55,120 --> 00:08:01,810
‫Więc jeśli mamy wartość wskaźnika kontrolera typu A, możemy użyć specjalnej funkcji zwanej rzutowaniem, aby

121
00:08:01,810 --> 00:08:05,920
‫przekonwertować typ wskaźnika na wskaźnik kontrolera odtwarzacza A.

122
00:08:05,920 --> 00:08:13,720
‫Zatem rzutowanie zmienia typ jednego wskaźnika na inny typ wskaźnika, o ile sam obiekt jest typem, na

123
00:08:13,720 --> 00:08:15,640
‫który próbujemy rzutować.

124
00:08:15,670 --> 00:08:21,430
‫Jeśli na przykład próbowaliśmy rzutować na nieprawidłowy typ, mamy wskaźnik kontrolera A wskazujący na

125
00:08:21,430 --> 00:08:23,140
‫obiekt kontrolera gracza.

126
00:08:23,140 --> 00:08:30,070
‫Jeśli spróbujemy rzutować na znak, funkcja rzutowania zwraca wartość null i mówimy, że rzutowanie nie powiodło

127
00:08:30,070 --> 00:08:30,820
‫się.

128
00:08:30,820 --> 00:08:33,160
‫Więc funkcja rzutowania wygląda tak.

129
00:08:33,190 --> 00:08:36,790
‫Jest to szablon, podobnie jak tworzenie domyślnego podobiektu.

130
00:08:36,790 --> 00:08:42,850
‫Ta funkcja szablonu dostosuje się do wybranego typu iw tej funkcji typ, który przekazujemy, jest również

131
00:08:42,850 --> 00:08:44,230
‫typem, który rzutujemy.

132
00:08:44,230 --> 00:08:45,400
‫Więc przekazujemy ten typ.

133
00:08:45,400 --> 00:08:51,700
‫Chcielibyśmy umieścić dwa w nawiasach ostrych i przekazujemy wskaźnik, który chcielibyśmy umieścić w

134
00:08:51,700 --> 00:08:52,570
‫nawiasach.

135
00:08:52,570 --> 00:08:53,710
‫Oto przykład.

136
00:08:53,710 --> 00:08:59,410
‫Powiedzmy, że chcielibyśmy rzutować na kontroler gracza i wskaźnik typu kontrolera typu A.

137
00:08:59,410 --> 00:09:04,240
‫Wskazujemy wskaźnik do nawiasów, a typ, na który rzutujemy, w nawiasach ostrych.

138
00:09:04,240 --> 00:09:08,590
‫Zwracana jest wartość typu A wskaźnika kontrolera odtwarzacza.

139
00:09:08,590 --> 00:09:13,720
‫Oto wywołanie funkcji, w której przekazujemy typ w nawiasach ostrych, a wartość wskaźnika

140
00:09:13,720 --> 00:09:18,550
‫A kontrolera, którą otrzymujemy z get controller, można umieścić w nawiasach.

141
00:09:18,550 --> 00:09:22,630
‫Musimy więc rzucić tę wartość, którą otrzymujemy z kontrolera get.

142
00:09:22,630 --> 00:09:24,250
‫To będzie twoje wyzwanie.

143
00:09:24,250 --> 00:09:31,840
‫Tak więc w Begin Play użyj funkcji get controller i przekaż tę wartość do funkcji cast i rzutuj

144
00:09:31,840 --> 00:09:33,550
‫na kontroler odtwarzacza.

145
00:09:33,550 --> 00:09:39,490
‫A następnie możesz zapisać wynik w naszym wskaźniku referencyjnym kontrolera odtwarzacza, który jest wskaźnikiem kontrolera odtwarzacza typu

146
00:09:39,490 --> 00:09:40,120
‫A.

147
00:09:40,120 --> 00:09:42,580
‫Wstrzymaj wideo i wykonaj obsadę.

148
00:09:45,530 --> 00:09:45,860
‫Dobra.

149
00:09:45,860 --> 00:09:49,570
‫Więc prawie wykonaliśmy tutaj całą pracę, którą wystarczy obsadzić.

150
00:09:49,580 --> 00:09:56,000
‫Więc zamierzamy wywołać funkcję rzutowania, która ma nawiasy kątowe i nawiasy.

151
00:09:56,000 --> 00:09:59,990
‫A to, co jest w nawiasach, to wartość, którą chcielibyśmy rzucić.

152
00:09:59,990 --> 00:10:05,060
‫Teraz get controller zwraca wskaźnik kontrolera typu A.

153
00:10:05,060 --> 00:10:07,850
‫Przeniosę to tutaj, w nawias.

154
00:10:07,850 --> 00:10:12,110
‫A typ, do którego przesyłamy, to kontroler gracza.

155
00:10:14,050 --> 00:10:17,620
‫Więc znowu bierzemy wartość zwróconą przez get comptroller.

156
00:10:17,620 --> 00:10:21,160
‫Zwraca wskaźnik kontrolera lub adres.

157
00:10:21,160 --> 00:10:25,000
‫Następnie używamy rzutowania, aby przesłać go do kontrolera odtwarzacza A.

158
00:10:25,000 --> 00:10:31,330
‫Wiemy, że obiekt zwracany przez kontroler bramy jest obiektem kontrolera odtwarzacza A przechowywanym we wskaźniku

159
00:10:31,330 --> 00:10:32,320
‫kontrolera A.

160
00:10:32,320 --> 00:10:38,500
‫Więc po rzuceniu tego, co zostanie zwrócone, to wskaźnik kontrolera gracza typu A.

161
00:10:38,500 --> 00:10:41,410
‫Więc przechowujemy to w kontrolerze odtwarzacza ref.

162
00:10:41,410 --> 00:10:46,990
‫Teraz, gdy mamy dostęp do kontrolera w postaci wskaźnika kontrolera odtwarzacza A, możemy uzyskać dostęp do

163
00:10:46,990 --> 00:10:50,830
‫funkcji, której potrzebujemy, aby uzyskać wynik trafienia śledzenia pod kursorem.

164
00:10:50,830 --> 00:10:55,570
‫Podsumowując, użyliśmy get controller, aby uzyskać dostęp do kontrolera.

165
00:10:55,930 --> 00:11:03,040
‫Używamy również funkcji rzutowania do rzutowania ze wskaźnika kontrolera typu A na wskaźnik kontrolera odtwarzacza typu

166
00:11:03,040 --> 00:11:03,670
‫A.

167
00:11:03,670 --> 00:11:10,000
‫Teraz możemy uzyskać dostęp do funkcji, której potrzebujemy, czyli uzyskać wyniki trafień pod kursorem, który istnieje w klasie

168
00:11:10,000 --> 00:11:11,290
‫kontrolera odtwarzacza A.

169
00:11:11,290 --> 00:11:14,500
‫Dlatego zaczniemy używać tej funkcji w następnym filmie.

170
00:11:14,860 --> 00:11:15,850
‫Zobaczymy się wkrótce.

