﻿1
00:00:03,980 --> 00:00:05,900
‫Hola y bienvenido de nuevo.

2
00:00:05,930 --> 00:00:10,610
‫Ahora hemos creado un tanque que puede moverse e incluso girar su torreta.

3
00:00:10,610 --> 00:00:16,190
‫Y ahora estamos listos para crear una clase de torre que pueda heredar parte de la funcionalidad que el

4
00:00:16,190 --> 00:00:18,830
‫tanque heredó de la clase base de pod.

5
00:00:19,100 --> 00:00:24,560
‫Ahora, una vez que hayamos creado una clase de torre, vamos a anular la función de tic para poder

6
00:00:24,560 --> 00:00:26,000
‫rotar su torreta también.

7
00:00:26,030 --> 00:00:32,080
‫Así que nuestro objetivo aquí es hacer que las torretas giren para que siempre estén mirando al tanque.

8
00:00:32,090 --> 00:00:37,430
‫De esta manera, cuando comiencen a disparar proyectiles, a veces golpearán el tanque siempre que el tanque

9
00:00:37,430 --> 00:00:39,020
‫no se mueva rápidamente.

10
00:00:39,630 --> 00:00:43,740
‫Y también vamos a averiguar cómo podemos conseguir el tanque --.

11
00:00:43,770 --> 00:00:49,380
‫De esa manera podemos apuntar al tanque y girar la torreta de las torres hacia el tanque.

12
00:00:49,410 --> 00:00:52,350
‫Nos estamos preparando para un combate de proyectiles.

13
00:00:52,650 --> 00:00:58,200
‫Así que estoy aquí en el editor y voy a ir a nuestra carpeta tune tanks donde están la base

14
00:00:58,200 --> 00:00:59,910
‫y las clases de tanques.

15
00:01:00,270 --> 00:01:04,650
‫Ahora, me gustaría crear una clase de torre basada en la clase base.

16
00:01:04,770 --> 00:01:07,850
‫Ahora, la forma en que hicimos esto con la clase de tanque fue correcta.

17
00:01:07,860 --> 00:01:14,430
‫Se hizo clic en la base y se seleccionó crear una clase de C++ derivada de una forma alternativa que consiste

18
00:01:14,430 --> 00:01:18,210
‫en ir a herramientas y seleccionar una nueva clase de C++.

19
00:01:18,540 --> 00:01:24,630
‫Y desde aquí podemos hacer clic en la pestaña que dice todas las clases y buscar base --.

20
00:01:24,750 --> 00:01:27,270
‫Y aquí vemos nuestra clase base.

21
00:01:27,480 --> 00:01:33,050
‫Si selecciono esto y hago clic en siguiente, ahora crearé una nueva clase basada en la base --.

22
00:01:33,060 --> 00:01:38,910
‫Lo dejaré en el mismo camino que todas nuestras otras clases de C++ y lo llamaré torre.

23
00:01:39,210 --> 00:01:41,070
‫Así que hagamos clic en Crear clase.

24
00:01:41,610 --> 00:01:44,720
‫Así que aquí está mi nueva era de la torre y Tower Dot.

25
00:01:44,790 --> 00:01:51,360
‫CP Ahora, lo primero que necesitamos es la función de tic porque la torre va a querer rotar su

26
00:01:51,360 --> 00:01:53,520
‫torreta para mirar hacia --.

27
00:01:53,730 --> 00:01:56,640
‫Así que vamos a anular la función de marca aquí.

28
00:01:56,640 --> 00:02:03,930
‫Así que voy a hacer una nueva sección pública y vamos a escribir virtual void tick, que toma un valor

29
00:02:03,930 --> 00:02:07,560
‫flotante llamado Delta Time, y esto es una anulación.

30
00:02:07,560 --> 00:02:14,100
‫Ahora entraremos en más detalles sobre virtual y override en videos futuros, pero esencialmente estamos tomando la

31
00:02:14,100 --> 00:02:18,600
‫función de marca heredada y creando una nueva implementación para ella.

32
00:02:18,600 --> 00:02:23,520
‫Así que tomemos la función tick e implementémosla aquí en Tower CP.

33
00:02:23,550 --> 00:02:29,370
‫Ahora necesitamos prefijar el nombre de la función tick con una torre y los dos puntos dobles.

34
00:02:29,370 --> 00:02:34,950
‫Y como siempre, es una buena idea llamar a super tick y necesitamos pasar en tiempo Delta.

35
00:02:34,950 --> 00:02:40,830
‫Ahora lo que me gustaría hacer aquí es rotar la torreta del tanque para que la torre amenace al tanque y

