Hoe je kunstmatige intelligentie voor een vijandige slijm maakt

Opmerking: Een voltooide projectbestand voor deze tutorial kan aan het einde van dit artikel worden gevonden.
Inleiding
In deze tutorial zullen we de kunstmatige intelligentie (AI) creëren voor een overtuigende vijandelijke slijm voor een platformspel. We zullen enkele meer geavanceerde functies en gedragingen in hyperPad behandelen, dus deze tutorial gaat uit van enige basiskennis van de hyperPad-editor. Als je denkt dat je meer bekend moet raken met het maken van een spel vanaf nul, kun je eerst de Volledige Gids - Een Platformspel Maken-tutorial bekijken.
Om de slijm "intelligent" te laten lijken, moet hij meer doen dan alleen maar heen en weer bewegen en moet hij enigszins bewust zijn van zijn omgeving.
Klinkt spannend! Maar voordat we beginnen, moeten we eerst in detail beschrijven hoe de vijandige slijm zich moet gedragen:
- In plaats van te lopen, zal de slijm naar links of rechts springen om te bewegen.
- De slijm zal in de richting van de speler springen.
- Als de speler te ver weg is, zal de slijm niet bewegen (non-actief).
- De slijm zal de gezondheid van de speler wegnemen bij contact.
- De slijm wordt verslagen als de speler erop springt.
Nu we weten wat we willen doen, laten we beginnen!
Deel 1: Projectinstelling
In deze tutorial beginnen we met een nieuw project vanaf nul om het eenvoudig te houden. Maak een nieuw project aan en stel het in op "Zijaanzicht"; je kunt de andere instellingen op hun standaardwaarden laten staan.
Met je nieuwe project aangemaakt, ga naar de Assetbibliotheek en haal de "Platformer Starter Pack" van hyperPad in de assetwinkel. (Het is gratis!)
Nu we enkele assets hebben om mee te werken, ga je gang en plaats enkele grondblokken en creëer je wereld. Als je er nog niet bent, ga dan naar de Assetbibliotheek en tik op "Downloads", dan "Platformer Starter Pack".
In de onderstaande afbeelding zijn enkele grondblokken ("Grass World"-map) geplaatst en is een achtergrond ("Backgrounds"-map) gezet.
Nu we een mooi scène hebben om mee te werken, laten we de Speler- en Slijmobjecten toevoegen. Ga naar de Assetbibliotheek en open je "Downloads"-map, dan de "Platformer Starter Kit"-map als die nog niet open is.
We zullen de "Groene Ruimtewezen" als speler gebruiken, dus tik op de groene ruimtewezenasset om al zijn animatiecycli te zien. Standaard willen we dat de speler gewoon staat, dus tik op de "Staan"-animatie en plaats deze op de scène.
In dezelfde map in de Assetbibliotheek is er ook een "Slijm Roze" geanimeerd personage. Perfect voor ons om te gebruiken als vijandige slijm! Tik op de slijmassent en kies de "Beweeg"-animatie en plaats een slijm in je scène naast je speler.
Tot nu toe, zo goed! We hebben nu ons spelerobject en slijmobject, klaar voor gebruik. Maar als we ons project nu zouden spelen, zouden we helemaal niet kunnen interactie hebben met het spel. We moeten dus wat logica creëren om wat leven in ons spel te brengen.
Deel 2: Speler Controls
Voordat we aan de slag kunnen met het geven van wat leven aan onze vijandige slijm, moeten we eerst wat spelercontroles voor het groene ruimtewezen hebben.
Tik op de groene ruimtewezen en stel zijn fysica mode in van Wand naar Fysiek, zodat de speler vrij kan bewegen. Tik dan op de knop "Gedragingen" om de Gedragseditor voor onze speler te openen, zodat we enkele controles kunnen toevoegen.
In de gedragseditor voor ons spelerpersonage zou je al een eenzame Speel Animatie-gedrag moeten zien. We kunnen dat gedrag met rust laten, maar we kunnen het wat vrienden geven.
Onder het Interacties-gedeelte plaats je waar dan ook een Joystickbediende-gedrag evenals een Springen met Knop-gedrag. Met deze gedragingen is onze speler nu klaar om te besturen. Maar er ontbreken nog enkele animaties.
Tik op het Joystickbediende gedrag en stel de "Joystick Links Animatie" in op de "Loop"-animatiecyclus in de Groene Ruimtewezenasset. Doe hetzelfde met de "Joystick Rechts Animatie".
Nu loopt ons spelerpersonage, maar animeert nog steeds niet als hij springt.
Tik op het Springen met Knop gedrag en wijzig zowel de "Vallende Animatie" als "Springende Animatie" naar de "Spring"-animatiecyclus.
Als we ons spel nu spelen, kunnen we rondbewegen en springen! De volgende stap is dat we kunnen werken aan onze slijm vijand.
Deel 3: Slijmbeweging
Zoals we in de inleiding van deze tutorial hebben beschreven, willen we dat onze slijm naar de speler springt. Om dit te doen, moet onze slijm weten waar de speler in de wereld is. Daarom moeten we een Tag aan ons spelerpersonage toevoegen, zodat onze gedragingen ons spelerpersonage in elke scène kunnen ophalen.
Tik op het spelerpersonage en selecteer het tabblad Tags onderaan het eigenschappenvenster. Typ "Speler" in het tekstveld bovenaan het tags-menu en druk op de add (+) knop ernaast. Nu is ons spelerpersonage getagd met de tag "Speler".
Vergelijkbaar met wat we met het spelerpersonage deden, tik op de slijm en stel zijn fysica mode in van Wand naar Fysica. Tik dan op de Gedragingen-knop om de gedragseditor van de slijm te openen.
In de gedragseditor ga je naar het Aangepast gedrag gedeelte en plaats je een Timer-gedrag in de editor.
Tik op het Timer-gedrag en stel de interval in op 2 seconden.
Dit zal het begin zijn van onze logica voor de kunstmatige intelligentie van onze slijm.
Het idee hier is dat elke 2 seconden onze slijm zal "denken" over wat te doen, zoals: Zou de slijm moeten springen? Als het ervoor kiest om te springen, in welke richting moet het springen?
Ga nu naar het Transformeer gedrag gedeelte en plaats een Haal Positie-gedrag. Tik erop en stel de doelstelling in op de "Speler"-tag die we eerder hebben aangemaakt door op het tabblad Tags onderaan het eigenschappenvenster te klikken en "Speler" te selecteren. Verbind nu de Timer met het Haal Positie-gedrag.
Nu weten we waar onze speler zich in de wereld bevindt! Om te bepalen of de speler links of rechts van de slijm is, moeten we ook weten waar de slijm zich in de wereld bevindt.
Sleep nog een Haal Positie-gedrag in de editor. Standaard is het gedrag al gericht op onze slijm, dus we hoeven verder niets te doen dan het te verbinden met onze logic tak. Verbind het Haal Positie-gedrag voor de speler met het Haal Positie-gedrag voor de slijm.
Optioneel: Om het gemakkelijker te maken om te begrijpen, heb ik mijn Haal Positie-gedragingen hernoemd om duidelijk aan te geven wat ze volgen: "Haal Positie Speler" en "Haal Positie Slijm". Dit is optioneel, maar als je ook de gedragsnamen wilt wijzigen, kun je dat doen door op het gedrag te tikken en de naam ervan helemaal bovenaan het eigenschappenvenster aan te tikken.
Tot nu toe hebben we dat elke 2 seconden de slijm de positie van het spelerpersonage en zichzelf ophaalt. Nu we die informatie hebben, kunnen we bepalen of de slijm naar links of rechts moet springen.
Onder het Logica-tabblad, slepen en verbinden we een Als-gedrag. In de eigenschappen van de als-gedraging, stel je de eerste waarde in op de eerste Haal Positie's ("Speler"-tag) x-positie door de uitvoerwaarde van het gedrag naar het veld in de eigenschappen van de Als-gedraging te slepen. Voor de tweede waarde stel je het in op de tweede Haal Positie's (slijm) x-positie. Tot slot, stel de voorwaarde van de Als-gedraging in op "Is Minder Dan" (<).
Opmerking: De x-positie van een object is de waarde die vertegenwoordigt waar het object zich in de wereld op zijn x-as bevindt. (Links en rechts)
Dus, wat betekent dit alles? De Als-gedraging controleert of de x-positie van de speler kleiner is dan de x-positie van de slijm. Als het bovenstaande waar is, zal de uitvoer van de gedraging het volgende verbonden gedrag uitvoeren. Wat dit in feite betekent, is dat als de speler verder links ligt dan de slijm, de uitvoering van de gedraging zal doorgaan.
Oké, we hebben nu de logica ingesteld om de slijm naar links te laten springen, laten we de slijm dat nu laten doen!
Onder het Fysica-gedraging, slepen en verbinden we een Toepassen Kracht-gedrag aan de Als-gedraging. In de eigenschappen stel je de kracht in op: x = -0,5, y = 1. Stel vervolgens de vermenigvuldiger in op een aanzienlijk getal, 200 zou moeten werken.
Wat we nu hebben, is als de slijm de speler verder naar links dan zichzelf vindt, hij omhoog zal springen (y = 1 × 200) en een beetje naar links (x = -0,5 × 200).
Probeer het uit! Speel het spel en test of alles naar behoren werkt. Wat je zou moeten zien is de slijm elke 2 seconden naar links springen, zolang de speler aan de linkerkant van hem staat. Als je de speler naar de rechterkant van de slijm beweegt, zou hij moeten stoppen met springen totdat je weer naar de linkerkant beweegt.
Opmerking: Als je slijm niet beweegt, ga dan de vorige stappen na om te controleren of je niets hebt gemist. Zorg ervoor dat de gedragingen goed zijn verbonden en dat de fysica mode van je slijm is ingesteld op Fysica (verplaatsbaar) in plaats van Wand (niet-verplaatsbaar). Ook zullen we binnenkort het probleem oplossen waarbij de slijm soms op zijn zij of ondersteboven kan draaien.
Geweldige voortgang tot nu toe! Als je slijm springt zoals verwacht, dan zijn we klaar om door te gaan. Laten we zijn bewegingsgedragingen afmaken door de slijm ook naar rechts te laten springen.
Ga terug naar de gedragseditor van de slijm, dupliceer de Als-gedraging. Sleep en koppel de nieuwe Als-gedraging rechts van de originele Als-gedraging. Dit zal het veranderen in een "Anders Als"-gedrag.
Dupliceer de Toepassen Kracht-gedraging ook en verbind die met de nieuwe Anders Als-gedraging.
In de eigenschappen van de Anders Als, verander de voorwaarde van "Is Minder Dan" (<) naar "Is Groter Dan" (>). Dit zal het tegenovergestelde effect van de eerste Als hebben. Als de eerste Als-gedraging niet waar is, zal hij vervolgens controleren of de Anders Als waar is. Dit betekent dat als de speler niet links van de slijm staat, hij zal controleren of de speler rechts van de slijm staat en de gedragingen die verbonden zijn aan de Anders Als in plaats van verder zal uitvoeren.
Je zou nu een gedragstak moeten hebben die er ongeveer zo uitziet:
In de tweede Toepassen Kracht (onder de Anders Als), wijzig de eigenschappen zodat de kracht is x = 0,5, in plaats van x = -0,5. Nu, in plaats van naar links te springen, zal de slijm naar rechts springen.
Speel het project nog een keer en probeer het opnieuw! Nu zou je moeten zien dat de slijm springt in welke richting de speler staat. Geweldig!
Een ding dat je mogelijk hebt opgemerkt tijdens het spelen, is dat als je in botsing komt met de slijm, deze soms op zijn zij of ondersteboven kan vallen. We willen dat de slijm rechtop blijft staan, dus laten we dat snel oplossen.
Ga terug naar de gedragseditor van de slijm, ga naar het Transformeer gedrag gedeelte en plaats een Vergrendel Rotatie-gedrag in de editor. Het is niet nodig om het aan een ander gedrag te koppelen; we willen dat het de rotatie vergrendelt zodra de slijm is gemaakt, dus je kunt het zo laten. Zodra je dat hebt gedaan, probeer je het spel opnieuw. Deze keer zou je een lastige tijd moeten hebben om de slijm op zijn zij te duwen.
Je hebt misschien ook opgemerkt dat de animatie van de slijm te snel speelt. Als dit gebeurt, tik dan op de Speel Animatie-gedraging in de gedragseditor van de slijm en verander de Frames Per Seconde naar een veel kleiner getal. 6 frames per seconde ziet er best goed uit.
Mooi! Nu beweegt onze slijm niet alleen mooi rond, maar ziet het er ook geweldig uit. Voor het grootste deel is de bewegingslogica van onze slijm compleet.
We willen echter ook dat de slijm alleen springt als de speler in de buurt is. Op die manier zullen slijmen ver weg niet meteen proberen te springen en de speler aan te vallen als we een grotere wereld bouwen. In het volgende gedeelte zullen we kijken naar het toevoegen van een andere voorwaarde om de springlogica te blokkeren als de speler te ver weg is.
Deel 4: Slijm Stilstaan
In dit deel zullen we enkele slijmgedragingen implementeren die ervoor zorgen dat hij stil blijft (dat wil zeggen, niet beweegt) wanneer de speler te ver weg is.
Om dit te bereiken, moeten we een manier vinden om de afstand van onze slijm tot de speler te meten. Handig genoeg zijn er gedragingen beschikbaar om precies dat te doen! Laten we aan de slag gaan.
Open de gedragseditor van de slijm en laat een Bereken Afstand-gedrag vallen vanuit het Logica-gedeelte. In de eigenschappen van het gedrag is het eerste object al ingesteld op onze slijm. Voor het tweede object ga je naar het tabbladenmenu en selecteer de "Speler"-tag.
Dit gedrag, wanneer uitgevoerd, berekent de afstand in meters van onze slijm tot de speler. Met die informatie kunnen we zien of de speler te ver weg is door te controleren of het een bepaalde afstand overschrijdt.
Plaats een andere Als-gedrag vanuit het Logica gedeelte en verbind deze onder het Bereken Afstand gedrag. In de eigenschappen van de Als-gedraging stel je de eerste waarde in op de uitvoerwaarde van de Bereken Afstand. Stel de voorwaarde in op "Is Minder Dan" en de tweede waarde op 15.
Nu hebben we een manier om te controleren of de speler te ver weg is door te zien of de afstand tussen de slijm en de speler minder is dan 15 (meters). Als die voorwaarde onwaar is, is de speler te ver weg en zal de Als-gedraging de volgende gedraging niet uitvoeren.
Nu we onze nieuwe voorwaarde klaar hebben om te gebruiken, ontkoppel de Haal Positie (slijm) en oude Als-gedraging van het vorige deel van de tutorial en maak wat ruimte voor onze nieuwe voorwaarde. Je kunt gedragingen ontkoppelen door op de verbindingen tussen gedragingen te tikken en te houden.
Met de nieuwe afstandsvoorwaarde op zijn plaats, verbind je de Haal Positie (slijm) met het Bereken Afstand gedrag en verbind je de nieuwe Als-gedraging met de oude Als-gedraging. Je zou nu zoiets moeten hebben:
Het begint er nu behoorlijk ingewikkeld uit te zien, maar het idee is relatief eenvoudig. Wat we nu hebben, is dat we voordat we zelfs maar controleren in welke richting de slijm moet springen, we eerst controleren of de afstand tussen de slijm en de speler minder is dan 15 (meters).
Als de speler dichterbij is dan 15 meter, gaat hij verder en controleert hij in welke richting we moeten springen, zoals gebruikelijk. Als de speler verder dan 15 meter weg is, gaan we niet verder en eindigt de logica daar totdat de slijm de volgende keer weer "denkt" (2 seconden later).
Speel het spel uit! Als je te dichtbij bij de slijm komt, zou hij naar je moeten beginnen springen, maar als je te ver weg gaat, zou hij moeten stoppen met bewegen en wachten totdat je weer dichtbij komt.
Onze slijm begint nu behoorlijk bedreigend te lijken, maar hij mist nog steeds een manier om de speler schade toe te brengen. In het volgende deel van deze tutorial zullen we de speler een gezondheidsbalk geven en wat logica implementeren om de speler schade toe te brengen.
Deel 5: Aanvallen van de Speler
Zoals uiteengezet in de inleiding, zullen we slijmaanvallen implementeren door de slijm de speler pijn te laten doen wanneer deze de speler aanraakt. Om te beginnen met het implementeren van een manier voor de slijm om de speler aan te vallen, moeten we de speler eerst enige gezondheid geven.
In de hoofdeditor selecteer de Scene UI laag en maak een nieuw object aan met de Speciale Objecten-knop. Tik op "Gezondheidsbalk" om een gezondheidsbalk voor onze speler aan te maken.
Aangezien het op de Scene UI-laag is geplaatst, als we besluiten onze wereld uit te breiden en het scherm de speler te laten volgen, blijft het op dezelfde plek op het scherm staan.
Je kunt het overal plaatsen waar je het maar geschikt vindt op het scherm. Ik heb de mijne in het midden van het scherm net bovenaan geplaatst.
Wanneer je klaar bent om een goede plek voor je gezondheidsbalk te vinden, kunnen we aan de slag met het verwijderen van gezondheid van de gezondheidsbalk. Terug naar de hoofdlaag waar je slijm is en open opnieuw de gedragseditor.
In een mooi leeg vak in de gedragingen van de slijm laat je een Botsing-gedrag vallen dat te vinden is onder het Object-gedeelte. In de eigenschappen stel je het tweede object in op de "Speler"-tag.
Onder het Aangepaste gedrag gedeelte laat je een Broadcast Bericht-gedrag vallen en verbind deze onder het Botsing-gedrag. Stel in de Broadcast Bericht-gedraging de Event Key in op "speler aangeraakt" en de waarde op -10.
Vergeet niet: Event keys zijn hoofdlettergevoelig! Voor de eenvoud zal deze tutorial kleine letters gebruiken voor event keys. Je kunt ervoor kiezen om hoofdletters te gebruiken als je dat wilt, maar zorg ervoor dat je je herinnert welke letters hoofdletters zijn voor later.
Nu hebben we een manier om te detecteren wanneer de speler schade zou moeten oplopen. Wanneer de speler in botsing komt met de slijm, wordt een bericht voor de gebeurtenis "speler aangeraakt" uitgezonden met een waarde van -10. We zullen de -10 gebruiken om de gezondheidsbalk te vertellen om "toe te voegen" -10 gezondheid, en aangezien de waarde negatief is, zal het 10 gezondheid verwijderen.
We moeten nog steeds die logica aan de gezondheidsbalk toevoegen, dus laten we dat nu doen. Verlaat de gedragseditor voor de slijm en tik in de hoofdeditor op de Scene UI-laag en tik dan op de gezondheidsbalk. Open de gedragseditor voor de gezondheidsbalk.
In de gedragseditor van de gezondheidsbalk laat je een Voeg toe aan Gezondheidsbalk-gedraging vallen onder de UI-gedraging sectie en verbind deze onder de Ontvang Bericht-gedraging.
In de eigenschappen van de Voeg toe aan Gezondheidsbalk stel je de uitvoerwaarde van Ontvang Bericht in op het "Waarde om toe te voegen"-veld. Die waarde zal de -10 waarde zijn die we eerder instelden in de Broadcast Bericht-gedraging voor de slijm. Op deze manier, als we ervoor kiezen om andere vijanden verschillende hoeveelheden schade te laten toebrengen, hoeven we alleen de waarde op de uitzending te veranderen naar wat we ook willen en de gezondheidsbalk zal die waarde in plaats daarvan gebruiken!
Zorg ervoor dat "Evenement op Vol" uit staat en "Evenement op Leeg" aan is. Dit betekent dat als de gezondheidsbalk nul gezondheid bereikt, de volgende gedraging zal worden uitgevoerd.
Onder de Scène-gedraging sectie laat je een Laad Overlay-gedrag vallen en verbind deze met de Voeg toe aan Gezondheidsbalk-gedraging.
In de Laad Overlay-instellingen wijzig je de geselecteerde overlay in de "Game Over"-overlay die automatisch voor je is gemaakt wanneer je een nieuw project maakt.
Speel het spel en probeer het uit! Nu, telkens wanneer je contact maakt met de slijm, zou je gezondheidsbalk moeten leeglopen. Wanneer de gezondheidsbalk nul bereikt, is het game over.
Cool! Nu hebben we een manier om de speler schade toe te brengen en verliezen in het spel.
Er lijkt echter iets niet helemaal goed te zijn; we geven de speler niet veel feedback dat ze geraakt zijn, behalve het verwijderen van gezondheid van de gezondheidsbalk.
We kunnen dit verhelpen door de speler en de slijm van elkaar af te stoten, waardoor het heel duidelijk wordt dat ze contact hebben gemaakt, evenals door te voorkomen dat de speler te snel schade oploopt door snel met de slijm in botsing te komen.
Ga naar de gedragseditor voor de slijm (je moet misschien eerst de Hoofdlaag selecteren), en plaats een Stoot Object-gedrag onder het Fysica-gedeelte. Verbind het onder het Broadcast Bericht-gedrag van eerder en open de eigenschappen.
In de eigenschappen wijzig je het tweede object in de "Speler"-tag door het tabblad Tags te openen en "Speler" te selecteren. Wijzig de krachtwaarde in 200, de Object A-vermenigvuldiger in 0,25, en de Object B-vermenigvuldiger in 1.
Nu, wanneer de speler in botsing komt met de slijm, zal hij de speler met een kracht van 200 (1 × 200 kracht) van de slijm afduwen, en de slijm zal met een kracht van 50 (0,25 × 200 kracht). van de speler worden geduwd.
Onze game begint nu behoorlijk goed aan te voelen! Het enige probleem is dat we een onoverwinnelijke slijm hebben en onze speler geen manier heeft om het te verslaan. In het volgende deel zullen we een manier implementeren voor onze speler om terug te vechten.
Deel 6: De Slijm Verslaan
Om onze speler de slijm te laten aanvallen door erop te springen, moeten we de manier waarop we de botsing afhandelen veranderen door ervoor te zorgen dat de slijm de onderkant van de speler (de voeten van de speler) negeert bij het toebrengen van schade.
Open de gedragseditor van de slijm en tik op het Botsing-gedrag dat we in het vorige deel van de tutorial hebben gemaakt. Deactiveer de optie "Aan Onderkant", die botsingen negeert als de slijm met de onderkant van de botsingsbox van de speler in botsing komt.
Nu zal onze slijm de speler geen schade toebrengen als de speler erop springt. In plaats daarvan willen we verschillende logica uitvoeren wanneer dat gebeurt.
Met de vlak geselecteerde Botsing-gebeurtenis, dupliceer het en keer alle opties in het nieuwe Botsing-gedrag om zodat alleen de "Aan Onderkant"-gebeurtenis is ingeschakeld.
Dit zal onze toegangspunt vormen wanneer de speler op de slijm springt.
Vervolgens laat je een Verwijder Object-gedrag vanuit het Object gedrag gedeelte vallen. Het zou in principe al ingesteld moeten zijn om ons slijmobject te verwijderen.
Nu, wanneer we ons spel spelen, vernietigt sprongen op de slijm hem. Maar opnieuw, zoals het deed bij het geraakt worden door de slijm eerder, voelt het niet erg bevredigend.
Zoals we in het vorige deel van de tutorial deden, laten we nog een Stoot Object aan toevoegen. Dupliceer de oudere Stoot Object-gedraging van de speler schade logica en verbind deze onder het Verwijder Object-gedrag. De eigenschappen van de oudere Stoot Object-gedraging kunnen hetzelfde blijven.
Nu, wanneer we het spel spelen, is er een mooie bevredigende sprongetje bij het springen bovenop de slijm.
Conclusie & Oefeningen
En dat is het zo'n beetje! We hebben alle hokjes afgevinkt die in de inleiding sectie waren gemaakt:
- In plaats van te lopen, zal de slijm naar links of rechts springen om te bewegen. Check!
- De slijm zal in de richting van de speler springen. Check!
- Als de speler te ver weg is, zal de slijm niet bewegen (idle). Check!
- De slijm zal de gezondheid van de speler wegnemen bij contact. Check!
- De slijm is verslagen als de speler erop springt. Check!
Als je dit ver heeft gemaakt, zou je nu een goed begrip moeten hebben van hoe je je vijanden enige intelligentie kunt geven en ze zelfstandig kunt laten denken en beslissingen nemen. Goed gedaan!
Er zijn echter altijd meer dingen die gedaan kunnen worden. Als oefening, probeer de volgende dingen zelf te doen:
- Speel een "geraakt/dood" slijm animatie wanneer de slijm van bovenaf door de speler wordt gesprongen.
- Speel een "geraakt" speler animatie wanneer de slijm de speler aanvalt.
- Voeg wat willekeurigheid toe aan hoe ver de slijm elke keer zal springen.
Een voltooide projectbestand voor deze tutorial kan hier worden gevonden: Download Tutorial Project

