﻿1
00:00:04,380 --> 00:00:06,150
‫Ciao e bentornato.

2
00:00:06,240 --> 00:00:12,150
‫Ora abbiamo il movimento per il --, ma non stiamo ruotando quella parte superiore del --, che

3
00:00:12,150 --> 00:00:12,920
‫chiamiamo torretta.

4
00:00:12,930 --> 00:00:16,290
‫Quindi vorremmo poterlo fare usando il nostro mouse.

5
00:00:16,320 --> 00:00:18,800
‫Ora, dai un'occhiata a cosa sta succedendo qui.

6
00:00:18,810 --> 00:00:23,300
‫Mentre sposto il cursore del mouse nel mondo, ricevo questa sfera rossa.

7
00:00:23,310 --> 00:00:27,060
‫Questa è una sfera di debug che sto disegnando nello spazio 3D.

8
00:00:27,300 --> 00:00:33,600
‫Ora nota mentre mi sposto contro un muro, quella sfera si muove contro la superficie del muro.

9
00:00:33,600 --> 00:00:40,410
‫Quindi, ovunque si muova il cursore del mouse, ho questa paura che corrisponde a qualsiasi oggetto che sto

10
00:00:40,410 --> 00:00:43,620
‫colpendo in base alla posizione del mio cursore.

11
00:00:43,620 --> 00:00:50,250
‫E questo ci sarà utile in modo da poter avere una posizione nello spazio verso la quale possiamo ruotare la

12
00:00:50,250 --> 00:00:51,200
‫nostra torretta.

13
00:00:51,210 --> 00:00:57,570
‫Ora, per fare ciò, ci sono alcune funzioni di cui abbiamo bisogno sul controller, quindi dobbiamo accedere a

14
00:00:57,570 --> 00:00:59,250
‫quelle funzioni sul controller.

15
00:00:59,250 --> 00:01:04,140
‫E in questo video lavoreremo sull'impostazione e discuteremo anche di come questo

16
00:01:04,140 --> 00:01:07,080
‫comporterà un concetto noto come casting.

17
00:01:07,080 --> 00:01:12,330
‫Ora, il motivo per cui vogliamo il controller è perché ci sono funzioni sul controller che ci consentono di

18
00:01:12,330 --> 00:01:14,820
‫ottenere il risultato del colpo sotto il cursore.

19
00:01:14,820 --> 00:01:16,860
‫Ora stiamo parlando del cursore del mouse.

20
00:01:16,860 --> 00:01:20,310
‫Quindi diciamo che questo è il nostro schermo ed ecco il nostro cursore del mouse.

21
00:01:20,310 --> 00:01:25,530
‫E il punto sulla punta del cursore corrisponde a una posizione sullo schermo.

22
00:01:25,530 --> 00:01:31,740
‫Ora, se spostiamo il cursore, il nostro obiettivo è che la parte della torretta del nostro carro armato, quella

23
00:01:31,740 --> 00:01:37,290
‫parte superiore della nostra mesh, ruoti in modo che sia rivolta nella direzione di quel cursore.

24
00:01:37,440 --> 00:01:44,370
‫Ora, se spostiamo il cursore, c'è una funzione sul controller che possiamo usare per ottenere

25
00:01:44,370 --> 00:01:47,190
‫la posizione corrispondente a quel cursore.

26
00:01:47,190 --> 00:01:52,830
‫Se dovessimo tracciare una linea direttamente dalla telecamera verso il cursore e colpire un

27
00:01:52,830 --> 00:01:59,700
‫oggetto nel mondo, possiamo ottenere quella posizione e usarla per impostare la rotazione della torretta del carro armato.

28
00:01:59,730 --> 00:02:00,960
‫Lascia che ti mostri cosa intendo.

29
00:02:00,960 --> 00:02:06,420
‫Ora, per ottenere questa posizione del colpo corrispondente al nostro cursore, dobbiamo usare il controller.

30
00:02:06,420 --> 00:02:09,480
‫Ora, parliamo per un breve momento del controller.

31
00:02:09,780 --> 00:02:11,880
‫Diciamo che abbiamo la nostra pedina nel mondo.

32
00:02:11,880 --> 00:02:13,950
‫Una pedina avrà un controller.

33
00:02:14,130 --> 00:02:18,210
‫Questo è un oggetto invisibile associato al pedone.

34
00:02:18,210 --> 00:02:24,180
‫Ora, per la nostra pedina, il nostro controller avrà il controller del giocatore di tipo A

