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 <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() {
@ -296,23 +306,16 @@ void setup() {
void loop() {
checkButtonState();
changeLevel();
changeLevel();
if(isGameRunning){
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) {
currentPieces[i].isCollected = true;
tft.fillCircle(currentPieces[i].x, currentPieces[i].y, 5, TFT_DARKGREY);
score++; // Augmenter le score
}
}
checkColision();
}

Loading…
Cancel
Save