﻿1
00:00:04,380 --> 00:00:06,150
‫Hola y bienvenido de nuevo.

2
00:00:06,240 --> 00:00:12,150
‫Ahora tenemos movimiento para --, pero no estamos girando la parte superior de --, que llamamos

3
00:00:12,150 --> 00:00:12,920
‫torreta.

4
00:00:12,930 --> 00:00:16,290
‫Así que nos gustaría poder hacer eso usando nuestro mouse.

5
00:00:16,320 --> 00:00:18,800
‫Ahora, echa un vistazo a lo que está pasando aquí.

6
00:00:18,810 --> 00:00:23,300
‫A medida que muevo el cursor del mouse por el mundo, obtengo esta esfera roja.

7
00:00:23,310 --> 00:00:27,060
‫Esta es una esfera de depuración que estoy dibujando en el espacio 3D.

8
00:00:27,300 --> 00:00:33,600
‫Ahora observe que mientras me muevo contra una pared, esa esfera se mueve contra la superficie de la pared.

9
00:00:33,600 --> 00:00:40,410
‫Entonces, donde sea que se mueva el cursor de mi mouse, tengo este miedo que corresponde a cualquier objeto que

10
00:00:40,410 --> 00:00:43,620
‫esté golpeando según la ubicación de mi cursor.

11
00:00:43,620 --> 00:00:50,250
‫Y esto nos será útil para que podamos tener una ubicación en el espacio hacia la que podamos rotar

12
00:00:50,250 --> 00:00:51,200
‫nuestra torreta.

13
00:00:51,210 --> 00:00:57,570
‫Ahora, para hacer esto, hay algunas funciones que necesitamos en el controlador, por lo que debemos acceder a esas

14
00:00:57,570 --> 00:00:59,250
‫funciones en el controlador.

15
00:00:59,250 --> 00:01:04,140
‫Y en este video vamos a trabajar en configurar eso y también vamos a discutir cómo

16
00:01:04,140 --> 00:01:07,080
‫esto va a involucrar un concepto conocido como casting.

17
00:01:07,080 --> 00:01:12,330
‫Ahora, la razón por la que queremos el controlador es porque hay funciones en el controlador que nos permiten

18
00:01:12,330 --> 00:01:14,820
‫obtener el resultado del éxito debajo del cursor.

19
00:01:14,820 --> 00:01:16,860
‫Ahora estamos hablando del cursor del mouse.

20
00:01:16,860 --> 00:01:20,310
‫Así que digamos que esta es nuestra pantalla y aquí está el cursor de nuestro mouse.

21
00:01:20,310 --> 00:01:25,530
‫Y el punto en la punta del cursor corresponde a una ubicación en la pantalla.

22
00:01:25,530 --> 00:01:31,740
‫Ahora, si movemos el cursor, nuestro objetivo es que la parte de la torreta de nuestro tanque, la

23
00:01:31,740 --> 00:01:37,290
‫parte superior de nuestra malla, gire de modo que mire en la dirección de ese cursor.

24
00:01:37,440 --> 00:01:44,370
‫Ahora, si movemos el cursor, hay una función en el controlador que podemos usar para obtener

25
00:01:44,370 --> 00:01:47,190
‫la ubicación correspondiente a ese cursor.

26
00:01:47,190 --> 00:01:52,830
‫Si tuviéramos que dibujar una línea recta desde la cámara hacia el cursor y golpear

27
00:01:52,830 --> 00:01:59,700
‫algún objeto en el mundo, podemos obtener esa ubicación y usarla para establecer la rotación de la torreta del tanque.

28
00:01:59,730 --> 00:02:00,960
‫Déjame mostrarte lo que quiero decir.

29
00:02:00,960 --> 00:02:06,420
‫Ahora, para obtener esta ubicación de golpe correspondiente a nuestro cursor, necesitamos usar el controlador.

30
00:02:06,420 --> 00:02:09,480
‫Ahora, hablemos del controlador por un breve momento.

31
00:02:09,780 --> 00:02:11,880
‫Digamos que tenemos nuestro peón en el mundo.

32
00:02:11,880 --> 00:02:13,950
‫Un peón tendrá un controlador.

33
00:02:14,130 --> 00:02:18,210
‫Este es un objeto invisible que está asociado con el peón.

34
00:02:18,210 --> 00:02:24,180
‫Ahora, para nuestro peón, nuestro controlador tendrá el controlador de jugador tipo A y al