35
00:02:24,180 --> 00:02:27,720
‫e all'inizio del gioco, il controller possiederà la pedina.

36
00:02:27,750 --> 00:02:32,790
‫Questo è il motivo per cui possiamo vedere dal punto di vista della telecamera che appartiene al nostro carro armato dei pedoni.

37
00:02:32,790 --> 00:02:34,890
‫Ora possiamo accedere a questo controller.

38
00:02:34,920 --> 00:02:38,970
‫La nostra classe tank eredita una funzione chiamata Get Controller.

39
00:02:38,970 --> 00:02:41,100
‫È ereditato dalla classe --.

40
00:02:41,100 --> 00:02:46,950
‫Quindi quello che vorremmo fare è prendere quel controller e memorizzarlo in una variabile in modo da poterlo usare per accedere

41
00:02:46,950 --> 00:02:51,270
‫alla funzione di cui abbiamo bisogno per ottenere il risultato del colpo sotto il cursore.

42
00:02:51,270 --> 00:02:53,010
‫Quindi prepariamoci a questo.

43
00:02:53,010 --> 00:02:58,650
‫Ora sono qui nella classe tank e il punto in cui dobbiamo accedere al nostro controller è iniziare a giocare.

44
00:02:58,680 --> 00:03:05,190
‫Se lo facciamo nel costruttore, è troppo presto e potremmo non avere ancora un controller valido.

45
00:03:05,190 --> 00:03:08,910
‫Quindi avremo bisogno della funzione di inizio del gioco qui nella classe tank.

46
00:03:08,910 --> 00:03:14,250
‫Ora l'abbiamo qui nella classe di base pong e finora non stiamo davvero usando l'inizio del gioco nella classe di

47
00:03:14,250 --> 00:03:15,090
‫base pong.

48
00:03:15,270 --> 00:03:18,450
‫Quindi quello che mi piacerebbe fare è spostarlo nella classe dei carri armati.

49
00:03:18,450 --> 00:03:24,150
‫Quindi evidenzierò l'inizio del gioco, incluso il commento e la sezione protetta qui e

50
00:03:24,150 --> 00:03:25,500
‫lo taglierò semplicemente.

51
00:03:25,500 --> 00:03:28,710
‫E poi di nuovo nella fase del serbatoio, lo incollerò.

52
00:03:28,710 --> 00:03:33,960
‫Aggiungiamo questa sezione protetta qui appena sopra la sezione privata con l'inizio del gioco all'interno.

53
00:03:33,960 --> 00:03:36,270
‫Ora abbiamo rimosso Begin Play dal pedone base.

54
00:03:36,840 --> 00:03:41,430
‫Non lo abbiamo più qui, ma dobbiamo anche rimuoverlo da base pond cpp.

55
00:03:41,460 --> 00:03:42,240
‫Ecco qui.

56
00:03:42,240 --> 00:03:48,960
‫Possiamo andare avanti e cancellarlo qui e ora lo abbiamo dichiarato qui in Tank H, ma dobbiamo

57
00:03:48,960 --> 00:03:51,330
‫anche definirlo in tank CPP.

58
00:03:51,360 --> 00:03:55,830
‫Quindi definirò la funzione appena sotto il componente di input del lettore di configurazione.

59
00:03:55,830 --> 00:04:00,660
‫Quindi sarà vuoto iniziare a giocare senza parametri di input.

60
00:04:00,870 --> 00:04:06,840
‫C'è il corpo della funzione e abbiamo anche bisogno di un serbatoio che prefissa il nome della funzione.

61
00:04:06,840 --> 00:04:09,930
‫Ora sappiamo che è importante chiamare super big in gioco.

62
00:04:09,930 --> 00:04:16,320
‫In questo modo qualsiasi funzionalità nella funzione di inizio riproduzione e qualsiasi classe padre verrà comunque

63
00:04:16,320 --> 00:04:17,010
‫chiamata.

64
00:04:17,340 --> 00:04:18,960
‫Quindi qui abbiamo iniziato a giocare.

65
00:04:18,990 --> 00:04:22,560
‫È qui che possiamo ottenere il nostro controller e memorizzarlo in una variabile.

66
00:04:22,560 --> 00:04:25,920
‫Quindi torniamo a Tank H e creiamo una variabile.

67
00:04:25,920 --> 00:04:30,750
‫Ora questo sarà privato e lo infilerò qui in fondo alla

