‫Bueno.
‫Entonces, nuestro objetivo para este video es implementar la muerte para nuestros Pons.
‫Entonces, si me golpean un par de veces desde nuestra torre, verán que he desaparecido porque mi tanque ha
‫muerto.
‫Y si soy lo suficientemente hábil, si puedo seguir adelante y destruir uno de ellos, verás que también
‫desaparece.
‫Así que vamos a implementar la muerte de estos peones en este video.
‫Hola y bienvenido de nuevo.
‫Ahora ya estamos aplicando daño a los peones cuando son golpeados por proyectiles.
‫Ahora tenemos que averiguar cómo vamos a manejar después de la muerte.
‫Esto significa que vamos a necesitar algún tipo de función para manejar la destrucción de un actor en particular.
‫Así que vamos a crear una función de destrucción de identificadores.
‫También necesitamos que un actor muera para funcionar, lo que puede permitir que el modo de juego maneje lo que sucede cuando muere
‫un actor en nuestro mundo y vamos a llamar a este actor muerto función cuando el valor de salud llega a
‫cero para un peón en particular.
‫Así que hablemos un poco de una hoja de ruta sobre cómo vamos a implementar este sistema.
‫Sabemos que tenemos un proyectil y está llamando a aplicar daño y esto da como resultado que la función
‫de recibir daño responda a esa transmisión delegada en el componente de salud.
‫Así que tenemos que averiguar qué hacer a partir de ahí.
‫Bueno, nuestro modo de juego puede tener una función para manejar cuando un actor muere.
‫Entonces, en el daño recibido, podemos verificar si la salud llega a cero.
‫Y en ese punto podemos llamar a la función de muerte del actor en el modo de juego y desde allí nuestro peón
‫puede manejar su destrucción.
‫Entonces, en última instancia, dependerá del modo de juego llamar a la función de destrucción del mango en el actor que
‫murió.
‫Así que tenemos un pequeño plan de juego, así que describamos los pasos a seguir para implementar esto.
‫Primero, vamos a crear la función de destrucción del identificador y la colocaremos en la clase de
‫peón base para manejar la funcionalidad que debería ocurrir cuando alguno de nuestros peones muera.
‫Y también implementaremos esto en las clases de tanque y torre, ya que cada una tendrá su propia
‫funcionalidad única cuando mueran, luego crearemos una función de actor muerto y la colocaremos en la clase de modo
‫de juego para que podamos llame a manejar la destrucción desde allí.
‫Después de eso, llamaremos a manejar la destrucción en la función del actor muerto en el modo de juego y
‫luego podemos llamar al actor muerto del componente de salud cuando la salud llegue a cero.
‫Entonces, comencemos con nuestro primer paso creando la función de destrucción de identificadores.
‫Así que estoy aquí en Base Pond H y me gustaría agregar esta función de destrucción de identificadores.
‫Ahora planeo llamar a esto desde el modo de juego, lo que significa que tendrá que ser
‫una función pública para poder colocar esta función aquí en la sección pública.
‫Será nulo y lo llamaré manejar destrucción.
‫Ahora, no necesita tomar ningún parámetro de entrada.
‫Simplemente se encargará de la destrucción de este peón en particular.
‫Entonces, implementemos esta función en el archivo CP del peón base y la colocaré justo aquí debajo
‫del constructor.
‫Así que he manejado la destrucción y voy a colocar el nombre de una clase de peón base justo antes del nombre de la
‫función aquí.
‫Ahora, esto va a ser cosas que sucederán cuando cualquiera de los peones basados en el peón base muere.
‫Así que voy a colocar una tarea aquí que dice lo que vamos a hacer en la función de destrucción de identificadores.
‫Me gustaría manejar aquí todos los efectos visuales y de sonido que tienen que ver con la muerte del peón.
‫Así que solo voy a decir efectos de sonido de barra visual y lo dejaremos así y nos aseguraremos
‫de recordar implementar esto cuando lleguemos a la parte de efectos especiales y sonidos de esta sección del
‫curso.
‫Ahora tenemos la destrucción de la manija aquí, pero también me gustaría poner una función de destrucción de la manija
‫en las clases de tanque y torre para manejar lo que sucede cuando esos peones mueren.
‫Y la implementación más simple de destrucción quizás sea para nuestra torre.
‫Así que vayamos a la Torre H y agregaremos una función pública aquí llamada manejar la destrucción.
‫Así que voy a decir void handle destroy y voy a implementar esto y a la torre CP justo debajo de la
‫función tick.
‫Así que aquí está tick here's handle destroy y voy a prefijar el nombre de la función con una torre
‫así.
‫Ahora, en la función de destrucción de manijas para la torre, me gustaría llamar a la versión súper para que se llame la
‫destrucción de manijas en el peón base y obtendremos esos efectos visuales y de sonido cuando una torre muera.
‫Así que voy a decir destrucción de súper manejador solo para asegurarme de que eso se llame.
‫Y después de eso, simplemente voy a destruir la torre.
‫Ahora hemos visto cómo funciona esto.
‫Simplemente llamamos a la función de destrucción, y eso manejará la destrucción de la torre.
‫Así que puedo guardar esto y cerrar los archivos de torre y CP y ahora puedo colocar una función de destrucción de
‫identificadores en la clase de tanque.
‫Así que voy a ir al tanque y declarar una función pública aquí bajo la función de marca llamada
‫manejar destrucción.
‫Y voy a ir a Tank CP e implementar esto justo debajo del tic aquí, sin olvidar prefijar el nombre
‫de la función con un tanque.
‫Ahora, al igual que en la clase de la torre, nos gustaría llamar a la destrucción del súper mango.
‫Y de esa manera obtendremos esos efectos visuales y sonoros.
‫Ahora para el tanque, vamos a hacer algo un poco diferente.
‫Me gustaría esconder el tanque en lugar de destruirlo.
‫Y luego podemos deshabilitar su funcionalidad TIC para que siga existiendo en el mundo y aún la poseamos.
‫Así que todavía tenemos esa vista de la cámara.
‫Solo que no podremos verlo ni moverlo.
‫Entonces, para ocultar el tanque, podemos llamar a una función llamada establecer actor oculto en el juego y esto tomará un valor booleano.
‫Y si pasamos en verdad, ocultaremos efectivamente el tanque.
‫Ahora también me gustaría deshabilitar el tictac y también hay una función para eso.
‫Se llama activar el tic del actor.
‫Y para esto voy a pasar falso, lo que deshabilitará el tic-tac del tanque.
‫Entonces eso se ocupa de nuestra función de destrucción de identificadores.
‫Así que tenemos nuestra función de destrucción de identificadores.
‫Nuestro próximo paso es crear una función de actor muerto en el modo de juego.
‫Así que implementemos eso.
‫Así que estoy aquí en el modo de juego tune tanks y aquí puedo crear la función de actor muerto ahora planeo llamar actor muerto
‫de la clase de componente de salud, lo que significa que esto también debe ser una función pública.
‫Así que agregaré una sección pública y crearé la función de muerte del actor.
‫Ahora esto será nulo y lo llamaré actor muerto.
‫Y esto puede simplemente tomar un puntero de actor llamado Dead Actor y ahora podemos implementar el actor muerto en el modo de
‫juego tune tanks.
‫CP Así que voy a colocarlo aquí y anteponer el nombre con un modo de juego tune tanks y ahora tenemos una función
‫de actor muerto.
‫Ahora me gustaría verificar si el actor muerto es el tanque, lo que significa que voy a necesitar una variable
‫para el tanque.
‫Así que de vuelta en el modo de juego de tanques de sintonía.
‫Voy a hacer una sección privada y voy a agregar una variable de tanque que voy a declarar hacia
‫adelante.
‫Y es un puntero de tanque tipo A y simplemente voy a llamar a este tanque y necesitaré inicializarlo con
‫la dirección del estanque del tanque, y puedo hacer eso y comenzar a jugar.
‫Ahora hemos visto que comenzar a jugar es una función protegida y la mantendremos protegida aquí en el modo
‫de juego para que podamos anular, comenzar, jugar.
‫Así que voy a decir virtual void, begin, play, override, y puedo implementarlo aquí en tune tanks, modo de
‫juego.
‫Sí.
‫Así que va a ser nulo, comience a jugar y voy a usar los tanques de sintonización, el nombre de la clase del modo de juego.
‫Y lo primero que voy a hacer es llamar a Super Begin Play.
‫De esa manera, obtenemos la funcionalidad principal y puedo obtener el peón del jugador usando estadísticas de juego.
‫Así que primero voy a incluir estadísticas de juego y eso está en las estadísticas de juego de kismet slash como ya
‫hemos visto.
‫Y aquí puedo tomar Tank y asignarle el valor de la estática del juego juvenil.
‫Palma del guitarrista.
‫Ahora, esto toma un objeto de contexto mundial para el cual podemos usar esto, y voy a usar cero como el
‫índice del jugador ya que nuestro tanque siempre será el jugador cero.
‫Ahora sabemos que jet player -- devuelve un puntero A -- y tank es del tipo A tank, una clase secundaria.
‫Y hemos visto que necesitamos convertir a esa clase de tanque si queremos almacenar este resultado en un puntero de tanque
‫A.
‫Así que primero voy a incluir el encabezado del tanque.
‫Así que voy a decir incluir el tanque H y luego voy a lanzar a un tanque.
‫Así que voy a decir lanzar a un tanque y estoy lanzando el valor devuelto por get player --.
‫Así que voy a poner eso entre paréntesis aquí.
‫Y ahora tendremos un puntero al jugador, en forma de un puntero de tanque A.
‫Entonces, ahora que tenemos el tanque, podemos verificar si nuestro actor muerto es el tanque.
‫Entonces podemos decir que si el actor muerto es doblemente igual al tanque, ahora el tanque puede ser nulo.
‫Y está bien porque si Tank es nulo y el actor muerto se refiere al tanque en sí, fallará la
‫verificación if y no intentaremos acceder a un puntero nulo porque no llegaremos al interior
‫de esto.
‫Ahora, si el actor muerto es de hecho el tanque, entonces me gustaría llamar a la función de destrucción del identificador del tanque.
‫Así que vamos a llamar destrucción del mango del tanque.
‫Ahora, después de llamar a la función de destrucción del controlador, también me gustaría deshabilitar la entrada para la
‫cápsula del tanque para poder obtener el tanque y llamar a la función integrada que hereda el tanque llamada deshabilitar entrada.
‫Ahora deshabilitar la entrada requiere un controlador de jugador A.
‫Ahora sabemos que la clase de tanque, si entramos aquí en el tanque H, tiene esta variable ref del controlador del jugador, que
‫es un puntero a un controlador del jugador, por lo que estoy empezando a pensar que ref es un nombre muy
‫desagradable para esta variable. .
‫Como no es una referencia, es un puntero.
‫Casi preferiría llamarlo controlador de jugador de tanque.
‫Entonces, de hecho, ¿por qué no seguimos adelante y renombramos esto?
‫Esto es algo que los desarrolladores suelen hacer cuando se dan cuenta de que le han dado una mala reputación a una variable.
‫Entonces este código tiene una manera de hacer esto fácilmente.
‫Puedo resaltar esta variable y presionar la tecla F dos y me pide que le cambie el nombre.
‫Voy a llamar a este controlador de jugador de tanque.
‫Ahora mira esto.
‫Aquí se llama Tank Player Controller.
‫Si voy a Tank CP, veré que también se le cambia el nombre aquí.
‫Así que no tuve que entrar y buscarlo y encontrar cada instancia de jugador, controlador, ref.
‫Puedo buscar el controlador de jugador de tanque y ver que ha cambiado en todos los lugares donde se usa aquí.
‫Así que esa es una buena habilidad de refactorización para tener.
‫De todos modos, aquí en el modo de juego Tune Tanks, necesito deshabilitar la entrada para el tanque y esto requiere
‫un controlador de jugador.
‫Entonces, primero voy a verificar para asegurarme de que el controlador del jugador del tanque sea válido diciendo si el tanque y
‫yo necesitamos acceder a ese controlador del jugador.
‫Pero recuerde que en el tanque, nuestra variable de controlador de jugador es privada.
‫Ahora podríamos exponer esto y hacerlo público, o podríamos hacer una función captadora pública para esta variable.
‫Prefiero hacer un captador público ya que es una mejor práctica de programación.
‫Así que aquí en la sección pública, voy a crear un captador público para el controlador del jugador tanque.
‫Ahora devolverá un puntero de controlador de jugador A y esta función se llamará
‫get tank player.
‫Los captadores de controlador suelen ser el nombre de la variable con get al frente, y también suelen tener un
‫costo ya que esta función no está diseñada para cambiar nada en esta clase, solo devolverá el controlador
‫del jugador.
‫Así que vamos a decir devolver el controlador del jugador del tanque y eso es todo lo que va a hacer.
‫Entonces, ahora que tenemos una función de obtención pública para el controlador del jugador del tanque, podemos acceder al
‫controlador del jugador aquí desde el modo de juego.
‫Así que vamos a decir si tank obtiene un controlador de jugador tank y llama a esa función aquí.
‫Y si llegamos al interior de esta declaración if, entonces el controlador del jugador es válido, por lo que
‫podemos mover esta llamada a la entrada de desactivación del tanque justo aquí y vamos a pasar a la entrada deshabilitada el controlador del jugador
‫del tanque.
‫Así que aquí también llamaremos tank get player controller.
‫Ahora, mientras accedemos al controlador del reproductor, también me gustaría que los controladores del reproductor
‫muestren la variable miembro booleana del cursor del mouse y establezcan esto en falso.
‫Así que estamos deshabilitando la entrada y también nos estamos asegurando de que no se muestre el cursor del mouse.
‫Entonces eso se encarga de manejar la funcionalidad para cuando el tanque muere.
‫Ahora, en el caso de que el actor muerto no sea el tanque, me gusta verificar si es una instancia
‫de la clase torre.
‫Así que voy a agregar un else si aquí.
‫Entonces, ¿cuál va a ser el condicional para este elseif aquí?
‫Bueno, me gustaría ver si el actor muerto puede ser enviado a una torre A, lo que significa que tendré que incluir
‫la clase de torre.
‫Así que incluye la torre.
‫Y luego voy a intentar lanzar.
‫Así que voy a decir cast, que toma corchetes angulares y paréntesis.
‫Y lo que estamos lanzando también es una torre y lo que estamos lanzando está muerto.
‫El actor intentará elegir al actor muerto.
‫Ahora podemos tomar el resultado de este lanzamiento y asignarlo y crear una variable local.
‫Aquí en el condicional podemos decir un puntero de torre y podemos llamar a esta torre destruida y asignarle el valor
‫devuelto por este lanzamiento.
‫Y si hacemos eso, entonces tendremos acceso a este actor destruido, que es nuestro actor muerto arrojado a una
‫torre.
‫Ahora, si esto tiene éxito, llegaremos al interior del elseif.
‫Y entonces podemos tomar nuestro destruido.
‫Tower y podemos simplemente llamar a manejar la destrucción.
‫Así que ahora tenemos una función de actor muerto aquí en el modo de juego que llama a manejar la destrucción y
‫también maneja algunas funciones más relacionadas con la muerte para el tanque.
‫Así que eso se ocupa del paso dos.
‫Crear una función de muerte del actor y, mientras estábamos en eso, también llamamos a manejar la destrucción en la función
‫de muerte del actor.
‫Así que nuestro último paso es llamar al actor muerto cuando la salud llegue a cero.
‫Ahora, para llamar a esta función que existe en el modo de juego, nuestro componente de salud necesitará una variable
‫que almacene la dirección del modo de juego.
‫Así que vayamos a nuestra clase de componentes de salud.
‫Aquí están los componentes de salud, y voy a agregar una variable privada aquí justo al final.
‫Y este será del tipo A puntero de modo de juego de tanques de sintonización y lo llamaremos modo de juego de tanques de sintonización.
‫Ahora voy a declarar esto hacia adelante para no tener que incluir su archivo de encabezado aquí y luego necesitamos
‫acceder al modo de juego.
‫Así que vayamos al componente de salud CP y si me desplazo hacia arriba, veo la función de comenzar a jugar aquí y ese es
‫el lugar perfecto para obtener el modo de juego.
‫Nuevamente, ponerlo en el constructor es demasiado temprano.
‫Necesitamos asegurarnos de que el modo de juego se haya construido y exista antes de intentar acceder a él.
‫Ahora, aquí hay una función útil en las estadísticas del juego llamada Obtener modo de juego y dice que devuelve la base del
‫modo de juego actual o nulo si no se puede recuperar, como en el cliente.
‫Ahora, el cliente tiene que ver con la programación multijugador y no tenemos que preocuparnos por eso.
‫Estamos ejecutando en la única máquina para nuestro juego, así que desplacémonos hacia abajo y veremos que una base de
‫modo de juego toma un objeto de contexto mundial.
‫Este es solo un objeto en el mundo y hemos visto cómo manejar objetos de contexto mundial.
‫Entonces esto existe en el juego static h, así que incluyámoslo.
‫Y aquí en los componentes de salud, CP pegará nuestra inclusión para las estadísticas del juego y luego llamaremos al modo
‫de juego aquí y comenzaremos a jugar.
‫Así que vamos a decir sintonizar tanques, modo de juego.
‫Y establece eso a tu valor.
‫Las estadísticas de juego obtienen el modo de juego y el objeto de contexto mundial.
‫Voy a pasar en esto y ahora tenemos el modo de juego.
‫Pero, por supuesto, obtenga el modo de juego, devuelve una base de modo de juego y estamos intentando almacenarlo en la
‫clase secundaria, un modo de juego de tanques de sintonización, lo que significa que vamos a necesitar lanzar.
‫Así es.
‫Así que tenemos que decir cast to a tune tanks game mode y estamos lanzando el resultado del modo get game.
‫Así que voy a poner eso entre paréntesis allí.
‫Y estamos usando el modo de juego tune tanks.
‫Así que voy a incluir ese archivo de encabezado en la parte superior.
‫Así que voy a decir incluir.
‫Modo de juego Tune Tanks.
‫Entonces tenemos el modo de juego aquí en el componente de salud.
‫Estamos listos para bajar aquí para ver el daño recibido y verificar si nuestra salud llega a cero.
‫Y en ese caso, podemos usar nuestro puntero de modo de juego tune tanks para llamar a la función actor murió pasando
‫el actor que murió y este será su desafío, por lo que en la clase de componente de salud en el daño
‫recibido, verificará para ver si el valor de la salud ha llegado a cero o ha bajado a cero.
‫Si ese es el caso, entonces el actor llamado murió usando el modo de juego.
‫Dado que tenemos un puntero al modo de juego, no olvide verificar primero si este puntero no es
‫nulo.
‫Y una vez que llames al actor muerto, tendrás que pasar a un actor.
‫Vas a pasar al actor que murió.
‫Así que pausa el video e implementa esto en la función de daño recibido ahora.
‫Bueno.
‫Así que ya hemos sustraído el daño de la salud.
‫Ahora estamos listos para verificar si ese valor de salud ha llegado a cero.
‫Así que voy a decir si la salud es menor o igual a cero F y si ese es el caso, entonces es
‫apropiado llamar.
‫El actor murió ahora porque necesitamos verificar si el modo de juego es válido.
‫Puedo colocar un anuncio aquí en esto si verifico y verifico si el modo de juego tune tanks es válido.
‫Si es nulo, devolverá falso aquí y no llegaremos al interior de la instrucción if.
‫Entonces, si llegamos al interior de la declaración if, el modo de juego tune tanks es válido y la salud ha llegado a
‫cero.
‫Entonces podemos decir sintonizar tanques, modo de juego.
‫Y podemos llamar actor muerto.
‫Y esto requiere un actor y sabemos que el actor que murió será el actor dañado.
‫Así que vamos a pasar actor dañado.
‫Y ahora podemos compilar esto y mirar aquello.
‫Tenemos una compilación exitosa.
‫Así que volvamos al editor.
‫Y aquí en el editor, ¿por qué no seguimos adelante y probamos la muerte?
‫Veamos si puedo destruir algunos de estos tanques antes de que me destruyan a mí mismo.
‫Eso va a ser una especie de desafío.
‫Oh, hay uno.
‫Maté a uno de ellos y atrapé al segundo.
‫Ah, y morí.
‫Entonces puedes ver que este juego es mucho más divertido ahora que hemos agregado muerte y destrucción a nuestros estanques.
‫Así que esto es genial.
‫Bien, lo que quiero que hagas es darte una gran palmadita en la espalda, porque en este
‫video manejamos a Actor Death, lo que implica bastante interacción entre estas clases en nuestro juego.
‫Ahora, la forma en que se implementa la muerte es que el estanque simplemente desaparece, lo que significa que todavía necesitamos algunas
‫cosas.
‫Necesitamos condiciones de ganar-perder.
‫Necesitamos una manera de mostrarle al jugador que ganó o perdió el juego.
‫Y también necesitamos esos efectos especiales.
‫Necesitamos algunos sonidos, necesitamos algunas explosiones.
‫Esas cosas van a llegar muy, muy pronto.
‫Así que felicidades
‫Ya has recorrido un largo camino y solo quedan unos pocos pasos por recorrer.
‫Te veré en el próximo video.