‫Muy bien, en esta conferencia aprenderá acerca de los delegados y eventos de multidifusión.
‫Primero, exploremos el problema.
‫Imagina que estamos desarrollando un videojuego desde cero.
‫Nuestro código es una combinación de bibliotecas de gráficos y audio y la lógica de nuestro reproductor.
‫Así que comencemos a codificarlo.
‫Considere las siguientes clases simples.
‫Entonces, en primer lugar, tenemos esta clase de renderizado, que al comienzo del juego, queremos habilitar el motor de
‫renderizado y comenzar a dibujar las imágenes.
‫Entonces se renderizará y luego comenzará a dibujar imágenes.
‫Y también, cuando el juego termina, queremos detener nuestro motor de renderizado.
‫Así que tenemos este método de finalización del juego que luego detendrá el motor de renderizado.
‫Así que aquí solo estoy usando declaraciones de la línea derecha de la consola.
‫Esto, por supuesto, sería un código mucho más complejo y entonces realmente haría algo.
‫En nuestro caso.
‫Solo estamos tratando de comprender el concepto de delegados de multidifusión y de eventos.
‫Es por eso que lo mostraremos a través de una línea roja en la consola.
‫Así que esa es nuestra clase de renderizado.
‫Ahora veamos nuestra clase de sistema de audio.
‫Entonces, aquí en el sistema de audio, también tenemos este método de juego de dardos, que simplemente iniciará el sistema de audio y
‫reproducirá algo de audio.
‫Y luego tenemos el método Game Over, que básicamente detendrá el sistema de audio.
‫Y finalmente, tenemos un jugador y el jugador tiene un nombre de jugador y tenemos este constructor simple donde
‫simplemente establecemos ese nombre en función de lo que se pasó al objeto cuando se creó.
‫Y también tienes el juego de inicio y los métodos de finalización del juego.
‫Bien, entonces este va a generar al jugador con una idea y este solo va a eliminar
‫al jugador con esa ID particular que le asignamos como el nombre del jugador.
‫Bien, estas son nuestras tres clases y voy a ser bastante simple con estas.
‫Así que sigamos adelante y pasemos a nuestro método principal.
‫Entonces, dentro de nuestro método principal, ahora vamos a crear objetos de esos sistemas.
‫Primero del sistema de audio y luego del motor de renderizado.
‫Muy simple, solo objetos simples aquí.
‫Y luego también creamos dos jugadores con el ID.
‫Así que tenemos a este jugador, uno que es Duco, y luego al jugador dos, que será Doggle Silva.
‫Así que necesitamos iniciar nuestro motor de renderizado, nuestro sistema de audio y esponjar a los jugadores llamando al método de inicio
‫del juego desde cada una de las clases.
‫Así que hagamos eso.
‫Y lo voy a hacer de esta manera, así que solo voy a decir que el sistema de audio que es el motor de renderizado de inicio del
‫juego no hace que el juego uno y el jugador inicie el juego cada uno.
‫Y luego simplemente decimos que el juego se está ejecutando.
‫Presione cualquier tecla para finalizar el juego.
‫Entonces, lo que queremos hacer ahora es básicamente terminar el juego una vez que el jugador tiene que presionar el botón.
‫Bien, por supuesto que sería mucho más complejo.
‫Digamos que el jugador presiona los cuatro o en el menú de opciones, cierra el juego, luego se ejecutará la
‫siguiente cancha.
‫Entonces, el siguiente código sería, por supuesto, llamar al sistema de audio, ese motor de renderización de método de juego terminado, ese método
‫de juego terminado, así como los métodos de jugador un jugador a juego terminado.
‫Bien, vamos a encargarnos de eso.
‫Agreguemos eso aquí también.
‫Y, por cierto, necesitaremos una declaración de lectura porque, de lo contrario, lo apagará directamente.
‫Así que permítanme agregar rápidamente una declaración de lectura aquí para que podamos presionar manualmente una tecla para luego apagar
‫todo y básicamente el juego terminado.
‫Así que hagamos esto muy rápido y veamos qué va a pasar.
‫Entonces vemos que el sistema de audio iniciado ya se está reproduciendo, el motor de renderizado se inició.
‫Ahora vemos las imágenes y luego se generan los jugadores.
‫Así que jugador uno y jugador a nuestro lugar.
‫Ahora el juego está funcionando y podemos jugar con él.
‫Y luego, una vez que queremos terminarlo, presionamos una tecla.
‫Así que presionaré una tecla y verá que se inicia el motor de renderizado, el sistema de audio se detuvo
‫y eliminamos ambos reproductores.
‫Así que fue un gran esfuerzo configurar esto.
‫E imagino que tenemos que hacer esto con muchas más cosas.
‫Y podrían salir mal un par de cosas.
‫Derecha.
‫Entonces, digamos que agregamos más sistemas, entonces esto se vuelve mucho más complejo, por lo que podemos olvidarnos fácilmente de llamar al método
‫de inicio del juego o al final del juego.
‫O peor aún, podríamos llamar a uno de estos métodos dos veces, lo que podría causar todo tipo de
‫problemas y requerir que coloquemos mucho código de protección.
‫Entonces, ¿tendríamos que asegurarnos realmente de que este objeto esté vivo?
‫¿Ha llamado a este método o ha tenido que haber llamado a la policía métodos demasiado complicados?
‫Y aquí es donde los delegados de multidifusión resultan útiles.
‫Un delegado de multidifusión es un delegado que funciona como una lista.
‫Word puede almacenar una referencia a más de un método, y eso es básicamente todo.
‫Bien, esto suena bastante complejo, pero construyémoslo y entonces probablemente tendrá más sentido.
‫Así que creemos una clase estática llamada administrador de eventos del juego.
‫Entonces.
‫Muy bien, sigamos adelante y creemos uno nuevo.
‫Clase aquí.
‫Y voy a llamar a este administrador de eventos de un juego.
‫Muy bien, este administrador de eventos del juego ahora tendrá un delegado.
‫Así que voy a crear un nuevo delegado llamado Game Event.
‫Entonces no devolverá nada, pero será un delegado estrecho y será público para que
‫podamos usarlo fuera de esta clase.
‫Bien, hemos visto cómo trabajan los delegados en general.
‫Y vamos a usar este delegado ahora para permitirnos básicamente agregarle más de un evento.
‫Así que creemos las dos variables llamadas al inicio del juego y al final del juego, y estarán fuera de tipo evento de
‫juego.
‫Entonces estarán fuera del tipo de nuestros delegados.
‫Bien, este será un delegado de evento de juego y este será un delegado de evento de juego.
‫Entonces tenemos estas dos variables delegadas que ahora podemos usar.
‫Así que volvamos a nuestras tres clases.
‫Vamos desde el inicio del juego y los métodos de game over hasta el inicio del juego y los delegados de game over.
‫Además, no es necesario que estos métodos sean públicos.
‫Así que vayamos al sistema de audio y ahora hagamos que esos dos métodos sean
‫privados porque no necesitamos exponerlos ya que vamos a usar el constructor del sistema de audio para agregar o suscribir a los
‫eventos.
‫Entonces, aquí, el mejor lugar para agregar nuestros métodos al juego, los delegados MENAGED, es desde el propio
‫constructor.
‫Bien, eso es lo que estamos haciendo aquí.
‫Y cuando se crea un objeto, su método se agregará automáticamente a los delegados o, en otras
‫palabras, se suscribirán a ellos.
‫Entonces, lo que va a suceder ahora es que nuestro juego de inicio y nuestro método de fin de juego se
‫agregarán al administrador de eventos del juego en el delegado de inicio de juego.
‫Y estamos usando el signo más igual aquí para decir, OK, queremos agregar este método a ese delegado de multidifusión.
‫Básicamente, nos estamos suscribiendo a él y estamos esperando que se active ese evento porque una vez
‫que se active ese evento, se llamará a nuestro método, de acuerdo.
‫Así que lo bueno es que ahora podemos hacer lo mismo con la clase de motor de renderizado y la clase de jugador.
‫Entonces, lo que es importante aquí es que estoy usando el signo más igual y no solo el signo igual, por lo que
‫no lo estoy asignando.
‫Y veremos más adelante qué significaría un fichaje y qué hará por nosotros.
‫Pero aquí solo estamos agregando otro.
‫Método para nuestro recolector de eventos, por así decirlo, nuestro administrador de eventos.
‫Bien, entonces está recopilando todos esos eventos o métodos que luego debería ejecutar.
‫Entonces es un delegado de múltiples elencos.
‫Ahora, hagamos lo mismo con nuestro motor de renderizado.
‫Me gustaría que lo hicieras tú mismo.
‫Así que pase el video muy rápido e intente asignar el mismo código o cree el mismo código que hemos hecho en
‫el sistema de audio aquí.
‫Bien, primero que nada, me aseguré de que mis métodos fueran privados porque
‫ya no necesitamos exponerlos ya que no es necesario, nunca los llamaremos fuera de esta clase.
‫Es por eso que siempre es una buena práctica hacerlos privados.
‫Lo que podemos llamar, sin embargo, es el derecho de constructor, por lo que podemos crear un objeto de nuestro motor de
‫renderizado ya que es público.
‫Así que ahora podemos continuar y agregar nuestro método START al inicio continuo de nuestro administrador de eventos de juego también.
‫Y lo mismo ocurre con el final del juego.
‫Entonces aquí también estamos usando más igual.
‫Así que estamos diciendo que nos estamos suscribiendo a los eventos de inicio del juego y finalización del juego.
‫Básicamente, estamos diciendo que una vez que se active el evento de inicio del juego, también llame a nuestro método de inicio del juego, por
‫favor.
‫Por nuestro me refiero a que los motores de renderización inician el método del juego.
‫Entonces llamará a este método.
‫Y, por supuesto, si el juego termina, entonces el método de juego terminado se llamará este aquí.
‫Así es como estamos usando el enfoque ahora.
‫Pequeño desafío para ti.
‫Haz lo mismo en la clase de jugador, por favor.
‫Bien, antes que nada, espero que apruebes y, bueno, no me voy a asegurar también de que estos dos métodos sean privados
‫porque se supone que nadie debe llamar al método de inicio y finalización del juego desde
‫fuera. .
‫Pero entonces ya tenemos un constructor aquí, y solo voy a usar este constructor para suscribir el
‫juego on, comenzando con los métodos game over a los eventos de inicio del juego on y los eventos on game
‫over.
‫Bien, ahora en nuestro administrador de eventos del juego, agreguemos métodos estáticos públicos para activar los eventos desde el método
‫principal.
‫Entonces aquí podemos.
‫Llame a, bueno, básicamente ejecute este evento, porque ahora en este punto, bueno, después de que se creen todos estos
‫motores de renderizado, sistemas de audio y reproductores, una vez que este evento se va a
‫activar, ejecutará algo.
‫Pero no hemos dicho realmente qué debería suceder si eso sucede.
‫Entonces, si ese evento se va a activar, creemos un método estático para que se active al inicio del juego.
‫Entonces, este método aquí, bueno, en primer lugar, verifique si el evento de inicio del juego no está vacío, lo
‫que significa que otros métodos ya se suscriben, lo que básicamente será el caso una vez que creamos el motor de
‫renderizado.
‫Y este código aquí se ejecuta, por ejemplo, o se crea el sistema de audio y se ejecuta este código o se
‫crea el reproductor y se ejecuta este código.
‫Bien, entonces esta afirmación será cierta.
‫Por lo tanto, el evento de juego del evento START en curso no estará vacío, lo que significa que no será nulo, y luego se
‫ejecutará este código aquí.
‫Entonces, lo que va a hacer ahora es decir que el juego ha comenzado y luego llamará al inicio del juego
‫que activará todos los métodos suscritos a este evento.
‫Entonces, lo que significa que una vez que llamamos a este método aquí, este evento de juego, por así
‫decirlo, una vez que lo llamamos, este método se ejecuta aquí.
‫Este método se ejecuta tan bien como se ejecutará este método, y también lo veremos en un
‫momento.
‫De acuerdo, ese es el comienzo del juego de gatillo.
‫Así que así es como lo vamos a activar.
‫Y con solo llamar a este método y verá que lo estamos haciendo estático, como hicimos con los eventos del
‫juego en sí, porque no necesitamos crear un administrador de eventos del juego para llamar a estos métodos.
‫Entonces eso es lo que queremos lograr.
‫Por eso estamos haciendo esto estático.
‫Por lo tanto, no es necesario crear un objeto para llamar a estos métodos.
‫Y luego creemos otro método estático para su propio juego terminado.
‫Y te recomendaría que publiques un video e intentes construirte ahora muy rápido.
‫Bien, espero que hayas publicado que es básicamente lo mismo que hemos hecho aquí, pero ahora lo hará con el
‫juego de la ONU aquí.
‫Así que tengo este método de juego de activación nulo y estático público que activará el evento y si unjam over no
‫es nulo.
‫Entonces, si hay métodos que se suscriben al evento, entonces esto no será falso y luego será básicamente verdadero, lo que
‫significa que este código se ejecutará y se ejecutará el final
‫del juego, que luego llamará a todos los métodos del juego final. o todos los métodos que asignaron o se suscribieron
‫a este evento de juego, lo que significa este método aquí, así como este método.
‫Y finalmente, por supuesto, este método.
‫Entonces, si vamos a crear un nuevo motor, ahora tenemos el motor de renderizado y el motor de audio.
‫Digamos que creamos el tercer motor, luego ya no necesitamos llamar a estas cosas manualmente.
‫Pero lo hemos enviado allí.
‫Lo podemos configurar directamente en el motor donde decimos que queremos suscribirnos a ese evento y el método se
‫llamará automáticamente una vez que activemos ese evento.
‫Está bien.
‫Así que ahora echemos un vistazo a nuestro código en el método principal, porque están sucediendo muchas cosas aquí.
‫Entonces, ahora ves que todo este código ya no funciona, por supuesto, porque todos estos métodos de inicio
‫del juego, eran públicos antes, pero ahora ya no lo son.
‫Así que ahora lo son.
‫Van a ser lo que son privados, por lo que están cerrados.
‫Así que ahora sigamos adelante y asegurémonos de que realmente activamos este evento de juego.
‫Así que aquí tenemos el administrador de eventos del juego y comenzamos este juego desencadenante porque eso es lo que queremos hacer
‫en este momento.
‫Derecha.
‫Entonces, una vez que todos los jugadores y todos sus sistemas y todo esté preparado, podemos seguir adelante y ejecutarlo.
‫Y ahora podemos hacer lo mismo con el método Game Over aquí.
‫Así que activemos el evento Game Over aquí.
‫Entonces, lo que sucederá ahora es que nos permitirá asegurarnos de que básicamente tenemos un código mucho más simple y
‫limpio.
‫Por lo tanto, solo se asegura de que nuestro código funcione sin problemas.
‫Así que ahora digamos que le agregamos otro jugador.
‫No tenemos que pensar en ello y llamar a todos estos métodos correctamente, llamado método de inicio de juego, llamado
‫método de fin de juego, etc.
‫Podemos simplemente salir y crear este nuevo reproductor y automáticamente llamará a los métodos en consecuencia.
‫Como puede ver aquí, el juego ha iniciado el sistema de audio y ha comenzado a
‫reproducir audio, renderizar el motor, dibujar imágenes y luego generar al jugador Steve Call Douglas Silver y Dragon Doc.
‫Entonces ahora presionemos el botón.
‫Y podías ver que el juego terminó, el sistema de audio se detuvo, el motor de renderizado se detuvo y
‫eliminamos a todos los jugadores.
‫Así que ese es realmente el poder de los delegados de multidifusión.
‫Súper, súper útil, muy poderoso.
‫Puedo ver que nuestro tercer jugador objeto consiguió la partida inicial y la partida finalizada.
‫El método se llama automáticamente porque nuestros objetos fueron notificados cuando se activaron los eventos de inicio y
‫finalización del juego.
‫Ahora, cuando se utilizan delegados, algunas cosas pueden salir mal.
‫Primero veamos algunos de los errores que pueden costarnos horas corregirlos, digamos por error.
‫En lugar de suscribirse a un método para nuestro evento utilizando el signo más igual.
‫Pasemos, por ejemplo, a la clase del jugador.
‫En lugar de usar el signo más igual, por accidente habríamos usado el signo igual.
‫Por tanto, el compilador no dice que esto esté mal porque no esté mal.
‫También puede anular el evento existente con un solo método.
‫Entonces, lo que estamos haciendo aquí es que decimos que cualquier otra cosa que esté suscrita en este momento,
‫la anularemos.
‫Y eso es lo que básicamente pasa aquí.
‫Por lo tanto, eliminaremos todos los métodos a los que se hace referencia en el inicio del juego y en los eventos de finalización del juego
‫y configuraremos al jugador en el último objeto de jugador, para ser precisos, que se creó como la única suscripción a todos
‫estos eventos.
‫Además, dado que los primeros pasos en el final del juego son en realidad públicos, podemos llamarlos directamente desde cualquier lugar.
‫Entonces, digamos que queremos llamar al administrador de eventos del juego al inicio del juego desde aquí, entonces también podemos hacerlo.
‫Así que ahora ejecutemos el código.
‫Y puedes ver.
‫Reproductor de desove con imagen idéntica y Silver Dragon Dong, el juego ha comenzado a generar juego con
‫nuestro Dragon Dog en un Dragon Dong.
‫Así que sí, primero nuestro programa desencadenó el evento.
‫Si.
‫Y luego de nuestro último jugador, que fue nuestro Dragon Dog.
‫También llamó al inicio en curso una vez más.
‫Bien, eso es básicamente lo que pasó aquí.
‫Así que realmente debemos tener cuidado aquí.
‫Eso es algo que puede ser muy difícil de arreglar.
‫Así que ahora podemos marcar nuestros eventos como privados porque necesitamos que sean públicos para suscribirlos en nuestros
‫constructores de clases.
‫Así que ahora hemos estado usando el nombre de evento cuando hablamos de delegados porque nuestros delegados se estaban comportando
‫literalmente como eventos.
‫Pero, de hecho, existe un tipo especial de delegados llamados eventos y que se hace para prevenir este tipo de
‫errores.
‫Está bien.
‫Entonces ahora hay un hermoso teclado que nos ayuda a prevenir este error.
‫Y esa es la palabra clave de evento porque básicamente este delegado que creamos en nuestro administrador de eventos
‫de juego aquí, este evento público de juego estático es un evento.
‫Así que podríamos haber usado esta palabra clave de evento aquí.
‫Y esto evitaría que incluso cometamos este error, porque ahora ves que no está contento con
‫lo que hemos hecho aquí para que podamos anular a un delegado.
‫Pero cuando se trata de eventos, solo podemos suscribirnos a ellos.
‫Y no podemos simplemente llamar a este evento directamente.
‫Se activará directamente desde el administrador de eventos del juego, por lo que ya no podremos llamar al evento directamente, ya que el
‫inicio del juego ahora es un evento y solo se nos permitirá llamarlo desde dentro de la clase donde
‫se creó.
‫Y además, nos obliga a tratarlo como una lista, por lo que no se permite tener un evento en el lado izquierdo
‫del signo igual.
‫Entonces, algo como esto, como hemos visto, no está permitido.
‫Está bien.
‫Y ahora, si volvemos a ejecutar la aplicación, verás que funciona a la perfección.
‫Déjame ejecutar el código.
‫Y funcionó perfectamente bien.
‫Este fue un ejemplo bastante condensado y bastante simple porque analizamos los delegados, los multicanal, los delegados y los eventos en
‫un solo video.
‫Pero espero que este video haya dejado en claro las ventajas que tiene cuando se trata de trabajar con delegados y
‫eventos.
‫Y lo bueno es que ahora ha visto cómo crear sus propios delegados, así como sus
‫propios eventos, porque veremos muchos más eventos más adelante cuando se trata de usar la interfaz de usuario.
‫Por ejemplo, cuando haces clic en algo, se activa un evento y se pueden suscribir
‫varias cosas.
‫Varias madres pueden suscribirse a ese evento que se activó y luego ejecutarse una vez, por ejemplo, se hace
‫clic en el botón o se hace clic en cualquier tecla del teclado.
‫Está bien.
‫Así que ahora resumamos muy rápido.
‫Un evento es una forma restringida de un delegado obligado a comportarse como una lista, por lo que solo podemos agregar o
‫eliminar métodos de él para que podamos suscribirnos o cancelar la suscripción usando el signo más igual o menos igual, pero no el
‫signo igual de un delegado. permite una asignación directa a través de mi delegado es igual a mi método.
‫Hacerlo reemplaza cualquier otro método que se le haya agregado antes.
‫Así que ten cuidado aquí.
‫Además, los eventos solo pueden ser invocados por la clase que los define desde fuera de su clase.
‫Solo puede registrar y anular el registro de métodos para ellos.
‫Bien, espero que hayan disfrutado este video y esto les haya dado una buena idea de los eventos y delegados y espero
‫verlos en el próximo video.