68
00:04:30,750 --> 00:04:38,460
‫sezione privata e sarà un tipo di puntatore del controller del giocatore e possiamo chiamare questo controller del giocatore ref.

69
00:04:38,460 --> 00:04:40,920
‫Questo sarà il nostro riferimento al controller del giocatore.

70
00:04:40,950 --> 00:04:43,590
‫Ora non stiamo parlando di un riferimento C++.

71
00:04:43,590 --> 00:04:48,750
‫Questo è ancora solo un puntatore, ma lo useremo per fare riferimento al controller del giocatore.

72
00:04:48,750 --> 00:04:55,560
‫Quindi ora abbiamo una variabile di riferimento del controller del giocatore di tipo A e siamo pronti per memorizzare

73
00:04:55,590 --> 00:04:57,600
‫il controller in questo puntatore.

74
00:04:57,600 --> 00:05:02,730
‫Quindi torniamo a Tank Dot CP qui e iniziamo a giocare e proviamo a farlo.

75
00:05:02,730 --> 00:05:03,330
‫Così.

76
00:05:03,400 --> 00:05:12,100
‫Quello che farò è dire giocatore, controller, arbitro uguale e proverò a chiamare get controller.

77
00:05:12,880 --> 00:05:17,440
‫Ora prendi il controller, come ho già detto è nella classe --.

78
00:05:17,470 --> 00:05:24,070
‫Facciamo clic con il pulsante destro del mouse e andiamo alla definizione e notiamo che questa funzione restituisce un controller A.

79
00:05:24,100 --> 00:05:29,020
‫Ora la nostra variabile è di tipo A player controller, non un controller.

80
00:05:29,020 --> 00:05:35,260
‫Quindi quello che stiamo tentando di fare qui è prendere il valore restituito da get controller, che è di un tipo di

81
00:05:35,260 --> 00:05:40,270
‫puntatore del controller e stiamo cercando di memorizzarlo in un puntatore del controller del giocatore A.

82
00:05:40,300 --> 00:05:42,330
‫Nota che qui vediamo il rosso ondulato.

83
00:05:42,340 --> 00:05:43,940
‫Dice un valore di tipo.

84
00:05:43,960 --> 00:05:48,080
‫Non è possibile assegnare un puntatore del controller a un'entità di tipo.

85
00:05:48,100 --> 00:05:49,630
‫Un controller del giocatore.

86
00:05:49,660 --> 00:05:51,210
‫Stiamo ricevendo un errore.

87
00:05:51,220 --> 00:05:55,390
‫Diamo un'occhiata qui alla documentazione per un controller.

88
00:05:55,420 --> 00:05:56,400
‫Guarda.

89
00:05:56,410 --> 00:05:58,030
‫Ecco un controllore.

90
00:05:58,030 --> 00:06:00,460
‫E dice eredità, gerarchia.

91
00:06:00,460 --> 00:06:05,690
‫E sotto un controller vediamo un controller e un controller del giocatore.

92
00:06:05,710 --> 00:06:10,210
‫Ciò significa che un controller del giocatore è una classe figlia di un controller.

93
00:06:10,240 --> 00:06:14,500
‫Ora, in C++, non possiamo avere un puntatore di tipo.

94
00:06:14,530 --> 00:06:20,200
‫Un controller del giocatore memorizza il valore dell'indirizzo di un controller A.

95
00:06:20,530 --> 00:06:22,600
‫Un controller è il tipo padre.

96
00:06:22,780 --> 00:06:25,450
‫Un controller giocatore è il tipo figlio.

97
00:06:25,450 --> 00:06:30,960
‫Non puoi prendere un oggetto di tipo padre e memorizzarlo in un puntatore di tipo figlio.

98
00:06:30,970 --> 00:06:32,680
‫Quindi, come possiamo aggirare questo?

99
00:06:32,680 --> 00:06:34,000
‫Quindi ecco il nostro problema.

100
00:06:34,000 --> 00:06:38,630
‫La funzione get controller restituisce l'indirizzo di un controller A.

101
00:06:38,650 --> 00:06:44,410
‫Ora, questo è qualcosa che potremmo memorizzare in un puntatore del controller A, ma non possiamo memorizzarlo in un puntatore del controller

102
00:06:44,410 --> 00:06:45,410
‫del giocatore A.

103
00:06:45,430 --> 00:06:52,000
‫La cosa divertente, tuttavia, è che l'oggetto restituito da get controller è in realtà un controller del giocatore.