36
00:02:40,830 --> 00:02:42,390
‫esté lista para disparar proyectiles.

37
00:02:42,390 --> 00:02:45,870
‫Pero me gustaría hacer esto solo si el tanque está dentro del alcance.

38
00:02:46,170 --> 00:02:52,620
‫Ahora, para saber si el tanque está o no dentro del alcance, necesitamos saber la distancia desde la torreta

39
00:02:52,620 --> 00:02:53,750
‫hasta el tanque.

40
00:02:53,760 --> 00:02:57,510
‫Ahora, aquí hay un pequeño artilugio que representa el origen del mundo.

41
00:02:57,510 --> 00:03:01,470
‫En otras palabras, el punto en el espacio donde X, Y y Z son cero.

42
00:03:01,470 --> 00:03:08,220
‫Ahora, cuando hablamos de la ubicación de un actor, estamos hablando del vector desde el origen hasta esa

43
00:03:08,220 --> 00:03:08,970
‫ubicación.

44
00:03:08,970 --> 00:03:15,060
‫Y siempre podemos obtener ese vector de ubicación usando obtener la ubicación del actor para que podamos obtener la ubicación de una

45
00:03:15,060 --> 00:03:17,430
‫de las torres y la ubicación del tanque.

46
00:03:17,430 --> 00:03:21,930
‫Y si conocemos esos dos lugares, podemos calcular la distancia entre ellos.

47
00:03:21,930 --> 00:03:28,470
‫Ahora, podríamos hacer esto con matemáticas vectoriales, pero la clase de vectores F tiene una función llamada dist, y esta

48
00:03:28,470 --> 00:03:33,810
‫función lleva a los vectores de ubicación y lo que devuelve es la distancia entre ellos.

49
00:03:33,810 --> 00:03:40,440
‫Así que aquí en el archivo CP de la torre, en la función tick, voy a escribir un par de notas para que sepamos lo que

50
00:03:40,440 --> 00:03:41,940
‫se supone que debemos hacer.

51
00:03:41,940 --> 00:03:52,890
‫Primero, debemos encontrar la distancia al tanque después de verificar si el tanque está dentro del alcance y, si está

52
00:03:52,890 --> 00:03:58,170
‫dentro del alcance, girar la torreta hacia el tanque.

53
00:03:59,070 --> 00:04:00,960
‫Así que tenemos algunas cosas que hacer aquí.

54
00:04:01,140 --> 00:04:05,820
‫Ahora, para encontrar la distancia al tanque, necesitamos agarrar el tanque.

55
00:04:05,850 --> 00:04:08,640
‫Ahora, un buen lugar para hacerlo es Begin Play.

56
00:04:08,640 --> 00:04:13,350
‫Entonces, además de la función de tic, sigamos adelante y anulemos Begin Play.

57
00:04:13,380 --> 00:04:17,580
‫Ahora observe en el Tanque H, el comienzo del juego está en una sección protegida.

58
00:04:17,580 --> 00:04:21,210
‫También lo mantendremos protegido en la torre.

59
00:04:21,210 --> 00:04:27,870
‫Así que colocaremos la sección protegida justo debajo de la pública e implementaremos el inicio de reproducción justo debajo de la

60
00:04:27,870 --> 00:04:28,380
‫marca.

61
00:04:28,380 --> 00:04:35,580
‫Entonces, vayamos a Tower Dot, CP, implemente, comience a jugar, califique completamente el nombre de la función y, como

62
00:04:35,580 --> 00:04:38,670
‫probablemente haya adivinado, lo llamamos Super Begin Play.

63
00:04:38,790 --> 00:04:44,310
‫Ahora, para obtener el tanque y almacenarlo en una variable, necesitamos una variable de tipo tanque.

64
00:04:44,310 --> 00:04:49,200
‫Así que vamos a colocar eso aquí en Towers H en una sección privada.

65
00:04:49,200 --> 00:04:55,290
‫Ahora bien, esto va a ser un tanque A, es un puntero y simplemente podemos llamar a este tanque.

66
00:04:55,290 --> 00:05:01,980
‫Y para evitar tener que incluir el Tanque H aquí, podemos declarar que hemos visto lo importante que

67
00:05:01,980 --> 00:05:03,000
‫puede ser.

68
00:05:03,360 --> 00:05:09,540
‫Así que ahora tenemos este puntero de tanque y si podemos averiguar cómo acceder al tanque, podemos guardarlo en nuestro puntero

69
00:05:09,540 --> 00:05:11,970
‫de tanque aquí y comenzar a jugar.

70
00:05:12,000 --> 00:05:18,510
‫Lo primero que voy a hacer es incluir el tanque H, de modo que podamos usar el tipo.

