Inhoud
Wat vooraf ging
- U hebt de Blueprint Visual Scripting introductie doorgenomen.
- U kunt een functie aanmaken.
- U hebt weet van variabelen.
- U kunt eenvoudige bewerkingen uitvoeren.
- U hebt weet van Flow Control.
Inleiding
We weten reeds dat een variabele een waarde van een bepaald datatype kan bevatten, bijvoorbeeld een getal (met het datatype Integer).
Maar stel dat we nu 10 gelijkaardige getallen nodig hebben, moeten we dan 10 variabelen aanmaken? En stel dat we er 10000 nodig hebben, moeten we dan 10000 variabelen aanmaken?
Gelukkig niet.
Hebt u meerdere gelijkaardige waarden nodig, bv. meerdere gelijkaardige getallen, de namen van de vestigingen van het PCVO Groeipunt,… dan plaatst u deze niet in een enkele variabele maar in een lijst van variabelen. Zo’n lijst van gelijkaardige variabelen van eenzelfde datatype wordt ook een Array genoemd.
Met gelijkaardig bedoel ik dat ik in een array die de vestigingen van het PCVO Groeipunt wil bijhouden, ik technisch wel de namen van de cursisten zou kunnen steken (deze zijn ook strings) maar ik dit toch beter niet doe. Ik maak dan beter een tweede array aan maar deze keer met de namen van cursisten.
Hoewel we verderbouwen op vorige handleidingen verkies ik toch met een nieuw project te starten.
- Start een nieuw Third Person Desktop/Console project van Maximum Quality With Starters Content en geef het een passende naam.
Ik verkies ook om te werken in de Level Blueprint.
- Om de Level Blueprint te openen klikt u in de knoppenbalk van de Viewport op Blueprints – Open Level Blueprint.
De Level Blueprint wordt geopend in de zogenaamde Event Graph. De Level Blueprint kent enkel maar deze Event Graph.
In de Events Graph worden de events geprogrammeerd.
Ik herneem ook nog even hoe u Toetsenbord-events kunt aanmaken.
De verschillende code die we gaan maken gaan we elk aan een toets koppelen. Hiertoe moeten we toetsenbord-events gebruiken.
- Klik met de rechtermuisknop ingedrukt ergens in de Blueprint en zoek naar Keyboard.
- Vervolgens zoekt u naar de gewenste toets (bv. de F-toets) en klikt u deze aan.
U ziet de Exec-pins Pressed en Released staan. Deze kunnen we gebruiken voor het indrukken (Pressed) en weer loslaten van een toets (Released). Key is een Output-parameter die informatie over de ingedrukte toets bevat.
- Compile, Save en Play om dit uit te testen.
We gaan deze techniek in onderstaande voorbeelden gebruiken.
Een Array maken
Stel, ik wil een lijst met de vestigingen van het PCVO Groeipunt bijhouden. Deze vestigingen zijn namen, Strings dus, ik wil dus eigenlijk een lijst van strings bijhouden. Een lijst op zich is eigenlijk een lijst van variabelen van een bepaald datatype (hier String), we beginnen dus met het aanmaken van een variabele met de naam Vestigingen van het datatype String.
Variabele aanmaken
- Klik op +Variable in het My Blueprint-panel om een nieuwe variabele aan te maken.
- Geef de variabele de naam Vestiging en het datatype String.
Variabele omvormen tot een array
Nu we de variabele hebben kunnen we er een array van maken.
- Klik op het streepje achter het datatype en kies voor Array (de 9 blokjes).
- Klik op Compile.
Elementen toevoegen aan een array
Nu we de array hebben kunnen we elementen toevoegen.
Weet dat ieder element dat u toevoegt een index krijgt die kan gebruikt worden om het gewenste element te selecteren. Weet dat de eerste index de Index 0 is(we spreken van een zero-based index).
- Klik op Adds Element om een element toe te voegen.
- Typ de naam van de vestiging in en herhaal het toevoegen (via Adds Element) voor iedere vestiging.
Merk opnieuw de nummering, de index, op die begint bij 0.
Eventueel kunt u nog elementen Insert(en), Delete(n) en Duplicate(n).
Onze array is aangemaakt en reeds opgevuld met een aantal startwaarden.
Get en Set
- Sleep de array in de Level Blueprint voor een Get en een Set.
Wellicht merkt u meteen een probleem op, zowel die Input– als Output-parameters zijn allen arrays. Dit maakt dat onderstaande code een fout zal genereren.
U kunt een array dus niet zomaar printen.
Oké, eigenlijk is dit logisch want wat wilt u eigenlijk, alle vestigingen printen? Wellicht niet, wellicht wilt u een specifieke vestiging printen.
Om toch alle elementen van een array, alle vestigingen, af te drukken, moet u deze één voor één doorlopen. Dit kunt u doen met een For Each Loop (of For Each Loop with Break). Het Array Element bevat de eigenlijke waarde (de vestiging), Array Index de index binnen de array.
Array functies
Een array kent heel wat functionaliteiten.
We bespreken hier de meest belangrijke functionaliteiten.
Waarden opvragen
De normale Get (om waarden op te vragen van een variabele) wordt vervangen door de functie Get.
- Voeg de array Vestigingen toe via een gewone Get.
- Sleep nu een verbindingslijn uit de Output-pin en zoek naar Get.
Merk op dat u kunt kiezen tussen:
Get (a copy), waardoor een kopij wordt opgevraagd van de waarde. Als u dus de waarde van die opgevraagde kopij wijzigt, wijzigt de eigenlijke waarde in de array zelf niet.
Get (a ref) waardoor een referentie wordt opgevraagd naar de waarde. Als u dus de waarde van die opgevraagde referentie wijzigt, wijzigt u ook de eigenlijke waarde in de array.
- Eigenlijk is het gelijk wat u kiest maar het meest veilige is Get (a copy), kies dus voor Get (a copy).
De functie Get vraagt een element op uit array op basis van de index. Dit element op zich, de vestiging, een string, kan dan wel worden geprint.
Onderstaand voorbeeld vraagt het eerste element (index 0) op uit de array Vestigingen en drukt het af via Print String.
Merk op dat de functie Get de kleur van het datatype van de array overneemt.
Indien u wenst kunt u ook weer werken met een variabele via Promote to Variable.
- Klik met de rechtermuisknop ingedrukt op de Integer Input-pin en kies voor Promote to Variable.
- Geef de nieuw aangemaakte Integer variabele een passende naam (bv. Index).
- Compile.
- Via Default Value in het Details-panel kan u nu een testwaarde, bv. 0, voor de index, ingeven.
Hieronder ziet u het gebruik van de Get-functie met de variabele Index.
Elementen toevoegen en invoegen
Add
De Add-functie wordt gebruikt om achteraan de array een element toe te voegen.
Zo is er onlangs een vestiging in Gent bijgekomen. Onderstaande code toont hoe u deze nieuwe vestiging kunt toevoegen.
Indien u wenst kunt u ook weer met een variabele werken voor de Input-pin zoals hierboven, ik bespaar me nu even de moeite.
Merk op dat de Add-functie een Output-pin heeft die de index van het net toegevoegde element bevat. Deze index kan dan gebruikt worden om de waarde op deze indexpositie op te vragen (Get) en uit te printen.
Weet dat als u het programma stopt, u de vestiging de volgende keer opnieuw moet toevoegen!
Add Unique
Add Unique doet eigenlijk twee zaken:
- het element dat u wenst toe te voegen opzoeken in de array.
- Als het element nog niet voorkomt in de array wordt het element toegevoegd, indien het element wel reeds voorkomt in de array wordt het niet toegevoegd.
Met Add Unique voorkomt u dat eenzelfde element, eenzelfde waarde, 2 keer wordt toegevoegd. Ieder element, iedere waarde, in de array is dus uniek.
Merk de Output-pin op, dit is een integer waarde van de index waar het element is toegevoegd, achteraan de array, dit is hetzelfde als bij de gewone Add-functie. Het verschil is dat bij Add Unique deze Output-pin ook een -1 (INDEX_NONE) kan resulteren indien het element niet is toegevoegd omdat het reeds voorkwam in de array.
Onderstaande code demonstreert dit.
Merk op dat als u de eerste keer op de D-toets drukt u de index-waarde van het nieuw toegevoegde element krijgt. Drukt u nogmaals op de D-toets dan krijgt u -1 als uitvoer. Klopt, het element is immers tijdens de eerste druk op de D-toets toegevoegd.
Insert
De Insert-functie wordt gebruikt om een element op een specifieke positie in te voegen. Indien u een element invoegt schuift het element dat zich reeds op die positie bevond, en alle volgende elementen, één indexpositie op.
Omdat dit minder vaak gebruikt worden dan de Add-functie beperk ik me tot het tonen van de keuze.
Onderstaand voorbeeld voegt een nieuwe vestiging Gent toe op de plaats bepaald door de waarde van de variabele Index. Indien de waarde van de variabele Index 0 is wordt het nieuwe element, de nieuwe vestiging, vooraan ingevoegd.
Set Array Element
Set array Elem(ent) is een beetje een combinatie tussen een klassieke Set en Insert. Net als bij Insert geldt ook hier de opmerking dat u dit wellicht niet zo heel vaak zal gebruiken.
Het enige verschil met Insert is de optie Size to Fit, moet de array automatisch langer worden als u een index meegeeft die buiten de huidige array ligt?
Length versus Last Index
De functie Length geeft u de lengte van de array.
De functie Last Index geeft u, het laatste (hoogste) indexgetal.
In de praktijk is:
Last Index = Length – 1
Onderstaand voorbeeld demonstreert dit.
Elementen (waarden) opzoeken
Er zijn twee functies om waarden op te zoeken Find en Contains.
- Find – zoekt het element en geeft de index terug (-1 indien de waarde niet gevonden is).
- Contains – zoekt het element en geeft aan of het al dan niet gevonden is (Een Booleaanse vergelijking die True of False kan zijn).
Indien u wenst kunt u ook weer met een variabele werken voor de Input-pin zoals hierboven, ik bespaar me nu even de moeite.
Verwijderen
Verwijderen kan ook door middel van 3 functies Remove, Remove Index en Clear.
- Remove – zoekt het element en verwijdert alle voorkomens van het element (indien hetzelfde element, dezelfde waarde, meerdere keren voorkomt in de array). Een Output-pin geeft aan of er effectief een verwijdering gebeurd is (Een Booleaanse vergelijking die True of False kan zijn).
- Remove Index – verwijdert het element op een specifieke index.
- Clear – verwijdert alle elementen in een array, maakt dus de array leeg.
Om te controleren of de Index wel bestaat kunt u het testen met een Is Valid Index.
Praktisch voorbeeld
Memory
- De computer toont, aan de hand van een tekst (R(ood), G(roen) of B(lauw)), de kleur van de lamp die u moet overlappen. De computer toont de gekozen kleur gedurende pakweg 2 seconden. Hij toont bv. de tekst “R”. De gekozen kleur moet bijgehouden worden in een Array.
- U, de speler, moet dus het rode lampje overlappen. Als u de juiste lamp overlapt kunt u verder gaan door op een toets te drukken.
- De computer toont dan opnieuw de vorige kleur(en), aangevuld met een nieuwe gekozen kleur. De computer toont nu de tekst “RG”.
- U moet nu eerst het rode en dan het groene lampje overlappen.
- Maakt u een foute keuze in de volgorde van het overlappen van de lampen, dan verliest u.
- U bepaalt op voorhand hoe lang de reeks mag worden, hebt u het einde van de reeks gehaald, zonder fout, dan bent u gewonnen.
- Het overlappen van lampjes mag u ook vervangen door het binnen gaan in een hokje of door eenvoudig op de gewenste toets te drukken.
Onderstaande is een vereenvoudigde, richtinggevende oplossing van dit probleem.
Kleuren toevoegen aan de array van de computer
Bij het overlappen van een kleur door de speler
Herhaal dit voor de drie mogelijke kleuren.
De controle van de gekozen kleur door de speler met de overeenkomende waarde in de array van de computer
Behandelde Basiscompetenties uit de module ICT Programmeren – Start to program
- IC BC228 – kent de verschillende principes en onderdelen op basis waarvan een programma kan opgebouwd worden
- IC BC237 – kan een eenvoudig programma wijzigen
- IC BC239 – kan bij het programmeren een juiste logica volgen
- IC BC240 – kan een eenvoudig programma maken
- IC BC242 – kan een programma uittesten
- IC BC352 – begrijpt het systeem en de functies die achter een programma zitten