104
00:06:52,000 --> 00:06:58,630
‫Quindi abbiamo questo indirizzo sotto forma di un puntatore del controller A e sappiamo che memorizza un controller del giocatore, ma se

105
00:06:58,630 --> 00:07:03,910
‫lo abbiamo sotto forma di un controller A, non possiamo accedere alla funzione di cui abbiamo bisogno perché

106
00:07:03,910 --> 00:07:06,210
‫esiste su un controller del giocatore .

107
00:07:06,220 --> 00:07:08,810
‫La funzione è chiamata get hit result sotto il cursore.

108
00:07:08,830 --> 00:07:15,250
‫Ora, se abbiamo un valore di puntatore del controller di tipo A e tentiamo di ottenere quella funzione che esiste

109
00:07:15,250 --> 00:07:18,430
‫su un controller del giocatore, non riusciremo a farlo.

110
00:07:18,460 --> 00:07:20,020
‫Otterremo un errore di compilazione.

111
00:07:20,020 --> 00:07:25,960
‫Quindi, poiché sappiamo che l'oggetto stesso è un controller del giocatore, è semplicemente memorizzato in un puntatore del controller A.

112
00:07:25,960 --> 00:07:27,610
‫Come aggiriamo questo problema?

113
00:07:27,610 --> 00:07:29,980
‫La risposta è che dobbiamo lanciare.

114
00:07:30,010 --> 00:07:36,100
‫Sappiamo che un controller è la classe genitore e un controller giocatore è la classe figlia.

115
00:07:36,100 --> 00:07:41,320
‫E sappiamo che non possiamo avere un controller A memorizzato in un puntatore del controller del lettore A.

116
00:07:41,320 --> 00:07:46,750
‫Sappiamo che possiamo fare il contrario e avere un negozio di puntatori del controller A, un oggetto di un controller

117
00:07:46,750 --> 00:07:47,530
‫del giocatore.

118
00:07:47,620 --> 00:07:53,290
‫Questo è in effetti ciò che vediamo quando chiamiamo get controller, restituisce un puntatore del controller A che punta

119
00:07:53,290 --> 00:07:55,120
‫a un controller del giocatore A.

120
00:07:55,120 --> 00:08:01,810
‫Quindi, se abbiamo un valore di puntatore del controller di tipo A, possiamo usare una funzione speciale chiamata cast per convertire

121
00:08:01,810 --> 00:08:05,920
‫il tipo del puntatore in un puntatore del controller del giocatore A.

122
00:08:05,920 --> 00:08:13,720
‫Quindi il cast cambia il tipo di un puntatore in un altro tipo di puntatore, purché l'oggetto stesso sia il tipo a cui stiamo

123
00:08:13,720 --> 00:08:15,640
‫cercando di eseguire il cast.

124
00:08:15,670 --> 00:08:21,430
‫Ora, se abbiamo tentato di eseguire il cast su un tipo non valido, ad esempio, abbiamo un puntatore del controller A che punta

125
00:08:21,430 --> 00:08:23,140
‫a un oggetto controller del giocatore.

126
00:08:23,140 --> 00:08:30,070
‫Se proviamo a lanciare per dire, un carattere, la funzione cast restituisce null e diciamo che falliamo il

127
00:08:30,070 --> 00:08:30,820
‫cast.

128
00:08:30,820 --> 00:08:33,160
‫Quindi la funzione cast è simile a questa.

129
00:08:33,190 --> 00:08:36,790
‫È un modello proprio come crea un oggetto secondario predefinito.

130
00:08:36,790 --> 00:08:42,850
‫Questa funzione modello si adatterà al tipo scelto e in questa funzione, il tipo che passiamo è anche il

131
00:08:42,850 --> 00:08:44,230
‫tipo che stiamo trasmettendo.

132
00:08:44,230 --> 00:08:45,400
‫Quindi passiamo quel tipo.

133
00:08:45,400 --> 00:08:51,700
‫Vorremmo lanciare due all'interno delle parentesi angolari e passiamo il puntatore che vorremmo lanciare tra

134
00:08:51,700 --> 00:08:52,570
‫parentesi.

135
00:08:52,570 --> 00:08:53,710
‫Ecco un esempio.

136
00:08:53,710 --> 00:08:59,410
‫Diciamo che vorremmo trasmettere a un controller del giocatore e un puntatore di tipo di controller A.

