ajout colisions avec les murs + reset de la partie possible si elle est terminée

master
Leo TUAILLON 2 years ago
parent 2fd490decf
commit 69126dcc05

@ -1,5 +1,7 @@
#include <TFT_eSPI.h> #include <TFT_eSPI.h>
#include <LIS3DHTR.h> #include <LIS3DHTR.h>
#include <cstdlib> // Pour la fonction rand
#include <ctime> // Pour la fonction time
TFT_eSPI tft = TFT_eSPI(); TFT_eSPI tft = TFT_eSPI();
LIS3DHTR<TwoWire> lis; LIS3DHTR<TwoWire> lis;
@ -49,6 +51,8 @@ String levels[3] = {"Novice", "Confirmé", "Expert"}; // Assurez-vous que les ni
struct Piece { struct Piece {
int x; int x;
int y; int y;
@ -134,11 +138,10 @@ void setupAccelerometer() {
void checkButtonState() { void checkButtonState() {
int buttonState = digitalRead(WIO_KEY_B); int buttonState = digitalRead(WIO_KEY_B);
Serial.println(buttonState);
if(buttonState == LOW){ if(buttonState == LOW && isGameRunning == false){
isGameRunning = true;
lastTimeDecrement = millis(); lastTimeDecrement = millis();
resetGame();
} }
} }
@ -159,11 +162,11 @@ void updateBallPosition() {
// Déplacer la balle en fonction des données de l'accéléromètre // Déplacer la balle en fonction des données de l'accéléromètre
ballX += accX * SPEEDGAME; ballX += accX * SPEEDGAME;
ballY += accY * SPEEDGAME; ballY += accY * SPEEDGAME;
// Limiter les positions de la balle à l'intérieur de la zone de jeu // Si la balle dépasse les limites de l'écran, arrêter le jeu
if (ballX < 0 + ballRadius) ballX = ballRadius; if (ballX < 0 + ballRadius || ballX > 320 - ballRadius || ballY < 40 + ballRadius || ballY > 240 - ballRadius) {
if (ballX > 320 - ballRadius) ballX = 320 - ballRadius; isGameRunning = false;
if (ballY < 40 + ballRadius) ballY = 40 + ballRadius; return;
if (ballY > 240 - ballRadius) ballY = 240 - ballRadius; }
// Dessiner la nouvelle position de la balle // Dessiner la nouvelle position de la balle
tft.fillCircle(ballX, ballY, ballRadius, TFT_RED); tft.fillCircle(ballX, ballY, ballRadius, TFT_RED);
// Mettre à jour les anciennes coordonnées de la balle // Mettre à jour les anciennes coordonnées de la balle
@ -171,6 +174,7 @@ void updateBallPosition() {
oldBallY = ballY; oldBallY = ballY;
} }
void checkTime() { void checkTime() {
// Gestion du chronomètre // Gestion du chronomètre
if (millis() - lastTimeDecrement >= timeInterval) { if (millis() - lastTimeDecrement >= timeInterval) {
@ -223,7 +227,24 @@ void displayPieces() {
tft.setTextColor(oldTextColor); tft.setTextColor(oldTextColor);
tft.setTextSize(oldTextSize); tft.setTextSize(oldTextSize);
} }
void checkColision() {
for (int i = 0; i < currentPieceCount; i++) {
if (!currentPieces[i].isCollected && distance(ballX, ballY, currentPieces[i].x, currentPieces[i].y) < ballRadius + PIECE_RADIUS) {
currentPieces[i].isCollected = true;
tft.fillCircle(currentPieces[i].x, currentPieces[i].y, 5, TFT_DARKGREY);
if (currentPieces[i].isBlack) {
timeLeft -= 10; // Enlève 5 secondes
} else {
srand(time(0));
int points_ajoutes = rand() % 16 + 10; // tire un entier au sort aléatoirement entre 10 et 25
score += points_ajoutes; //ajoute le score de la pièce au score de la partie
}
}
}
}
void changeLevel() { void changeLevel() {
if (isGameRunning) { // Si le jeu est en cours, ne faites rien et sortez de la fonction if (isGameRunning) { // Si le jeu est en cours, ne faites rien et sortez de la fonction
return; return;
@ -255,35 +276,24 @@ void changeLevel() {
} }
} }
void resetGame() {
isGameRunning = true; // Ajoutez cette ligne pour redémarrer le jeu
/* timeLeft = 30;
void displayLevel() { level = "Novice";
// Vider la zone de jeu ballX = 160;
tft.fillRoundRect(0, 40, 320, 200, 0, TFT_DARKGREY); ballY = 120;
oldBallX = ballX;
Piece* currentPieces; // pointeur vers le tableau des pièces du niveau en cours oldBallY = ballY;
currentLevelIndex = 0;
if (level == "Novice") { score = 0;
currentPieces = piecesNovice; currentPieces = novicePieces;
} else if (level == "Confirmé") { currentPieceCount = sizeof(novicePieces) / sizeof(novicePieces[0]);
currentPieces = piecesConfirme; for (int i = 0; i < currentPieceCount; i++) {
} else if (level == "Expert") { currentPieces[i].isCollected = false;
currentPieces = piecesExpert;
}
for (int i = 0; i < PIECE_COUNT; i++) {
if (!currentPieces[i].isCollected) {
tft.fillCircle(currentPieces[i].x, currentPieces[i].y, PIECE_RADIUS, currentPieces[i].color);
if (currentPieces[i].color == TFT_YELLOW) { // seulement dessiner le symbole du dollar pour les pièces jaunes
tft.setTextColor(TFT_BLACK, currentPieces[i].color);
tft.setTextSize(1);
tft.setCursor(currentPieces[i].x - 3, currentPieces[i].y - 3); // Ajuster ces valeurs pour centrer le symbole du dollar
tft.print("$");
}
}
} }
}*/ displayPieces();
updateBanner();
}
void setup() { void setup() {
@ -296,23 +306,16 @@ void setup() {
void loop() { void loop() {
checkButtonState(); checkButtonState();
changeLevel(); changeLevel();
if(isGameRunning){ if(isGameRunning){
updateBallPosition(); updateBallPosition();
checkTime(); checkTime();
} }
else tft.fillCircle(ballX, ballY, ballRadius, TFT_RED);
updateBanner(); // Mettre à jour le bandeau dans chaque boucle, que le jeu soit en cours ou non updateBanner(); // Mettre à jour le bandeau dans chaque boucle, que le jeu soit en cours ou non
for (int i = 0; i < currentPieceCount; i++) { checkColision();
if (!currentPieces[i].isCollected && distance(ballX, ballY, currentPieces[i].x, currentPieces[i].y) < ballRadius + PIECE_RADIUS) {
currentPieces[i].isCollected = true;
tft.fillCircle(currentPieces[i].x, currentPieces[i].y, 5, TFT_DARKGREY);
score++; // Augmenter le score
}
}
} }

Loading…
Cancel
Save