Forestil dig, at vi vil gemme de seneste 50 positioner for musen, så vi kan tegne en sti, der følger efter den. For at gøre dette, skal vi bruge to arrays: ét til X-positioner og ét til Y-positioner. På den måde kan vi holde styr på, hvor musen har været, og opdatere positionerne over tid.
Først opretter vi to arrays:
int[] xpos = new int[50];
int[] ypos = new int[50];
Her kan xpos gemme 50 værdier for musens X-positioner, og ypos gemmer 50 værdier for musens Y-positioner.
Da musen ikke har bevæget sig, når vi starter programmet, fylder vi arrays med 0'er:
for (int i = 0; i < xpos.length; i++) {
xpos[i] = 0;
ypos[i] = 0;
}
Det betyder, at når vi starter, står alle værdier i xpos og ypos på 0, så stien begynder samlet ét sted.
I draw() opdaterer vi arrays med musens aktuelle position, men for kun at gemme de sidste 50 positioner, skal vi flytte alle værdierne ét skridt fremad i arrays først. For at få hvert element til at “bevæge sig frem” i arrayet, gør vi sådan:
for (int i = 0; i < xpos.length - 1; i++) {
xpos[i] = xpos[i + 1];
ypos[i] = ypos[i + 1];
}
Dette betyder, at værdien på plads 0 bliver den samme som på plads 1, plads 1 bliver lig plads 2, osv., så alle værdier “skubbes” ét trin frem.
Når alle værdier er flyttet en plads frem, sætter vi musens nuværende position som den sidste værdi i arrays:
xpos[xpos.length - 1] = mouseX;
ypos[ypos.length - 1] = mouseY;
Nu har vi musens aktuelle position i slutningen af arrays, og resten af værdierne viser, hvor musen har været.
For at visualisere stien, tegner vi en cirkel for hver værdi i arrays. På den måde viser hvert punkt musens tidligere position:
for (int i = 0; i < xpos.length; i++) {
ellipse(xpos[i], ypos[i], 10, 10);
}
Resultatet er, at vi får en serie af cirkler, der følger musens bevægelse og viser de sidste 50 positioner, den har været på.
Samlet kode:
int[] xpos = new int[50];
int[] ypos = new int[50];
void setup() {
size(400, 400);
// Startværdier
for (int i = 0; i < xpos.length; i++) {
xpos[i] = 0;
ypos[i] = 0;
}
}
void draw() {
background(255);
// Flyt værdierne fremad i arrays
for (int i = 0; i < xpos.length - 1; i++) {
xpos[i] = xpos[i + 1];
ypos[i] = ypos[i + 1];
}
// Opdater den sidste plads med musens position
xpos[xpos.length - 1] = mouseX;
ypos[ypos.length - 1] = mouseY;
// Tegn en sti af cirkler
for (int i = 0; i < xpos.length; i++) {
ellipse(xpos[i], ypos[i], 10, 10);
}
}
Mål: Ændr koden, så slangen bevæger sig i retninger styret af piletasterne.
Nedenunder kan du se pseudokoden for hvordan man løser punkt 2.
hvis op-pilen trykkes:
sæt retningX til 0
sæt retningY til -1
hvis ned-pilen trykkes:
sæt retningX til 0
sæt retningY til 1
hvis venstre-pilen trykkes:
sæt retningX til -1
sæt retningY til 0
hvis højre-pilen trykkes:
sæt retningX til 1
sæt retningY til 0
Mål: Forhindre slangen i at bevæge sig udenfor skærmens grænser.
Kig på dit pong-projekt måske kan du få lidt inspiration herfra.
Mål: Lav en mad-position på skærmen, som slangen kan “spise” for at vokse.
Følgende pseudokode bruges til punkt 2.
hvis slangens hoved-position er den samme som mad-position
øg slangens længde
placer maden et nyt tilfældigt sted på skærmen
Tip: Brug random() til at generere en tilfældig placering for maden.
Mål: Sørg for, at slangen ikke kan bevæge sig ind i sig selv.
Tip: Overvej, hvordan du kan bruge xpos og ypos til at tjekke slangens hovedposition i forhold til de andre segmenter.