137
00:08:59,410 --> 00:09:04,240
‫Passiamo il puntatore tra parentesi e il tipo a cui stiamo effettuando il casting tra parentesi angolari.

138
00:09:04,240 --> 00:09:08,590
‫E ciò che viene restituito è un valore di tipo A puntatore del controller del giocatore.

139
00:09:08,590 --> 00:09:13,720
‫Quindi ecco la chiamata di funzione in cui stiamo passando il tipo tra parentesi angolari e il valore

140
00:09:13,720 --> 00:09:18,550
‫del puntatore del controller A che otteniamo restituito da get controller può essere inserito tra parentesi.

141
00:09:18,550 --> 00:09:22,630
‫Quindi dobbiamo eseguire il cast di questo valore che ci viene restituito da get controller.

142
00:09:22,630 --> 00:09:24,250
‫Sarà la tua sfida.

143
00:09:24,250 --> 00:09:31,840
‫Quindi, in Begin Play, usa la funzione get controller e passa quel valore alla funzione cast e lancia a

144
00:09:31,840 --> 00:09:33,550
‫un controller del giocatore.

145
00:09:33,550 --> 00:09:39,490
‫E quindi puoi memorizzare il risultato nel nostro puntatore di riferimento del controller del lettore, che è di tipo A puntatore del controller

146
00:09:39,490 --> 00:09:40,120
‫del lettore.

147
00:09:40,120 --> 00:09:42,580
‫Metti in pausa il video ed esegui il cast.

148
00:09:45,530 --> 00:09:45,860
‫Bene.

149
00:09:45,860 --> 00:09:49,570
‫Quindi abbiamo quasi finito tutto il lavoro qui che dobbiamo solo lanciare.

150
00:09:49,580 --> 00:09:56,000
‫Quindi quello che faremo è chiamare la funzione cast, che ha parentesi angolari e parentesi.

151
00:09:56,000 --> 00:09:59,990
‫E quello che va tra parentesi è il valore che vorremmo lanciare.

152
00:09:59,990 --> 00:10:05,060
‫Ora get controller restituisce un puntatore del controller di tipo A.

153
00:10:05,060 --> 00:10:07,850
‫Lo sposterò qui tra parentesi.

154
00:10:07,850 --> 00:10:12,110
‫E il tipo a cui stiamo trasmettendo è un controller del giocatore.

155
00:10:14,050 --> 00:10:17,620
‫Quindi di nuovo prendiamo il valore restituito da get controller.

156
00:10:17,620 --> 00:10:21,160
‫Questo restituisce un puntatore a controller o un indirizzo.

157
00:10:21,160 --> 00:10:25,000
‫Quindi stiamo usando cast per lanciarlo su un controller del giocatore A.

158
00:10:25,000 --> 00:10:31,330
‫Sappiamo che l'oggetto restituito dal controller del gate è un oggetto controller del giocatore A memorizzato in un puntatore del

159
00:10:31,330 --> 00:10:32,320
‫controller A.

160
00:10:32,320 --> 00:10:38,500
‫Quindi, dopo aver lanciato questo, ciò che viene restituito è un puntatore del controller del giocatore di tipo A.

161
00:10:38,500 --> 00:10:41,410
‫Quindi lo stiamo memorizzando nel controller del lettore ref.

162
00:10:41,410 --> 00:10:46,990
‫Ora che abbiamo accesso al controller sotto forma di un puntatore del controller del giocatore A, possiamo accedere alla funzione di

163
00:10:46,990 --> 00:10:50,830
‫cui abbiamo bisogno per ottenere il risultato della traccia hit sotto il cursore.

164
00:10:50,830 --> 00:10:55,570
‫Quindi, in sintesi, abbiamo usato get controller per ottenere l'accesso al controller.

165
00:10:55,930 --> 00:11:03,040
‫Usiamo anche la funzione cast per trasmettere dal puntatore del controller di tipo A al puntatore del controller del giocatore di tipo

166
00:11:03,040 --> 00:11:03,670
‫A.

167
00:11:03,670 --> 00:11:10,000
‫Ora possiamo accedere alla funzione di cui abbiamo bisogno, ovvero ottenere risultati sui risultati sotto il cursore che esiste nella classe A

168
00:11:10,000 --> 00:11:11,290
‫del controller del giocatore.

169
00:11:11,290 --> 00:11:14,500
‫Quindi inizieremo a utilizzare questa funzione nel prossimo video.

170
00:11:14,860 --> 00:11:15,850
‫Ci vediamo presto.