71
00:05:18,510 --> 00:05:20,580
‫Entonces, ¿cómo accedemos al tanque?

72
00:05:20,580 --> 00:05:26,220
‫Bueno, aquí está la documentación del motor irreal para una función útil llamada obtener el peón del jugador.

73
00:05:26,310 --> 00:05:29,100
‫Existe en una estática de juego.

74
00:05:29,160 --> 00:05:34,680
‫Así que como tengo esto abierto, voy a seguir adelante y copiar la inclusión para las estadísticas del juego y echar un

75
00:05:34,680 --> 00:05:35,910
‫vistazo a la sintaxis.

76
00:05:35,910 --> 00:05:39,060
‫Tiene dos entradas un objeto de contexto mundial.

77
00:05:39,470 --> 00:05:42,950
‫Ya sabemos cómo manejar eso y un índice de jugadores.

78
00:05:42,950 --> 00:05:49,310
‫Y como vimos para juegos de un solo jugador como el nuestro, el índice de jugador siempre será el jugador

79
00:05:49,310 --> 00:05:53,660
‫cero y eso nos permitirá acceder al peón correspondiente al jugador cero.

80
00:05:54,050 --> 00:05:57,650
‫Así que llamemos a esta función aquí en Tower Dot CP.

81
00:05:57,680 --> 00:06:04,850
‫Voy a pegar la inclusión para sus estadísticas de juego y al comenzar a jugar voy a

82
00:06:04,850 --> 00:06:12,290
‫configurar el tanque igual a sus estadísticas de juego para obtener el jugador, para el objeto de contexto mundial.

83
00:06:12,290 --> 00:06:17,910
‫Puedo pasar esto y para el índice del jugador podemos pasar cero.

84
00:06:17,930 --> 00:06:19,970
‫Ahora mira el ondulado rojo.

85
00:06:19,970 --> 00:06:26,120
‫Dice que un valor de tipo peón no se puede asignar a una entidad de tipo tanque A.

86
00:06:26,150 --> 00:06:33,290
‫Este es exactamente el mismo problema con el que nos encontramos cuando intentábamos llamar, obtener el controlador y almacenar el resultado

87
00:06:33,320 --> 00:06:35,810
‫en un controlador de jugador A.

88
00:06:35,870 --> 00:06:42,200
‫Un tanque es hijo de un peón, por lo que no podemos almacenar un tipo de padre en un puntero hijo.

89
00:06:42,200 --> 00:06:43,370
‫Tenemos que.

90
00:06:44,150 --> 00:06:46,060
‫Lo has adivinado, tenemos que lanzar.

91
00:06:46,070 --> 00:06:51,830
‫Así que vamos a tomar el valor devuelto de esto y lo pondremos dentro de una llamada de función de conversión.

92
00:06:51,830 --> 00:06:56,000
‫Así que vamos a decir cast y estamos lanzando a un tanque.

93
00:06:56,000 --> 00:07:02,300
‫Y lo que vamos a pasar al elenco será esta llamada para conseguir un estanque de jugadores.

94
00:07:02,300 --> 00:07:04,850
‫Así que vamos a poner eso justo ahí entre paréntesis.

95
00:07:04,850 --> 00:07:09,260
‫Y tras el reparto tendremos acceso al tanque.

96
00:07:09,380 --> 00:07:16,310
‫Ahora que tenemos acceso al tanque, podemos encontrar la distancia al tanque y una distancia es un flotador.

97
00:07:16,310 --> 00:07:20,240
‫Entonces podemos hacer una variable flotante local llamada distancia.

98
00:07:20,600 --> 00:07:27,380
‫Y a lo que vamos a igualarlo es al resultado de llamar a la función estática del vector F dist.

99
00:07:27,410 --> 00:07:31,700
‫Ahora dist toma dos parámetros de entrada del vector tipo F.

100
00:07:31,880 --> 00:07:34,850
‫Ahora queremos la distancia entre dos puntos en el espacio.

101
00:07:34,850 --> 00:07:37,010
‫Uno es la ubicación de la torre.

102
00:07:37,010 --> 00:07:43,190
‫Estamos en la clase de la torre, así que podemos pedir la ubicación del actor y eso nos da la ubicación de la torre.

103
00:07:43,190 --> 00:07:44,660
‫Pero, ¿y el tanque?

104
00:07:44,660 --> 00:07:50,870
‫Bueno, podemos llamar al tanque, obtener la ubicación del actor y ahora tenemos la distancia.

105
00:07:50,870 --> 00:07:56,450
‫Ahora, el único problema es que estamos usando el puntero del tanque sin verificar primero para asegurarnos de que no