35
00:02:24,180 --> 00:02:27,720
‫comienzo del juego, el controlador poseerá el peón.

36
00:02:27,750 --> 00:02:32,790
‫Es por esto que podemos ver desde el punto de vista de la cámara que pertenece a nuestro tanque de peones.

37
00:02:32,790 --> 00:02:34,890
‫Ahora podemos acceder a este controlador.

38
00:02:34,920 --> 00:02:38,970
‫Nuestra clase de tanque hereda una función llamada Obtener controlador.

39
00:02:38,970 --> 00:02:41,100
‫Se hereda de la clase --.

40
00:02:41,100 --> 00:02:46,950
‫Entonces, lo que nos gustaría hacer es obtener ese controlador y almacenarlo en una variable para que podamos usarlo para acceder

41
00:02:46,950 --> 00:02:51,270
‫a la función que necesitamos para obtener el resultado de éxito debajo del cursor.

42
00:02:51,270 --> 00:02:53,010
‫Así que preparémonos para eso.

43
00:02:53,010 --> 00:02:58,650
‫Ahora estoy aquí en la clase de tanques y el lugar donde necesitamos acceder a nuestro controlador es comenzar a jugar.

44
00:02:58,680 --> 00:03:05,190
‫Si lo hacemos en el constructor, es demasiado pronto y es posible que aún no tengamos un controlador válido.

45
00:03:05,190 --> 00:03:08,910
‫Así que vamos a necesitar la función de inicio de juego aquí en la clase de tanque.

46
00:03:08,910 --> 00:03:14,250
‫Ahora lo tenemos aquí en la clase base pong y hasta ahora no estamos usando realmente comenzar a jugar en la

47
00:03:14,250 --> 00:03:15,090
‫clase base pong.

48
00:03:15,270 --> 00:03:18,450
‫Entonces, lo que me gustaría hacer es moverlo a la clase de tanque.

49
00:03:18,450 --> 00:03:24,150
‫Así que voy a resaltar el comienzo de la reproducción, incluido el comentario y la sección protegida aquí,

50
00:03:24,150 --> 00:03:25,500
‫y simplemente lo cortaré.

51
00:03:25,500 --> 00:03:28,710
‫Y luego, de vuelta en la etapa de tanque, voy a pegarlo.

52
00:03:28,710 --> 00:03:33,960
‫Agreguemos esta sección protegida aquí justo encima de la sección privada con comenzar a jugar adentro.

53
00:03:33,960 --> 00:03:36,270
‫Ahora hemos eliminado Begin Play del peón base.

54
00:03:36,840 --> 00:03:41,430
‫Ya no lo tenemos aquí, pero también debemos eliminarlo de base pond cpp.

55
00:03:41,460 --> 00:03:42,240
‫Aquí está.

56
00:03:42,240 --> 00:03:48,960
‫Podemos continuar y eliminarlo aquí y ahora lo tenemos declarado aquí en el tanque H, pero también debemos

57
00:03:48,960 --> 00:03:51,330
‫definirlo en el tanque CPP.

58
00:03:51,360 --> 00:03:55,830
‫Así que voy a definir la función justo debajo del componente de entrada del reproductor de configuración.

59
00:03:55,830 --> 00:04:00,660
‫Por lo tanto, será nulo comenzar a jugar sin parámetros de entrada.

60
00:04:00,870 --> 00:04:06,840
‫Está el cuerpo de la función y también necesitamos un tanque que prefije el nombre de la función.

61
00:04:06,840 --> 00:04:09,930
‫Ahora sabemos que es importante llamar súper grande en el juego.

62
00:04:09,930 --> 00:04:16,320
‫Entonces, de esa manera, se seguirá llamando a cualquier funcionalidad en la función de inicio de reproducción y cualquiera de las

63
00:04:16,320 --> 00:04:17,010
‫clases principales.

64
00:04:17,340 --> 00:04:18,960
‫Así que aquí hemos comenzado a jugar.

65
00:04:18,990 --> 00:04:22,560
‫Aquí es donde podemos obtener nuestro controlador y almacenarlo en una variable.

66
00:04:22,560 --> 00:04:25,920
‫Así que volvamos al Tanque H y creemos una variable.

67
00:04:25,920 --> 00:04:30,750
‫Ahora, esto será privado y lo pegaré aquí abajo en la parte inferior

