|
|
|
@ -1,5 +1,7 @@
|
|
|
|
|
#include <TFT_eSPI.h>
|
|
|
|
|
#include <LIS3DHTR.h>
|
|
|
|
|
#include <cstdlib> // Pour la fonction rand
|
|
|
|
|
#include <ctime> // Pour la fonction time
|
|
|
|
|
|
|
|
|
|
TFT_eSPI tft = TFT_eSPI();
|
|
|
|
|
LIS3DHTR<TwoWire> lis;
|
|
|
|
@ -49,6 +51,8 @@ String levels[3] = {"Novice", "Confirmé", "Expert"}; // Assurez-vous que les ni
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct Piece {
|
|
|
|
|
int x;
|
|
|
|
|
int y;
|
|
|
|
@ -134,11 +138,10 @@ void setupAccelerometer() {
|
|
|
|
|
|
|
|
|
|
void checkButtonState() {
|
|
|
|
|
int buttonState = digitalRead(WIO_KEY_B);
|
|
|
|
|
Serial.println(buttonState);
|
|
|
|
|
|
|
|
|
|
if(buttonState == LOW){
|
|
|
|
|
isGameRunning = true;
|
|
|
|
|
if(buttonState == LOW && isGameRunning == false){
|
|
|
|
|
lastTimeDecrement = millis();
|
|
|
|
|
resetGame();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -159,11 +162,11 @@ void updateBallPosition() {
|
|
|
|
|
// Déplacer la balle en fonction des données de l'accéléromètre
|
|
|
|
|
ballX += accX * SPEEDGAME;
|
|
|
|
|
ballY += accY * SPEEDGAME;
|
|
|
|
|
// Limiter les positions de la balle à l'intérieur de la zone de jeu
|
|
|
|
|
if (ballX < 0 + ballRadius) ballX = ballRadius;
|
|
|
|
|
if (ballX > 320 - ballRadius) ballX = 320 - ballRadius;
|
|
|
|
|
if (ballY < 40 + ballRadius) ballY = 40 + ballRadius;
|
|
|
|
|
if (ballY > 240 - ballRadius) ballY = 240 - ballRadius;
|
|
|
|
|
// Si la balle dépasse les limites de l'écran, arrêter le jeu
|
|
|
|
|
if (ballX < 0 + ballRadius || ballX > 320 - ballRadius || ballY < 40 + ballRadius || ballY > 240 - ballRadius) {
|
|
|
|
|
isGameRunning = false;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// Dessiner la nouvelle position de la balle
|
|
|
|
|
tft.fillCircle(ballX, ballY, ballRadius, TFT_RED);
|
|
|
|
|
// Mettre à jour les anciennes coordonnées de la balle
|
|
|
|
@ -171,6 +174,7 @@ void updateBallPosition() {
|
|
|
|
|
oldBallY = ballY;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void checkTime() {
|
|
|
|
|
// Gestion du chronomètre
|
|
|
|
|
if (millis() - lastTimeDecrement >= timeInterval) {
|
|
|
|
@ -223,7 +227,24 @@ void displayPieces() {
|
|
|
|
|
tft.setTextColor(oldTextColor);
|
|
|
|
|
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() {
|
|
|
|
|
if (isGameRunning) { // Si le jeu est en cours, ne faites rien et sortez de la fonction
|
|
|
|
|
return;
|
|
|
|
@ -255,35 +276,24 @@ void changeLevel() {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
void displayLevel() {
|
|
|
|
|
// Vider la zone de jeu
|
|
|
|
|
tft.fillRoundRect(0, 40, 320, 200, 0, TFT_DARKGREY);
|
|
|
|
|
|
|
|
|
|
Piece* currentPieces; // pointeur vers le tableau des pièces du niveau en cours
|
|
|
|
|
|
|
|
|
|
if (level == "Novice") {
|
|
|
|
|
currentPieces = piecesNovice;
|
|
|
|
|
} else if (level == "Confirmé") {
|
|
|
|
|
currentPieces = piecesConfirme;
|
|
|
|
|
} else if (level == "Expert") {
|
|
|
|
|
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("$");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
void resetGame() {
|
|
|
|
|
isGameRunning = true; // Ajoutez cette ligne pour redémarrer le jeu
|
|
|
|
|
timeLeft = 30;
|
|
|
|
|
level = "Novice";
|
|
|
|
|
ballX = 160;
|
|
|
|
|
ballY = 120;
|
|
|
|
|
oldBallX = ballX;
|
|
|
|
|
oldBallY = ballY;
|
|
|
|
|
currentLevelIndex = 0;
|
|
|
|
|
score = 0;
|
|
|
|
|
currentPieces = novicePieces;
|
|
|
|
|
currentPieceCount = sizeof(novicePieces) / sizeof(novicePieces[0]);
|
|
|
|
|
for (int i = 0; i < currentPieceCount; i++) {
|
|
|
|
|
currentPieces[i].isCollected = false;
|
|
|
|
|
}
|
|
|
|
|
}*/
|
|
|
|
|
displayPieces();
|
|
|
|
|
updateBanner();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void setup() {
|
|
|
|
@ -301,18 +311,11 @@ void loop() {
|
|
|
|
|
updateBallPosition();
|
|
|
|
|
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
|
|
|
|
|
for (int i = 0; i < currentPieceCount; i++) {
|
|
|
|
|
if (!currentPieces[i].isCollected && distance(ballX, ballY, currentPieces[i].x, currentPieces[i].y) < ballRadius + PIECE_RADIUS) {
|
|
|
|
|
checkColision();
|
|
|
|
|
|
|
|
|
|
currentPieces[i].isCollected = true;
|
|
|
|
|
tft.fillCircle(currentPieces[i].x, currentPieces[i].y, 5, TFT_DARKGREY);
|
|
|
|
|
|
|
|
|
|
score++; // Augmenter le score
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|