KeyChainino - första spelet nyckelringen programmerbara med Arduino (8 / 14 steg)
Steg 8: Hur uppdaterar boll position
UpdateBallPosition() sparken från owerflow avbrottet av timer 1 och används för att uppdatera ställning bollen.
Här är vi:
ändra boll position beroende på boll
ballY = ballCurrentPosition [0] + ballDirection [0];
ballX = ballCurrentPosition [1] + ballDirection [1].
dessa instruktioner uppdatera två variabler ballX och ballY enligt variabeln ballDirection .
Såsom förklaras ovan kan ballDirection anta denna värden:
Riktning
Y: 0 = stopp, -1 = upp, 1 = ner
X: 0 = STOPP, 1 = HÖGER, -1 = VÄNSTER
int ballDirection [2] = {1, 0}; / / Y, X indikerar riktning där bollen kommer
Så, från början vi lägger bollen nuvarande position till bollen riktning.
Detta förenklar de sätt att hantera bollen riktning eftersom matrisen rad, till exempel går från 0 till 5 från toppen till botten medan matrix COL går från 0 till 6 från vänster till höger.
Detta innebär att om ballDirection är egual till {1,0},
ballY = ballCurrentPosition [0] + ballDirection [0];
ballCurrentPosition [0] + 1 = boll går ner
ballX = ballCurrentPosition [1] + ballDirection [1].
ballCurrentPosition [1] + 0 = boll tar är vertikal position.
Nu har vi uppdaterat variablerna BallX och BallY , men inte faktiskt ställning bollen i matrisen.
Detta eftersom först vi vill kontrollera om bollen gör vissa kollision med matrix gränsen eller baren.
checkCollision
om (ballY > = MATRIX_ROW - 1) {/ / bollen rörde botten
ballY = MATRIX_ROW - 1;
om (ballX > = MATRIX_COL - 1) {
ballX = MATRIX_COL - 1;
}
om (ballX < = 0) {
ballX = 0;
}
om (ballX == barCurrentPosition [0] [1] || ballX == barCurrentPosition[1][1]) {//ball rörd bar
ballDirection [0] = -1;
ballDirection [1] = random (-1, 2);
Score ++;
} annat {//ball rörde botten = slut
SLUTSPELET
ballDirection [0] = 0;
ballDirection [1] = 0;
gameStarted = false;
}
}
annars om (ballY < = 0) {//ball touch topp
ballY = 0;
om (ballX > = MATRIX_COL - 1) {
ballX = MATRIX_COL - 1;
}
om (ballX < = 0) {
ballX = 0;
}
ballDirection [0] = 1;
ballDirection [1] = random (-1, 2);
}
annars om (ballX > = MATRIX_COL) {//ball rörde just
ballX = MATRIX_COL - 1;
om (ballY > = MATRIX_ROW - 1) {
ballY = MATRIX_ROW - 1;
}
om (ballY < = 0) {
ballY = 0;
}
ballDirection [1] = -1;
}
annars om (ballX < = 0) {//ball rörde vänster
ballX = 0;
om (ballY > = MATRIX_ROW - 1) {
ballY = MATRIX_ROW - 1;
}
om (ballY < = 0) {
ballY = 0;
}
ballDirection [1] = 1;
}
Dessa funktioner match ball position gränser matrisen.
Om bollarna når den övre och höger- eller vänsterkant, studsa bollar för vi ändra dess riktning.
Nu uppdaterar vi matrixState med boll nya position på detta sätt:
uppdatera position ballNewPosition [0] = ballY;
ballNewPosition [1] = ballX;
ta bort aktuella kulan Position
matrixState [ballCurrentPosition [0]] [ballCurrentPosition [1]] = 0;
Ange nuvarande bar ställning till ny position
ballCurrentPosition [0] = ballNewPosition [0];
ballCurrentPosition [1] = ballNewPosition [1].
Visa ny bar Position
matrixState [ballNewPosition [0]] [ballNewPosition [1]] = 1;
Först klara vi den tidigare boll positionen genom att rensa sin position i matrisen matrixState.
Nästa sätter vi nya bollens position i matrixState.