68
00:04:30,750 --> 00:04:38,460
‫de la sección privada y será un tipo de puntero de controlador de jugador y podemos llamar a este controlador de jugador ref.

69
00:04:38,460 --> 00:04:40,920
‫Esta será nuestra referencia al controlador del jugador.

70
00:04:40,950 --> 00:04:43,590
‫Ahora no estamos hablando de una referencia de C++.

71
00:04:43,590 --> 00:04:48,750
‫Esto sigue siendo solo un puntero, pero lo usaremos para referirnos al controlador del reproductor.

72
00:04:48,750 --> 00:04:55,560
‫Así que ahora tenemos una variable de referencia del controlador de jugador de tipo A controlador de jugador y estamos listos para

73
00:04:55,590 --> 00:04:57,600
‫almacenar el controlador en este puntero.

74
00:04:57,600 --> 00:05:02,730
‫Así que volvamos a Tank Dot CP aquí y comencemos a jugar e intentemos hacer esto.

75
00:05:02,730 --> 00:05:03,330
‫Asi que.

76
00:05:03,400 --> 00:05:12,100
‫Lo que voy a hacer es decir jugador, controlador, ref es igual y voy a intentar llamar a obtener controlador.

77
00:05:12,880 --> 00:05:17,440
‫Ahora obtenga el controlador, como mencioné, está en la clase --.

78
00:05:17,470 --> 00:05:24,070
‫Hagamos clic derecho y vayamos a la definición y observemos que esta función devuelve un controlador A.

79
00:05:24,100 --> 00:05:29,020
‫Ahora nuestra variable es de tipo A jugador controlador, no un controlador.

80
00:05:29,020 --> 00:05:35,260
‫Entonces, lo que intentamos hacer aquí es tomar el valor de retorno de get controller, que es un tipo de

81
00:05:35,260 --> 00:05:40,270
‫puntero de controlador y estamos tratando de almacenarlo en un puntero de controlador de jugador A.

82
00:05:40,300 --> 00:05:42,330
‫Observe que vemos el rojo ondulado aquí.

83
00:05:42,340 --> 00:05:43,940
‫Dice un valor de tipo.

84
00:05:43,960 --> 00:05:48,080
‫Un puntero de controlador no se puede asignar a una entidad de tipo.

85
00:05:48,100 --> 00:05:49,630
‫Un controlador de jugador.

86
00:05:49,660 --> 00:05:51,210
‫Estamos recibiendo un error.

87
00:05:51,220 --> 00:05:55,390
‫Echemos un vistazo aquí a la documentación de un controlador.

88
00:05:55,420 --> 00:05:56,400
‫Echar un vistazo.

89
00:05:56,410 --> 00:05:58,030
‫Aquí hay un controlador.

90
00:05:58,030 --> 00:06:00,460
‫Y dice herencia, jerarquía.

91
00:06:00,460 --> 00:06:05,690
‫Y debajo de un controlador vemos un controlador y un controlador de jugador.

92
00:06:05,710 --> 00:06:10,210
‫Esto significa que un controlador de jugador es una clase secundaria de un controlador.

93
00:06:10,240 --> 00:06:14,500
‫Ahora, en C++, no podemos tener un puntero de tipo.

94
00:06:14,530 --> 00:06:20,200
‫Un controlador de jugador almacena el valor de la dirección de un controlador A.

95
00:06:20,530 --> 00:06:22,600
‫Un controlador es el tipo principal.

96
00:06:22,780 --> 00:06:25,450
‫Un controlador de jugador es del tipo niño.

97
00:06:25,450 --> 00:06:30,960
‫No puede tomar un objeto de tipo principal y almacenarlo en un puntero de tipo secundario.

98
00:06:30,970 --> 00:06:32,680
‫Entonces, ¿cómo solucionamos esto?

99
00:06:32,680 --> 00:06:34,000
‫Así que aquí está nuestro problema.

100
00:06:34,000 --> 00:06:38,630
‫La función obtener controlador devuelve la dirección de un controlador A.

101
00:06:38,650 --> 00:06:44,410
‫Ahora, esto es algo que podríamos almacenar en un puntero de controlador A, pero no podemos almacenarlo en un puntero de controlador

102
00:06:44,410 --> 00:06:45,410
‫de jugador A.