106
00:07:56,450 --> 00:07:57,110
‫sea nulo.

107
00:07:57,290 --> 00:08:05,600
‫Así que tenemos que decir if tank primero y luego podemos tomar esta llamada de función y arrastrarla aquí dentro de

108
00:08:05,600 --> 00:08:06,860
‫la instrucción if.

109
00:08:06,860 --> 00:08:13,190
‫Entonces, si el tanque es válido, podemos acceder a su ubicación con obtener la ubicación del actor.

110
00:08:13,190 --> 00:08:14,030
‫Excelente.

111
00:08:14,030 --> 00:08:19,130
‫Como estamos trabajando en esta declaración if, voy a mover estos otros comentarios aquí porque sabemos

112
00:08:19,130 --> 00:08:24,410
‫que no podemos verificar si el tanque está dentro del rango, si el tanque ni siquiera es válido.

113
00:08:24,590 --> 00:08:28,790
‫Así que me gustaría desafiarte a girar la torreta hacia el tanque.

114
00:08:28,790 --> 00:08:33,020
‫Ahora, solo queremos hacer esto si el tanque está dentro del alcance, tenemos la distancia.

115
00:08:33,020 --> 00:08:35,240
‫Así que ahora necesitamos una variable de alcance de fuego.

116
00:08:35,240 --> 00:08:40,490
‫Así que cree un flotador llamado campo de tiro en la clase de torre y expóngalo con su propiedad.

117
00:08:40,490 --> 00:08:42,980
‫Nos gustaría poder editar esto desde el editor.

118
00:08:43,010 --> 00:08:45,890
‫Ahora vas a comprobar si el tanque está dentro del alcance.

119
00:08:45,890 --> 00:08:50,630
‫Si se llama rotar torreta y rotar torreta necesita un vistazo al objetivo.

120
00:08:50,630 --> 00:08:53,180
‫Vas a pasar en la ubicación de los tanques.

121
00:08:53,180 --> 00:08:56,660
‫Así que pausa el video e implementa este comportamiento ahora.

122
00:09:00,030 --> 00:09:00,420
‫Bueno.

123
00:09:00,420 --> 00:09:02,370
‫Entonces necesitamos una variable de rango de fuego.

124
00:09:02,370 --> 00:09:05,940
‫Así que aquí en la Torre H tenemos una sección privada.

125
00:09:05,940 --> 00:09:07,680
‫Vamos a hacer un flotador.

126
00:09:08,340 --> 00:09:15,450
‫Voy a llamar a este campo de tiro y voy a continuar e inicializarlo a un valor de,

127
00:09:15,450 --> 00:09:16,650
‫digamos, 300 F.

128
00:09:16,650 --> 00:09:21,030
‫Pero experimentaremos con esto porque será una propiedad suya.

129
00:09:21,240 --> 00:09:22,860
‫Así que tu propiedad.

130
00:09:22,860 --> 00:09:29,070
‫Y como me gustaría que todos los tanques tuvieran el mismo rango de fuego, voy a hacer esto y solo

131
00:09:29,070 --> 00:09:29,910
‫por defecto.

132
00:09:29,910 --> 00:09:33,270
‫De esa manera, solo podemos editarlo en el plano predeterminado.

133
00:09:33,300 --> 00:09:38,940
‫Ahora, si hiciste la tuya editada en cualquier lugar o tal vez editaste solo una instancia, está totalmente bien.

134
00:09:38,940 --> 00:09:42,090
‫Es realmente una cuestión de preferencia y podemos cambiarlo más tarde.

135
00:09:42,090 --> 00:09:46,710
‫Voy a darle una categoría también y voy a llamar a esta categoría combate.

136
00:09:46,740 --> 00:09:50,820
‫Vayamos a Tower CP y tenemos este siguiente punto aquí.

137
00:09:50,820 --> 00:09:57,120
‫Verifique si el tanque está dentro del alcance, lo que significa que debemos verificar si la distancia es menor o

138
00:09:57,120 --> 00:09:59,160
‫igual que el alcance del fuego.

139
00:09:59,160 --> 00:10:04,860
‫Tenemos menor o igual que y no solo igual a, porque de un cuadro a otro, la distancia puede ser

140
00:10:04,860 --> 00:10:11,310
‫mayor que el rango de tiro, un cuadro y menos que el rango de tiro en el siguiente cuadro pasando por completo el rango

141
00:10:11,310 --> 00:10:11,970
‫de tiro.

142
00:10:11,970 --> 00:10:15,870
‫Por lo tanto, es posible que nunca llegue a ser exactamente igual al rango de fuego.

