﻿1
00:00:04,380 --> 00:00:06,150
‫Hallo en welkom terug.

2
00:00:06,240 --> 00:00:12,150
‫Nu hebben we beweging voor de --, maar we draaien niet dat bovenste deel van de --, dat we de

3
00:00:12,150 --> 00:00:12,920
‫toren noemen.

4
00:00:12,930 --> 00:00:16,290
‫Dus we willen dat graag met onze muis kunnen doen.

5
00:00:16,320 --> 00:00:18,800
‫Kijk nu eens wat hier aan de hand is.

6
00:00:18,810 --> 00:00:23,300
‫Terwijl ik mijn muiscursor over de wereld beweeg, krijg ik deze rode bol.

7
00:00:23,310 --> 00:00:27,060
‫Dit is een debug-bol die ik in 3D-ruimte teken.

8
00:00:27,300 --> 00:00:33,600
‫Merk nu op dat als ik tegen een muur opga, die bol tegen het oppervlak van de muur beweegt.

9
00:00:33,600 --> 00:00:40,410
‫Dus waar mijn muiscursor ook beweegt, ik krijg een angst die overeenkomt met welk object ik

10
00:00:40,410 --> 00:00:43,620
‫ook raak op basis van mijn cursorlocatie.

11
00:00:43,620 --> 00:00:50,250
‫En dit zal nuttig voor ons zijn, zodat we een locatie in de ruimte kunnen hebben waar we onze toren naartoe

12
00:00:50,250 --> 00:00:51,200
‫kunnen draaien.

13
00:00:51,210 --> 00:00:57,570
‫Om dit te doen, zijn er enkele functies die we nodig hebben op de controller, dus we moeten toegang krijgen tot

14
00:00:57,570 --> 00:00:59,250
‫die functies op de controller.

15
00:00:59,250 --> 00:01:04,140
‫En in deze video gaan we eraan werken om dat in te stellen en we gaan ook bespreken hoe

16
00:01:04,140 --> 00:01:07,080
‫dit een concept met zich meebrengt dat bekend staat als casting.

17
00:01:07,080 --> 00:01:12,330
‫De reden dat we de controller willen, is omdat er functies op de controller zijn waarmee we

18
00:01:12,330 --> 00:01:14,820
‫het hitresultaat onder de cursor kunnen krijgen.

19
00:01:14,820 --> 00:01:16,860
‫Nu hebben we het over de muiscursor.

20
00:01:16,860 --> 00:01:20,310
‫Dus stel dat dit ons scherm is en hier onze muiscursor.

21
00:01:20,310 --> 00:01:25,530
‫En het punt op de punt van de cursor komt overeen met een locatie op het scherm.

22
00:01:25,530 --> 00:01:31,740
‫Als we nu de cursor verplaatsen, is ons doel dat het torentje van onze tank, dat bovenste

23
00:01:31,740 --> 00:01:37,290
‫deel van ons gaas, gaat roteren zodat het in de richting van die cursor wijst.

24
00:01:37,440 --> 00:01:44,370
‫Als we nu de cursor verplaatsen, is er een functie op de controller die we kunnen gebruiken om de locatie

25
00:01:44,370 --> 00:01:47,190
‫te krijgen die overeenkomt met die cursor.

26
00:01:47,190 --> 00:01:52,830
‫Als we een lijn rechtstreeks vanuit de camera naar de cursor zouden trekken en een object in

27
00:01:52,830 --> 00:01:59,700
‫de wereld zouden raken, kunnen we die locatie krijgen en die locatie gebruiken om de rotatie voor de tankkoepel in te stellen.

28
00:01:59,730 --> 00:02:00,960
‫Laat me je laten zien wat ik bedoel.

29
00:02:00,960 --> 00:02:06,420
‫Nu, om deze hitlocatie te krijgen die overeenkomt met onze cursor, moeten we de controller gebruiken.

30
00:02:06,420 --> 00:02:09,480
‫Laten we het nu even hebben over de controller.

31
00:02:09,780 --> 00:02:11,880
‫Laten we zeggen dat we onze pion in de wereld hebben.

32
00:02:11,880 --> 00:02:13,950
‫Een pion heeft een controller.

33
00:02:14,130 --> 00:02:18,210
‫Dit is een onzichtbaar object dat bij de pion hoort.

34
00:02:18,210 --> 00:02:24,180
‫Nu, voor onze pion, zal onze controller het type A-spelercontroller hebben en aan het begin van

