‫Oké, dus in deze lezing leer je over multicast-afgevaardigden en evenementen.
‫Laten we dus eerst het probleem onderzoeken.
‫Stel je voor dat we vanaf het begin een videogame ontwikkelen.
‫Onze code is een combinatie van grafische en audiobibliotheken en de logica voor onze speler.
‫Dus laten we beginnen met coderen.
‫Beschouw de volgende eenvoudige lessen.
‫Dus allereerst hebben we deze rendering-klasse, die we aan het begin van het spel willen inschakelen voor de rendering-engine en
‫beginnen met het tekenen van de visuals.
‫Dus het gaat renderen en dan begint het visuals te tekenen.
‫En ook, als het spel voorbij is, willen we onze rendering-engine stoppen.
‫Dus we hebben deze game-over-methode die dan de rendering-engine stopt.
‫Dus hier gebruik ik alleen console-instructies voor de rechterregel.
‫Dit zou natuurlijk een veel complexere code zijn en dit zou dan ook echt iets doen.
‫In ons geval.
‫We proberen alleen het concept van multicast-afgevaardigden en evenementen te begrijpen.
‫Daarom gaan we het gewoon weergeven via een rode lijnverklaring op de console.
‫Dus dat is onze rendering-klasse.
‫Laten we nu eens kijken naar onze audiosysteemklasse.
‫Dus hier in het audiosysteem hebben we ook deze dartspelmethode, die gewoon het audiosysteem start en
‫wat audio afspeelt.
‫En dan hebben we de game over-methode, die het audiosysteem in feite zal stoppen.
‫En tot slot hebben we een speler en de speler heeft een spelersnaam en we hebben deze eenvoudige constructor waar we
‫die naam gewoon instellen op basis van wat aan het object is doorgegeven toen het werd gemaakt.
‫En je hebt ook het startspel en de game over-methoden.
‫OK, dus deze zal de speler met een idee voortbrengen en deze gaat gewoon de
‫speler verwijderen met die specifieke ID die we hebben toegewezen als de spelersnaam.
‫Oké, dit zijn dus onze drie lessen en ik ga het hier vrij eenvoudig mee houden.
‫Dus laten we doorgaan en naar onze hoofdmethode gaan.
‫Dus binnen onze hoofdmethode gaan we nu objecten van die systemen maken.
‫Dus eerst van het audiosysteem en dan van de rendering engine.
‫Dus heel eenvoudig, gewoon simpele objecten hier.
‫En dan maken we ook nog twee spelers met de ID.
‫Dus we hebben deze speler, een die Duco is, en dan speler twee, die doggy Silva wordt.
‫We moeten dus onze rendering-engine, ons audiosysteem starten en de spelers sponzen door de startspelmethode van elk
‫van de klassen aan te roepen.
‫Dus laten we dat gewoon doen.
‫En ik ga het op deze manier doen, dus ik ga gewoon zeggen dat het audiosysteem dat de engine voor het renderen van games
‫is, niet één gameplay en speler start om het spel te starten.
‫En dan zeggen we gewoon dat het spel loopt.
‫Druk op een willekeurige toets om het spel te beëindigen.
‫Dus wat we nu willen doen, is dat we het spel eigenlijk willen beëindigen zodra de speler op de knop moet drukken.
‫OK, dus het zou natuurlijk een stuk ingewikkelder zijn.
‫Laten we zeggen dat de speler op alle vier drukt of in het optiemenu, hij sluit het spel, dan zou het volgende
‫veld beginnen.
‫Dus de volgende code zou natuurlijk zijn om het audiosysteem aan te roepen, die game-over-methode-weergave-engine,
‫die game-over-methode, evenals speler één speler om te game-over-methoden.
‫Oké, laten we daar dan voor zorgen.
‫Laten we dat hier ook toevoegen.
‫En trouwens, we hebben een leesverklaring nodig omdat het anders het direct zal afsluiten.
‫Dus laat me hier snel een leesverklaring toevoegen, zodat we handmatig op een toets kunnen drukken om vervolgens alles af
‫te sluiten en in feite game-over.
‫Dus laten we dit heel snel uitvoeren en kijken wat er gaat gebeuren.
‫Dus we zien dat het audiosysteem al aan het spelen is, de rendering-engine is gestart.
‫We zien nu de visuals en dan worden de spelers voortgebracht.
‫Dus speler één en speler naar onze plek.
‫Nu draait het spel en kunnen we ermee spelen.
‫En als we het dan af willen hebben, drukken we op een toets.
‫Dus ik ga op een toets drukken en je ziet de rendering-engine starten, het audiosysteem stopt en
‫we verwijderen beide spelers.
‫Het was dus een hele klus om dit op te zetten.
‫En ik kan me voorstellen dat we dit met veel meer dingen moeten doen.
‫En er kunnen een paar dingen mis gaan.
‫Rechts.
‫Dus laten we zeggen dat we meer systemen toevoegen, dan wordt dit een stuk complexer zodat we gemakkelijk kunnen vergeten de start
‫game of game over methode aan te roepen.
‫Of erger nog, we zouden een van deze methoden twee keer kunnen aanroepen, wat allerlei problemen kan
‫veroorzaken en ons veel beschermende code kan vereisen.
‫Dus we moeten er zeker van zijn dat dit object leeft?
‫Heeft het deze methode genoemd of heeft het de politiemethodes veel te ingewikkeld moeten noemen?
‫En dit is waar multicast-afgevaardigden van pas komen.
‫Een multicast-gemachtigde is een gemachtigde die werkt als een lijst.
‫Word kan een verwijzing naar meer dan één methode opslaan, en dat is het eigenlijk.
‫Oké, dit klinkt nogal ingewikkeld, maar laten we het bouwen en dan zal het waarschijnlijk logischer zijn.
‫Laten we dus een statische klasse maken met de naam game event manager.
‫Dus.
‫Oké, dus laten we doorgaan en een nieuwe maken.
‫Klasse hier.
‫En ik ga dit ene game event manager noemen.
‫Oké, dus deze game-evenementmanager heeft nu een afgevaardigde.
‫Dus ik ga een nieuwe afgevaardigde maken met de naam Game Event.
‫Dus het zal niets teruggeven, maar het zal een strakke delegatie zijn en het zal openbaar zijn, zodat
‫we het buiten deze klasse kunnen gebruiken.
‫OK, dus we hebben gezien hoe afgevaardigden in het algemeen werken.
‫En we gaan deze afgevaardigde nu gebruiken om ons in staat te stellen er in feite meer dan één evenement aan toe te voegen.
‫Laten we dus de twee variabelen maken die aan het begin van het spel en aan het einde van het spel worden genoemd, en ze zullen van het type spelgebeurtenis
‫zijn.
‫Ze zullen dus van het type zijn van onze afgevaardigden.
‫OK, dus dit zal een afgevaardigde van een game-evenement zijn en dit zal een afgevaardigde van een game-evenement zijn.
‫We hebben dus deze twee gedelegeerde variabelen die we nu kunnen gebruiken.
‫Dus terug naar onze drie lessen.
‫Laten we bij het startspel en de game-over-methoden naar de on-game start en on-game over afgevaardigden.
‫Het is ook niet nodig dat deze methoden openbaar zijn.
‫Dus laten we naar het audiosysteem gaan en laten we die twee methoden nu privé maken, omdat
‫we ze niet hoeven bloot te leggen omdat we de constructor van het audiosysteem gaan gebruiken om gebeurtenissen toe te voegen of erop te
‫abonneren.
‫Dus hier is de beste plaats om onze methoden aan het spel toe te voegen, MENAGED afgevaardigden, vanuit de constructor
‫zelf.
‫Oké, dat is wat we hier doen.
‫En wanneer een object wordt gemaakt, wordt de methode automatisch toegevoegd aan de afgevaardigden, of met andere
‫woorden, ze zullen zich erop abonneren.
‫Dus wat er nu gaat gebeuren, is dat onze startgame en onze game
‫over-methode worden toegevoegd aan de game-eventmanager op Game Start-afgevaardigde.
‫En we gebruiken hier het plus-gelijkteken om te zeggen: OK, we willen deze methode toevoegen aan die multicast-afgevaardigde.
‫Dus eigenlijk abonneren we ons erop en we wachten tot die gebeurtenis wordt geactiveerd, want
‫zodra die gebeurtenis wordt geactiveerd, wordt onze methode aangeroepen, OK.
‫Het leuke is dat we nu hetzelfde kunnen doen met de klasse rendering engine en de player class.
‫Dus wat hier belangrijk is, is dat ik het plus-gelijkteken gebruik en niet alleen het gelijkteken, dus ik wijs
‫het niet toe.
‫En we gaan later zien wat een ondertekening zou betekenen en wat het voor ons zal doen.
‫Maar hier voegen we er gewoon nog een toe.
‫Methode naar onze eventcollector, om zo te zeggen, onze eventmanager.
‫OK, dus het verzamelt al die gebeurtenissen of methoden die het dan zou moeten uitvoeren.
‫Het is dus een afgevaardigde met meerdere casts.
‫Laten we nu hetzelfde doen met onze rendering-engine.
‫Ik zou graag willen dat je het zelf doet.
‫Geef de video dus snel door en probeer dezelfde code toe te wijzen of dezelfde code op te bouwen als we hier
‫in het audiosysteem hebben gedaan.
‫OK, dus allereerst heb ik ervoor gezorgd dat mijn methoden privé zijn omdat we ze
‫niet meer hoeven bloot te leggen omdat dat niet nodig is, we zullen ze nooit buiten deze klasse aanroepen.
‫Daarom is het altijd een goede gewoonte om ze privé te maken.
‫Wat we echter kunnen noemen, is het constructorrecht, dus we kunnen een object van onze rendering-engine maken
‫omdat het openbaar is.
‫Dus nu kunnen we doorgaan en onze START-methode ook toevoegen aan de doorlopende start van onze game-evenementmanager.
‫En hetzelfde geldt voor het spel voorbij.
‫Dus hier gebruiken we ook plus gelijken.
‫Dus we zeggen dat we ons abonneren op de on-game start en on game over-evenementen.
‫Dus we zeggen in feite dat zodra het startgebeurtenis van het spel wordt geactiveerd, we ook onze methode voor het starten van het spel moeten
‫noemen.
‫Met onze bedoel ik de methode voor het starten van de rendering-engines.
‫Dus het zal dan deze methode aanroepen.
‫En natuurlijk, als het spel voorbij is, wordt de methode van het spel hier deze genoemd.
‫Dus zo gebruiken we de aanpak nu.
‫Kleine uitdaging voor jou.
‫Doe hetzelfde in de spelersklasse, alstublieft.
‫OK, dus ten eerste hoop ik dat je slaagt en, nou ja, ik ga er ook niet voor zorgen dat deze
‫twee methoden privé blijven, omdat niemand de startgame en de game over-methode van buitenaf mag
‫noemen .
‫Maar dan hebben we hier al een constructor, en ik ga deze constructor
‫gewoon gebruiken om de on-game te abonneren, beginnend met game-over-methoden tot de on-game-startgebeurtenissen en de on-game
‫over-gebeurtenissen.
‫OK, dus laten we nu in onze game-eventmanager toevoegen aan openbare statische methoden om de gebeurtenissen vanuit de hoofdmethode te
‫activeren.
‫Dus hier kunnen we dan.
‫Oproep van, nou ja, eigenlijk voer je dit evenement uit, want nu, op dit punt, nadat al
‫deze rendering-engines, audiosystemen en spelers zijn gemaakt, zal het iets uitvoeren zodra dit evenement
‫wordt geactiveerd.
‫Maar we hebben niet echt gezegd wat er moet gebeuren als dat gebeurt.
‫Dus als die gebeurtenis wordt geactiveerd, laten we dan een statische methode maken om te activeren bij het starten van het spel.
‫Dus deze methode hier, nou, allereerst, controleer of de in-game startgebeurtenis niet leeg is, wat betekent dat
‫andere methoden zich er al op abonneren, wat in principe het geval zal zijn zodra we de rendering-engine hebben
‫gemaakt.
‫En deze code wordt hier uitgevoerd, bijvoorbeeld, of het audiosysteem wordt gemaakt en deze code wordt uitgevoerd of de speler
‫wordt gemaakt en deze code wordt uitgevoerd.
‫OK, dan zal deze verklaring hier waar zijn.
‫Dus het lopende START-gebeurtenis-spelgebeurtenis zal niet leeg zijn, wat betekent dat het niet null is, en dan zal deze code
‫hier worden uitgevoerd.
‫Dus wat het nu gaat doen, is dat het gaat zeggen dat het spel is begonnen en dan zal het het spel starten
‫roepen dat alle methoden activeert die op dit evenement zijn geabonneerd.
‫Dus wat betekent dat zodra we deze methode hier noemen, dus dit spelgebeurtenis, om zo te
‫zeggen, zodra we het deze methode noemen, hier wordt uitgevoerd.
‫Deze methode wordt uitgevoerd en deze methode zal ook worden uitgevoerd, en dat zullen we straks ook
‫zien.
‫OK, dus dat is de start van het triggerspel.
‫Dus dit is hoe we het gaan activeren.
‫En door deze methode gewoon aan te roepen, zie je dat we het statisch maken, zoals we deden
‫met de game-evenementen zelf, omdat we geen game-evenementmanager hoeven te maken om deze methoden aan te roepen.
‫Dat is dus wat we willen bereiken.
‫Daarom maken we dit statisch.
‫U hoeft dus geen object te maken om deze methoden aan te roepen.
‫En laten we dan een andere statische methode maken voor hun eigen game-over.
‫En ik zou aanraden dat je een video plaatst en jezelf nu heel snel probeert te bouwen.
‫OK, dus ik hoop dat je gepost hebt dat het in wezen hetzelfde is als we hier hebben gedaan, maar nu gaat het
‫het doen met het VN-spel hier.
‫Dus ik heb deze openbare statische, ongeldige trigger-game over-methode die de gebeurtenis activeert en als unjam over niet
‫nul is.
‫Dus als er methoden zijn die zich abonneren op de gebeurtenis, dan zal dit niet onwaar zijn en dan zal het
‫in principe waar zijn, wat betekent dat deze code zal worden
‫uitgevoerd en bij game-over zal worden uitgevoerd, die dan alle game-over-methoden zal aanroepen of alle methoden die deze game over-gebeurtenis
‫hebben toegewezen of erop hebben geabonneerd, wat zowel deze methode hier als deze methode betekent.
‫En tot slot natuurlijk deze methode.
‫Dus als we nu een nieuwe engine willen maken, hebben we nu de rendering-engine en de audio-engine.
‫Laten we zeggen dat we de derde engine maken, dan hoeven we dit niet meer handmatig aan te roepen.
‫Maar we hebben het daarheen gestuurd.
‫Wat we kunnen instellen direct in de engine waar we zeggen dat we ons willen abonneren op die gebeurtenis en de
‫methode wordt automatisch aangeroepen zodra we die gebeurtenis activeren.
‫Oke.
‫Laten we nu eens kijken naar onze code in de hoofdmethode, want er gebeurt hier veel.
‫Dus nu zie je dat al deze code natuurlijk niet meer werkt, omdat al deze startspelmethoden
‫eerder openbaar waren, maar nu zijn ze dat niet meer.
‫Dat zijn ze nu dus.
‫Het wordt wat ze privé zijn, dus ze zijn gesloten.
‫Dus laten we nu doorgaan en ervoor zorgen dat we dit game-evenement daadwerkelijk activeren.
‫Dus hier hebben we de game-eventmanager en we hadden deze triggergame gestart, want dat is wat we op dit moment
‫willen doen.
‫Rechts.
‫Dus zodra alle spelers en al je systemen en alles zijn voorbereid, kunnen we doorgaan en het uitvoeren.
‫En nu kunnen we hetzelfde doen met de game over-methode hier beneden.
‫Dus laten we een game-over-gebeurtenis hier beneden starten.
‫Dus wat er nu zal gebeuren, is dat het ons in staat zal stellen ervoor te zorgen dat we in feite een veel eenvoudigere en schonere
‫code hebben.
‫Het zorgt er dus gewoon voor dat onze code vlekkeloos werkt.
‫Dus laten we nu zeggen dat we er nog een speler aan toevoegen.
‫We hoeven er niet over na te denken en al deze methoden goed te noemen, de zogenaamde
‫start game-methode, de game-over-methode, enzovoort.
‫We kunnen gewoon naar buiten gaan en deze nieuwe speler maken en het zal automatisch de methoden dienovereenkomstig aanroepen.
‫Dus je ziet hier, het spel is begonnen met het audiosysteem en is begonnen met het afspelen van
‫audio, het renderen van de engine, het tekenen van beelden en het voortbrengen van speler Steve Call Douglas Silver en Dragon Doc.
‫Dus laten we nu op de knop drukken.
‫En je kon zien dat het spel voorbij is, het audiosysteem stopte, de weergave-engine stopte en
‫we verwijderen alle spelers.
‫Dat is dus echt de kracht van multicast-afgevaardigden.
‫Super, super handig, heel krachtig.
‫Kan zien dat onze derde objectspeler het startspel en het spel voorbij heeft.
‫Methode wordt automatisch aangeroepen omdat onze objecten op de hoogte werden gebracht wanneer zowel de on-game start als on game
‫over-gebeurtenissen werden geactiveerd.
‫Nu, bij het gebruik van afgevaardigden, kunnen sommige dingen fout gaan.
‫Laten we eerst eens kijken naar enkele van de fouten die ons uren kunnen kosten om te herstellen, laten we zeggen per ongeluk.
‫In plaats van je te abonneren op een methode voor ons evenement met het plus gelijkteken.
‫Laten we bijvoorbeeld naar de klasse van de speler gaan.
‫In plaats van het plus-gelijkteken te gebruiken, zouden we per ongeluk het gelijkteken hebben gebruikt.
‫Dus de compiler zegt niet dat dit verkeerd is, want dit is niet verkeerd.
‫U kunt de bestaande gebeurtenis ook met slechts één methode overschrijven.
‫Dus wat we hier doen, is dat we zeggen wat er op dit moment nog meer is geabonneerd, we gaan
‫het negeren.
‫En dat is wat hier in principe zal gebeuren.
‫We zullen dus alle methoden verwijderen waarnaar wordt verwezen in het begin van het spel en bij game-over-evenementen en de speler
‫instellen op het laatste spelerobject, om precies te zijn, dat is gemaakt als de enige abonnee op al
‫deze evenementen.
‫Omdat het begin van de game over eigenlijk openbaar is, kunnen we ze direct vanaf elke locatie bellen.
‫Dus laten we zeggen dat we vanaf hier de game-eventmanager bij het starten van de game willen bellen, dan kunnen we dat ook doen.
‫Dus laten we nu de code uitvoeren.
‫En je kunt zien.
‫Spawning-speler met identieke still en Silver Dragon Dong, het spel is begonnen met spawnen met
‫onze Dragon Dog op een Dragon Dong.
‫Dus ja, eerst werd het evenement getriggerd door ons programma.
‫Ja.
‫En dan van onze laatste speler, onze Drakenhond.
‫Het noemde ook nog maar eens de lopende start.
‫OK, dus dat is eigenlijk wat hier gebeurde.
‫We moeten hier dus echt oppassen.
‫Dat is iets dat super moeilijk te repareren kan zijn.
‫Dus nu kunnen we onze evenementen als privé markeren omdat we ze openbaar moeten maken om ons erop te abonneren
‫in onze klassenbouwers.
‫Dus nu gebruiken we de naam evenement als we het over afgevaardigden hebben, omdat onze afgevaardigden zich letterlijk
‫gedroegen als evenementen.
‫Maar in feite is er een speciaal soort afgevaardigden, evenementen genaamd, en dat is gemaakt om dit soort fouten te
‫voorkomen.
‫Oke.
‫Dus nu is er een prachtig toetsenbord dat ons helpt deze fout te voorkomen.
‫En dat is het evenementsleutelwoord, want eigenlijk is deze afgevaardigde die we hier in onze
‫game-evenementmanager hebben gemaakt, dit openbare statische game-evenement een evenement.
‫Dus we hadden dit evenementsleutelwoord hier gewoon kunnen gebruiken.
‫En dit zou ons ervan weerhouden deze fout te maken, want nu zie je dat het niet blij
‫is met wat we hier hebben gedaan, zodat we een afgevaardigde kunnen negeren.
‫Maar als het om evenementen gaat, kunnen we ons daar alleen op abonneren.
‫En we kunnen dit evenement niet zomaar direct noemen.
‫Het wordt rechtstreeks geactiveerd vanuit de game-evenementmanager, dus we kunnen het evenement niet langer rechtstreeks oproepen, omdat Game Start
‫nu een evenement is en we het alleen mogen oproepen vanuit de klas waarin het
‫is gemaakt.
‫En het dwingt ons ook om het als een lijst te behandelen, dus een gebeurtenis aan de linkerkant van het gelijkteken
‫is niet toegestaan.
‫Dus zoiets als dit is, zoals we hebben gezien, niet toegestaan.
‫Oke.
‫En als we de app nu opnieuw gebruiken, zult u zien dat deze feilloos werkt.
‫Laat me rennen om te coderen.
‫En het werkte perfect.
‫Dit was dus een vrij beknopt voorbeeld en een vrij eenvoudig voorbeeld, omdat we in één video hebben gekeken naar afgevaardigden,
‫multichannels, afgevaardigden en evenementen.
‫Maar ik hoop dat deze video duidelijk heeft gemaakt welke voordelen je hebt als het gaat om het werken met afgevaardigden en
‫evenementen.
‫En het leuke is dat je nu hebt gezien hoe je je eigen afgevaardigden en je eigen evenementen
‫kunt maken, want we zullen later nog een heleboel meer evenementen zien als het gaat om het gebruik van de gebruikersinterface.
‫Wanneer u bijvoorbeeld ergens op klikt, wordt een gebeurtenis geactiveerd en kunnen meerdere dingen zich
‫abonneren.
‫Meerdere moeders kunnen zich abonneren op die gebeurtenis die is geactiveerd en vervolgens één keer worden uitgevoerd, bijvoorbeeld door
‫op de knop te klikken of op een willekeurige toets op het toetsenbord.
‫Oke.
‫Dus laten we het nu heel snel samenvatten.
‫Een evenement is een beperkte vorm van een afgevaardigde die wordt gedwongen zich als een lijst te gedragen, dus we
‫kunnen er alleen methoden aan toevoegen of verwijderen, zodat we ons erop kunnen abonneren of afmelden met het plus-gelijkteken of het
‫min-gelijkteken, maar niet het gelijkteken een afgevaardigde staat een directe toewijzing via mijn gemachtigde gelijk aan mijn methode.
‫Als u dit doet, vervangt u alle andere methoden die er eerder aan waren toegevoegd.
‫Let hier dus goed op.
‫Evenementen kunnen ook alleen worden aangeroepen door de klasse die ze definieert van buiten hun klasse.
‫U kunt alleen methoden voor hen registreren en afmelden.
‫OK, dus ik hoop dat je genoten hebt van deze video en dat dit je een goed idee heeft gegeven van evenementen en afgevaardigden en ik hoop je
‫te zien in de volgende video.