143
00:10:15,870 --> 00:10:20,820
‫De hecho, con valores de coma flotante, dos flotantes exactamente iguales son bastante raros.

144
00:10:20,820 --> 00:10:26,640
‫Así que tenemos esto si marcamos y si llegamos al interior, eso significa que la distancia es menor o igual que el

145
00:10:26,640 --> 00:10:27,630
‫alcance del fuego.

146
00:10:27,630 --> 00:10:33,120
‫El tanque ahora está dentro del alcance, lo que significa que este comentario se puede mover allí mismo.

147
00:10:33,960 --> 00:10:41,190
‫Ahora, si está dentro del alcance, gire la torreta hacia el tanque, eso significa que vamos a llamar a la función de rotación

148
00:10:41,190 --> 00:10:42,180
‫de la torreta.

149
00:10:42,390 --> 00:10:45,690
‫Esa es nuestra función protegida que ponemos en el pod base.

150
00:10:45,720 --> 00:10:51,060
‫Ahora girar la torreta echa un vistazo al objetivo y necesitamos la ubicación del tanque.

151
00:10:51,060 --> 00:10:55,410
‫Así que esa va a ser la ubicación del actor.

152
00:10:55,410 --> 00:11:02,010
‫Y con eso ahora estamos llamando a girar la torreta solo si el tanque está dentro del alcance.

153
00:11:02,010 --> 00:11:05,040
‫Así que vamos a compilar esto y ver cómo funciona.

154
00:11:05,340 --> 00:11:12,030
‫Así que estamos de vuelta aquí en el editor y lo que tenemos que hacer es ir a planos, peones y encontrar una torreta

155
00:11:12,030 --> 00:11:15,120
‫de peones BP y abrir el editor de planos completo.

156
00:11:15,120 --> 00:11:22,170
‫Ahora, en la parte superior derecha, vemos el peón base de la clase principal, pero queremos que nuestra clase principal sea la torre para

157
00:11:22,170 --> 00:11:27,930
‫que podamos ir a la configuración de la clase, la clase principal y buscar la torre y seleccionarla.

158
00:11:27,960 --> 00:11:31,980
‫Ahora nuestra torreta de peones se basa en la clase torre.

159
00:11:31,980 --> 00:11:34,710
‫Ahora veamos qué sucede cuando le damos al play.

160
00:11:35,070 --> 00:11:37,200
‫Bien, entonces estoy moviendo el tanque.

161
00:11:37,200 --> 00:11:40,560
‫No estamos dentro del alcance, así que no vemos ningún movimiento de las torres.

162
00:11:40,560 --> 00:11:44,100
‫Pero si entro en rango, mira eso.

163
00:11:44,100 --> 00:11:47,970
‫Ahora me están siguiendo y parece bastante amenazador.

164
00:11:48,120 --> 00:11:52,080
‫Ahora 300 unidades no está tan lejos.

165
00:11:52,080 --> 00:11:55,440
‫Entonces, lo que me gustaría hacer es editar esa distancia.

166
00:11:55,440 --> 00:12:00,840
‫Así que desde aquí en BP Pawn Turret, voy a seleccionar yo mismo BP Pond Turret.

167
00:12:00,840 --> 00:12:02,850
‫Y aquí está la sección de combate.

168
00:12:02,850 --> 00:12:06,840
‫Voy a seguir adelante y establecer esto en alrededor de 700.

169
00:12:07,890 --> 00:12:13,350
‫Ahora, si presiono reproducir, veré que no girarán mientras me muevo de regreso aquí.

170
00:12:13,350 --> 00:12:16,410
‫Pero tan pronto como entro en rango, ahora me están mirando.

171
00:12:18,180 --> 00:12:19,020
‫Perfecto.

172
00:12:20,030 --> 00:12:23,120
‫En resumen, hemos creado la clase torre.

173
00:12:23,120 --> 00:12:25,720
‫Ahora tenemos un enemigo para el tanque.

174
00:12:25,730 --> 00:12:32,060
‫También rotamos la torreta de la torre hacia el tanque en la función de tic y solo lo hacemos si el tanque está

175
00:12:32,060 --> 00:12:33,770
‫dentro del alcance de fuego.

176
00:12:33,770 --> 00:12:39,650
‫También expusimos la variable de rango de fuego para que se pueda ajustar en el plano.

177
00:12:39,770 --> 00:12:41,600
‫Estamos casi listos para el combate.

178
00:12:41,630 --> 00:12:44,450
‫Comenzaremos a configurar eso en los próximos videos.

179
00:12:44,630 --> 00:12:45,620
‫Te veré pronto.