35
00:02:24,180 --> 00:02:27,720
‫het spel zal de controller de pion bezitten.

36
00:02:27,750 --> 00:02:32,790
‫Dit is waarom we kunnen zien vanuit het oogpunt van de camera die bij onze piontank hoort.

37
00:02:32,790 --> 00:02:34,890
‫Nu hebben we toegang tot deze controller.

38
00:02:34,920 --> 00:02:38,970
‫Onze tankklasse erft een functie genaamd Get Controller.

39
00:02:38,970 --> 00:02:41,100
‫Het is geërfd van de klasse --.

40
00:02:41,100 --> 00:02:46,950
‫Dus wat we zouden willen doen, is die controller te pakken krijgen en die in een variabele opslaan, zodat we deze kunnen gebruiken om toegang

41
00:02:46,950 --> 00:02:51,270
‫te krijgen tot de functie die we nodig hebben om het hitresultaat onder de cursor te krijgen.

42
00:02:51,270 --> 00:02:53,010
‫Laten we ons daar dus op voorbereiden.

43
00:02:53,010 --> 00:02:58,650
‫Nu ben ik hier in de tankklasse en de plaats waar we toegang moeten krijgen tot onze controller is beginnen met spelen.

44
00:02:58,680 --> 00:03:05,190
‫Als we het in de constructor doen, is dat te vroeg en hebben we misschien nog geen geldige controller.

45
00:03:05,190 --> 00:03:08,910
‫Dus we hebben de begin-afspeelfunctie nodig hier in de tankklasse.

46
00:03:08,910 --> 00:03:14,250
‫Nu hebben we het hier in de basispongklasse en tot nu toe gebruiken we beginspel niet echt in

47
00:03:14,250 --> 00:03:15,090
‫de basispongklasse.

48
00:03:15,270 --> 00:03:18,450
‫Dus wat ik zou willen doen is het naar de tankklasse verplaatsen.

49
00:03:18,450 --> 00:03:24,150
‫Dus ik ga beginnen met spelen te markeren, inclusief het commentaar en het beschermde gedeelte hier en ik

50
00:03:24,150 --> 00:03:25,500
‫ga het gewoon knippen.

51
00:03:25,500 --> 00:03:28,710
‫En dan terug in de tankfase, ga ik het plakken.

52
00:03:28,710 --> 00:03:33,960
‫Laten we dit beschermde gedeelte hier net boven het privégedeelte toevoegen met het spel binnenin.

53
00:03:33,960 --> 00:03:36,270
‫Nu hebben we Begin Spelen van de basispion verwijderd.

54
00:03:36,840 --> 00:03:41,430
‫We hebben het hier niet meer, maar we moeten het ook verwijderen uit basisvijver cpp.

55
00:03:41,460 --> 00:03:42,240
‫Hier is het.

56
00:03:42,240 --> 00:03:48,960
‫We kunnen doorgaan en het hier verwijderen en nu hebben we het hier gedeclareerd in Tank H, maar we moeten

57
00:03:48,960 --> 00:03:51,330
‫het ook definiëren in tank CPP.

58
00:03:51,360 --> 00:03:55,830
‫Dus ik ga de functie definiëren net onder de spelerinvoercomponent.

59
00:03:55,830 --> 00:04:00,660
‫Dus het wordt ongeldig om te beginnen met spelen zonder invoerparameters.

60
00:04:00,870 --> 00:04:06,840
‫Er is de functietekst en we hebben ook een tank nodig die de functienaam vooraf vastlegt.

61
00:04:06,840 --> 00:04:09,930
‫Nu weten we dat het belangrijk is om super groot te noemen in het spel.

62
00:04:09,930 --> 00:04:16,320
‫Dus op die manier zullen alle functionaliteiten in de start play-functie en alle bovenliggende klassen nog steeds worden

63
00:04:16,320 --> 00:04:17,010
‫aangeroepen.

64
00:04:17,340 --> 00:04:18,960
‫Dus hier moeten we beginnen met spelen.

65
00:04:18,990 --> 00:04:22,560
‫Hier kunnen we onze controller ophalen en in een variabele opslaan.

66
00:04:22,560 --> 00:04:25,920
‫Laten we dus teruggaan naar Tank H en een variabele maken.

67
00:04:25,920 --> 00:04:30,750
‫Dit wordt nu privé en ik plak het hier