103
00:06:45,430 --> 00:06:52,000
‫Sin embargo, lo curioso es que el objeto devuelto por get controller es, de hecho, un controlador de jugador.

104
00:06:52,000 --> 00:06:58,630
‫Así que tenemos esta dirección en forma de un puntero de controlador A y sabemos que almacena un controlador de jugador, pero

105
00:06:58,630 --> 00:07:03,910
‫si la tenemos en forma de controlador A, no podemos acceder a la función que necesitamos porque

106
00:07:03,910 --> 00:07:06,210
‫existe en un controlador de jugador. .

107
00:07:06,220 --> 00:07:08,810
‫La función se llama get hit result under cursor.

108
00:07:08,830 --> 00:07:15,250
‫Ahora bien, si tenemos un valor de puntero de controlador de tipo A e intentamos obtener esa función que

109
00:07:15,250 --> 00:07:18,430
‫existe en un controlador de reproductor, no lo haremos.

110
00:07:18,460 --> 00:07:20,020
‫Obtendremos un error de compilación.

111
00:07:20,020 --> 00:07:25,960
‫Entonces, dado que sabemos que el objeto en sí es un controlador de jugador, solo se almacena en un puntero de controlador A.

112
00:07:25,960 --> 00:07:27,610
‫¿Cómo solucionamos este problema?

113
00:07:27,610 --> 00:07:29,980
‫La respuesta es que tenemos que lanzar.

114
00:07:30,010 --> 00:07:36,100
‫Sabemos que un controlador es la clase principal y un controlador de jugador es la clase secundaria.

115
00:07:36,100 --> 00:07:41,320
‫Y sabemos que no podemos tener un controlador A almacenado en un puntero de controlador de jugador A.

116
00:07:41,320 --> 00:07:46,750
‫Sabemos que podemos ir al revés y tener una tienda de punteros de controlador A, un objeto de un controlador

117
00:07:46,750 --> 00:07:47,530
‫de jugador.

118
00:07:47,620 --> 00:07:53,290
‫De hecho, eso es lo que estamos viendo cuando llamamos a get controller, devuelve un puntero de controlador A que apunta

119
00:07:53,290 --> 00:07:55,120
‫a un controlador de jugador A.

120
00:07:55,120 --> 00:08:01,810
‫Entonces, si tenemos un valor de puntero de controlador de tipo A, podemos usar una función especial llamada conversión para convertir

121
00:08:01,810 --> 00:08:05,920
‫el tipo de puntero en un puntero de controlador de jugador A.

122
00:08:05,920 --> 00:08:13,720
‫Entonces, la conversión cambia el tipo de un puntero a otro tipo de puntero siempre que el objeto en sí sea del tipo al

123
00:08:13,720 --> 00:08:15,640
‫que estamos tratando de convertir.

124
00:08:15,670 --> 00:08:21,430
‫Ahora, si intentamos convertir a un tipo no válido, por ejemplo, tenemos un puntero de controlador A que apunta a un

125
00:08:21,430 --> 00:08:23,140
‫objeto de controlador de jugador.

126
00:08:23,140 --> 00:08:30,070
‫Si intentamos lanzar para decir, un personaje, la función de lanzamiento devuelve nulo y decimos que fallamos en el

127
00:08:30,070 --> 00:08:30,820
‫lanzamiento.

128
00:08:30,820 --> 00:08:33,160
‫Así que la función de conversión se ve así.

129
00:08:33,190 --> 00:08:36,790
‫Es una plantilla como crear un subobjeto predeterminado.

130
00:08:36,790 --> 00:08:42,850
‫Esta función de plantilla se adaptará al tipo elegido y en esta función, el tipo que pasamos es el tipo

131
00:08:42,850 --> 00:08:44,230
‫que estamos emitiendo también.

132
00:08:44,230 --> 00:08:45,400
‫Entonces pasamos ese tipo.

133
00:08:45,400 --> 00:08:51,700
‫Nos gustaría lanzar dos dentro de los paréntesis angulares y pasamos el puntero que nos gustaría lanzar

134
00:08:51,700 --> 00:08:52,570
‫entre paréntesis.

135
00:08:52,570 --> 00:08:53,710
‫Aquí hay un ejemplo.

136
00:08:53,710 --> 00:08:59,410
‫Digamos que nos gustaría lanzar a un controlador de jugador y un puntero del tipo de controlador tipo A.