68
00:04:30,750 --> 00:04:38,460
‫onderaan het privégedeelte en het wordt een spelercontroller-aanwijzertype en we kunnen deze spelercontroller ref noemen.

69
00:04:38,460 --> 00:04:40,920
‫Dit zal onze verwijzing zijn naar de spelercontroller.

70
00:04:40,950 --> 00:04:43,590
‫Nu hebben we het niet over een C++-referentie.

71
00:04:43,590 --> 00:04:48,750
‫Dit is nog steeds slechts een aanwijzer, maar we gaan dit gebruiken om naar de spelercontroller te verwijzen.

72
00:04:48,750 --> 00:04:55,560
‫Dus nu hebben we een spelercontroller ref-variabele van type A spelercontroller en we zijn klaar om de controller in

73
00:04:55,590 --> 00:04:57,600
‫deze aanwijzer op te slaan.

74
00:04:57,600 --> 00:05:02,730
‫Dus laten we hier teruggaan naar Tank Dot CP en beginnen met spelen en proberen dit te doen.

75
00:05:02,730 --> 00:05:03,330
‫Dus.

76
00:05:03,400 --> 00:05:12,100
‫Wat ik ga doen is zeggen speler, controller, ref is gelijk aan en ik ga proberen om get controller te bellen.

77
00:05:12,880 --> 00:05:17,440
‫Krijg nu de controller, zoals ik al zei, is in de ---klasse.

78
00:05:17,470 --> 00:05:24,070
‫Laten we met de rechtermuisknop klikken en naar de definitie gaan en zien dat deze functie een A-controller retourneert.

79
00:05:24,100 --> 00:05:29,020
‫Nu is onze variabele van het type A-spelercontroller, geen controller.

80
00:05:29,020 --> 00:05:35,260
‫Dus wat we hier proberen te doen, is de geretourneerde waarde van get controller te nemen, die van

81
00:05:35,260 --> 00:05:40,270
‫het type controller-aanwijzer is en we proberen deze op te slaan in een A-speler-controller-aanwijzer.

82
00:05:40,300 --> 00:05:42,330
‫Merk op dat we hier de rode kronkel zien.

83
00:05:42,340 --> 00:05:43,940
‫Er staat een waarde van het type.

84
00:05:43,960 --> 00:05:48,080
‫Een controller-pointer kan niet worden toegewezen aan een entiteit van het type.

85
00:05:48,100 --> 00:05:49,630
‫Een spelercontroller.

86
00:05:49,660 --> 00:05:51,210
‫We krijgen een foutmelding.

87
00:05:51,220 --> 00:05:55,390
‫Laten we hier eens kijken naar de documentatie voor een controller.

88
00:05:55,420 --> 00:05:56,400
‫Kijk eens.

89
00:05:56,410 --> 00:05:58,030
‫Hier is een controleur.

90
00:05:58,030 --> 00:06:00,460
‫En er staat overerving, hiërarchie.

91
00:06:00,460 --> 00:06:05,690
‫En onder een controller zien we een a controller en een player controller.

92
00:06:05,710 --> 00:06:10,210
‫Dit betekent dat een spelercontroller een onderliggende klasse is van een controller.

93
00:06:10,240 --> 00:06:14,500
‫Nu kunnen we in C ++ geen aanwijzer van het type hebben.

94
00:06:14,530 --> 00:06:20,200
‫Een spelercontroller slaat de waarde van het adres van een A-controller op.

95
00:06:20,530 --> 00:06:22,600
‫Een controller is het bovenliggende type.

96
00:06:22,780 --> 00:06:25,450
‫Een spelercontroller is het kindtype.

97
00:06:25,450 --> 00:06:30,960
‫U kunt een object van het bovenliggende type niet nemen en opslaan in een aanwijzer van het onderliggende type.

98
00:06:30,970 --> 00:06:32,680
‫Dus hoe komen we hier omheen?

99
00:06:32,680 --> 00:06:34,000
‫Dus hier is ons probleem.

100
00:06:34,000 --> 00:06:38,630
‫De functie get controller retourneert het adres van een A-controller.

101
00:06:38,650 --> 00:06:44,410
‫Dit is iets dat we kunnen opslaan in een A-controller-aanwijzer, maar we kunnen het niet opslaan in

102
00:06:44,410 --> 00:06:45,410
‫een A-speler-controller-aanwijzer.

103
00:06:45,430 --> 00:06:52,000
‫Het grappige is echter dat het object dat wordt geretourneerd door de get-controller in feite een speler-controller is.

104
00:06:52,000 --> 00:06:58,630
‫Dus we hebben dit adres in de vorm van een A-controlleraanwijzer en we weten dat het een spelercontroller is, maar als we het

105
00:06:58,630 --> 00:07:03,910
‫in de vorm van een A-controller hebben, hebben we geen toegang tot de functie die we nodig hebben

106
00:07:03,910 --> 00:07:06,210
‫omdat het op een spelercontroller bestaat .

107
00:07:06,220 --> 00:07:08,810
‫De functie heet get hit resultaat onder de cursor.

108
00:07:08,830 --> 00:07:15,250
‫Als we nu een waarde van type A controller-aanwijzer hebben en we proberen die functie te krijgen die bestaat op een spelercontroller,

109
00:07:15,250 --> 00:07:18,430
‫zullen we er niet in slagen om dit te doen.

110
00:07:18,460 --> 00:07:20,020
‫We krijgen een compilatiefout.

111
00:07:20,020 --> 00:07:25,960
‫Dus omdat we weten dat het object zelf een spelercontroller is, is het gewoon opgeslagen in een A-controlleraanwijzer.

112
00:07:25,960 --> 00:07:27,610
‫Hoe komen we om dit probleem heen?

113
00:07:27,610 --> 00:07:29,980
‫Het antwoord is dat we moeten casten.

114
00:07:30,010 --> 00:07:36,100
‫We weten dat een controller de bovenliggende klasse is en een spelercontroller de onderliggende klasse.

115
00:07:36,100 --> 00:07:41,320
‫En we weten dat we geen A-controller kunnen opslaan in een A-speler-controller-aanwijzer.

116
00:07:41,320 --> 00:07:46,750
‫We weten dat we de andere kant op kunnen gaan en een A controller pointer store hebben, een object van een

117
00:07:46,750 --> 00:07:47,530
‫player controller.

118
00:07:47,620 --> 00:07:53,290
‫Dat is in feite wat we zien als we get controller noemen, het retourneert een A-controller-aanwijzer

119
00:07:53,290 --> 00:07:55,120
‫die naar een A-speler-controller wijst.

120
00:07:55,120 --> 00:08:01,810
‫Dus als we een waarde van type A controller pointer hebben, kunnen we een speciale functie genaamd cast gebruiken om

121
00:08:01,810 --> 00:08:05,920
‫het type pointer om te zetten in een A player controller pointer.

122
00:08:05,920 --> 00:08:13,720
‫Dus casten verandert het type van de ene aanwijzer in een ander aanwijzertype, zolang het object zelf het type is waarnaar

123
00:08:13,720 --> 00:08:15,640
‫we proberen te casten.

124
00:08:15,670 --> 00:08:21,430
‫Als we nu bijvoorbeeld probeerden te casten naar een ongeldig type, hebben we een A-controller-aanwijzer die

125
00:08:21,430 --> 00:08:23,140
‫naar een spelercontroller-object wijst.

126
00:08:23,140 --> 00:08:30,070
‫Als we proberen een personage te casten, retourneert de cast-functie null en zeggen we dat we de cast niet

127
00:08:30,070 --> 00:08:30,820
‫halen.

128
00:08:30,820 --> 00:08:33,160
‫Dus de cast-functie ziet er als volgt uit.

129
00:08:33,190 --> 00:08:36,790
‫Het is een sjabloon, net als het maken van een standaard subobject.

130
00:08:36,790 --> 00:08:42,850
‫Deze sjabloonfunctie past zich aan het gekozen type aan en in deze functie is het type dat we doorgeven ook het

131
00:08:42,850 --> 00:08:44,230
‫type dat we casten.

132
00:08:44,230 --> 00:08:45,400
‫Dus dat type passeren we.

133
00:08:45,400 --> 00:08:51,700
‫We willen er twee tussen de punthaken plaatsen en we geven de aanwijzer door die we tussen de haakjes

134
00:08:51,700 --> 00:08:52,570
‫willen plaatsen.

135
00:08:52,570 --> 00:08:53,710
‫Hier is een voorbeeld.

136
00:08:53,710 --> 00:08:59,410
‫Laten we zeggen dat we willen casten naar een spelercontroller en een aanwijzer van het type A-controllertype.