137
00:08:59,410 --> 00:09:04,240
‫Pasamos el puntero entre paréntesis y el tipo que estamos proyectando entre los corchetes angulares.

138
00:09:04,240 --> 00:09:08,590
‫Y lo que se devuelve es un valor de puntero de controlador de jugador de tipo A.

139
00:09:08,590 --> 00:09:13,720
‫Así que aquí está la llamada a la función donde estamos pasando el tipo entre paréntesis angulares y

140
00:09:13,720 --> 00:09:18,550
‫el valor del puntero del controlador A que recibimos de get controller puede ir entre paréntesis.

141
00:09:18,550 --> 00:09:22,630
‫Por lo tanto, debemos emitir este valor que nos devuelve el controlador de obtención.

142
00:09:22,630 --> 00:09:24,250
‫Ese va a ser tu desafío.

143
00:09:24,250 --> 00:09:31,840
‫Entonces, en Begin Play, use la función de obtener controlador y pase ese valor a la función de conversión y envíe a

144
00:09:31,840 --> 00:09:33,550
‫un controlador de jugador.

145
00:09:33,550 --> 00:09:39,490
‫Y luego puede almacenar el resultado en nuestro puntero de referencia del controlador de jugador, que es un puntero de controlador de jugador de

146
00:09:39,490 --> 00:09:40,120
‫tipo A.

147
00:09:40,120 --> 00:09:42,580
‫Pausa el video y realiza el elenco.

148
00:09:45,530 --> 00:09:45,860
‫Bueno.

149
00:09:45,860 --> 00:09:49,570
‫Así que casi tenemos todo el trabajo hecho aquí, solo tenemos que lanzar.

150
00:09:49,580 --> 00:09:56,000
‫Entonces, lo que vamos a hacer es llamar a la función de conversión, que tiene corchetes angulares y paréntesis.

151
00:09:56,000 --> 00:09:59,990
‫Y lo que va entre paréntesis es el valor que nos gustaría emitir.

152
00:09:59,990 --> 00:10:05,060
‫Ahora get controller devuelve un puntero del controlador Tipo A.

153
00:10:05,060 --> 00:10:07,850
‫Voy a mover eso aquí mismo entre paréntesis.

154
00:10:07,850 --> 00:10:12,110
‫Y el tipo al que estamos lanzando es un controlador de jugador.

155
00:10:14,050 --> 00:10:17,620
‫Así que de nuevo estamos tomando el valor devuelto por get controller.

156
00:10:17,620 --> 00:10:21,160
‫Esto devuelve un puntero de controlador o una dirección.

157
00:10:21,160 --> 00:10:25,000
‫Luego estamos usando cast para enviarlo a un controlador de jugador A.

158
00:10:25,000 --> 00:10:31,330
‫Sabemos que el objeto devuelto por el controlador de puerta es un objeto de controlador de jugador A almacenado en un puntero

159
00:10:31,330 --> 00:10:32,320
‫de controlador A.

160
00:10:32,320 --> 00:10:38,500
‫Entonces, después de lanzar esto, lo que se devuelve es un puntero del controlador de jugador tipo A.

161
00:10:38,500 --> 00:10:41,410
‫Así que estamos almacenando eso en el controlador del jugador ref.

162
00:10:41,410 --> 00:10:46,990
‫Ahora que tenemos acceso al controlador en la forma de un puntero de controlador de jugador A, podemos acceder a

163
00:10:46,990 --> 00:10:50,830
‫la función que necesitamos para obtener el resultado de rastreo bajo el cursor.

164
00:10:50,830 --> 00:10:55,570
‫Entonces, en resumen, usamos get controller para obtener acceso al controlador.

165
00:10:55,930 --> 00:11:03,040
‫También usamos la función de conversión para enviar desde el puntero del controlador tipo A al puntero del controlador del jugador tipo

166
00:11:03,040 --> 00:11:03,670
‫A.

167
00:11:03,670 --> 00:11:10,000
‫Ahora podemos acceder a la función que necesitamos, que es obtener resultados de éxito bajo el cursor que existe en la clase de

168
00:11:10,000 --> 00:11:11,290
‫controlador de jugador A.

169
00:11:11,290 --> 00:11:14,500
‫Entonces, comenzaremos a usar esta función en el próximo video.

170
00:11:14,860 --> 00:11:15,850
‫Te veré pronto.