137
00:08:59,410 --> 00:09:04,240
‫We geven de aanwijzer door tussen haakjes en het type waarnaar we casten tussen de schuine haken.

138
00:09:04,240 --> 00:09:08,590
‫En wat wordt geretourneerd, is een waarde van de aanwijzer van de spelercontroller van het type A.

139
00:09:08,590 --> 00:09:13,720
‫Dus hier is de functieaanroep waarbij we het type tussen de punthaken doorgeven en

140
00:09:13,720 --> 00:09:18,550
‫de A-controller-aanwijzerwaarde die we krijgen van get controller kan tussen haakjes staan.

141
00:09:18,550 --> 00:09:22,630
‫We moeten dus deze waarde casten die we terugkrijgen van get controller.

142
00:09:22,630 --> 00:09:24,250
‫Dat wordt jouw uitdaging.

143
00:09:24,250 --> 00:09:31,840
‫Dus in Begin Play, gebruik de get-controller-functie en geef die waarde door aan de cast-functie en cast

144
00:09:31,840 --> 00:09:33,550
‫naar een spelercontroller.

145
00:09:33,550 --> 00:09:39,490
‫En dan kun je het resultaat opslaan in onze player controller ref pointer, die van het type A player controller

146
00:09:39,490 --> 00:09:40,120
‫pointer is.

147
00:09:40,120 --> 00:09:42,580
‫Pauzeer de video en voer de cast uit.

148
00:09:45,530 --> 00:09:45,860
‫Oké.

149
00:09:45,860 --> 00:09:49,570
‫Dus we hebben hier bijna al het werk gedaan dat we alleen nog hoeven te casten.

150
00:09:49,580 --> 00:09:56,000
‫Dus wat we gaan doen is de cast-functie aanroepen, die zowel punthaken als haakjes heeft.

151
00:09:56,000 --> 00:09:59,990
‫En wat tussen haakjes staat, is de waarde die we willen gebruiken.

152
00:09:59,990 --> 00:10:05,060
‫Get controller retourneert nu een aanwijzer van Type A-controller.

153
00:10:05,060 --> 00:10:07,850
‫Ik ga dat hier tussen haakjes zetten.

154
00:10:07,850 --> 00:10:12,110
‫En het type waarnaar we casten is een spelercontroller.

155
00:10:14,050 --> 00:10:17,620
‫Dus nogmaals, we nemen de waarde die wordt geretourneerd door get comptroller.

156
00:10:17,620 --> 00:10:21,160
‫Dit retourneert een controle-aanwijzer of een adres.

157
00:10:21,160 --> 00:10:25,000
‫Vervolgens gebruiken we cast om het naar een A-spelercontroller te casten.

158
00:10:25,000 --> 00:10:31,330
‫We weten dat het object dat wordt geretourneerd door de gate-controller een A-speler-controller-object is dat is opgeslagen in

159
00:10:31,330 --> 00:10:32,320
‫een A-controller-aanwijzer.

160
00:10:32,320 --> 00:10:38,500
‫Dus nadat we dit hebben gecast, wordt een aanwijzer van het type A-spelercontroller geretourneerd.

161
00:10:38,500 --> 00:10:41,410
‫Dus we slaan dat op in spelercontroller ref.

162
00:10:41,410 --> 00:10:46,990
‫Nu we toegang hebben tot de controller in de vorm van een A-speler-controlleraanwijzer, hebben we toegang tot de functie die we

163
00:10:46,990 --> 00:10:50,830
‫nodig hebben om het resultaat van de traceerhit onder de cursor te krijgen.

164
00:10:50,830 --> 00:10:55,570
‫Dus samenvattend hebben we get controller gebruikt om toegang te krijgen tot de controller.

165
00:10:55,930 --> 00:11:03,040
‫We gebruiken ook de cast-functie om te casten van de type A-controlleraanwijzer naar de type

166
00:11:03,040 --> 00:11:03,670
‫A-spelercontrolleraanwijzer.

167
00:11:03,670 --> 00:11:10,000
‫Nu hebben we toegang tot de functie die we nodig hebben, namelijk het krijgen van hitresultaten onder de cursor die

168
00:11:10,000 --> 00:11:11,290
‫bestaat in de A-spelercontrollerklasse.

169
00:11:11,290 --> 00:11:14,500
‫Dus we zullen deze functie gaan gebruiken in de volgende video.

170
00:11:14,860 --> 00:11:15,850
‫Ik zie je snel.

