Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG mbed
Diff: main.cpp
- Revision:
- 0:19846e16566e
- Child:
- 1:f034e131e408
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Jun 12 14:28:04 2018 +0000 @@ -0,0 +1,321 @@ +#include "mbed.h" +#include "TS_DISCO_F746NG.h" +#include "LCD_DISCO_F746NG.h" +#include <time.h> // pour rand +#include <stdio.h> +#include <stdlib.h> + +LCD_DISCO_F746NG lcd; +TS_DISCO_F746NG ts; + +I2C i2c(PB_9,PB_8); + +TS_StateTypeDef TS_State; + +//adress de l'accelerometre +int addr = 0x14; + +//Tableau contenant les commandes +char cmd[2]; +char resultat[2]; + + +//Tableau contenant les données du capteur +char tmp[40]; + +//Position du pion +int position_pion_x = 0; +int position_pion_y = 30; + +//Variable contenant le score +int score = 0; + +//Variable de la position du checkpoint +int position_checkpoint_x = 250; +int position_checkpoint_y = 125; + + +//Variable choix utilisateur menu +bool choix_jeu = false; +bool choix_info = false; + +//Prototype des méthode +void jeu(); +void information(); + +int main() +{ + //Variable utilisé pour stocker les données de l'écran tactiles + uint16_t x, y; + uint8_t status; + + //Initialisation + lcd.DisplayStringAt(0, LINE(1), (uint8_t *)"Bienvenue sur AngleTarget", CENTER_MODE); + wait(0.3); + + status = ts.Init(lcd.GetXSize(), lcd.GetYSize()); + if (status != TS_OK) { + lcd.Clear(LCD_COLOR_RED); + lcd.SetTextColor(LCD_COLOR_WHITE); + lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"Initialisation fail ", CENTER_MODE); + } else { + lcd.Clear(LCD_COLOR_WHITE); + } + + //Affichage du menu + lcd.SetFont(&Font16); + lcd.DisplayStringAt(0, LINE(2), (uint8_t *)"Veuillez choisir une option", CENTER_MODE); + + //"Bouton" jeu + lcd.SetTextColor(LCD_COLOR_BLACK); + lcd.FillRect(250, 150, 150, 100); + + //"Bouton" informations + lcd.SetTextColor(LCD_COLOR_RED); + lcd.FillRect(50,150,150,100); + while(1) + { + //Recuperation des informations tactiles + ts.GetState(&TS_State); + if (TS_State.touchDetected) + { + x = TS_State.touchX[0]; + y = TS_State.touchY[0]; + + //Si on appuie sur la case jeu on lance le jeu + if((x >=250 && y>=150) && (x<400 && y<250)) + choix_jeu = true; + + //Si on appuie sur la case information on lance la methode information + if((x >=50 && y>=150) && (x<200&& y<250)) + choix_info = true; + } + + + //Si on appuie sur la case jeu on lance le jeu + if(choix_jeu == true) + { + jeu(); + } + + //Si on appuie sur la case information on lance la methode information + if(choix_info == true) + { + information(); + choix_info = false; + choix_jeu = true; + } + + } +} + +//Methode information +void information() +{ + uint16_t x, y; + bool choix_retour = false; + lcd.Clear(LCD_COLOR_WHITE); + lcd.SetTextColor(LCD_COLOR_BLACK); + + //Affichage des informations + lcd.SetFont(&Font12); + lcd.DisplayStringAt(0, LINE(1), (uint8_t *)"Bienvenue dans la rubrique information sur AngleTarget", CENTER_MODE); + lcd.SetFont(&Font12); + lcd.DisplayStringAt(0, LINE(3), (uint8_t *)"Developpe par Kenny Guillouche, Nathan Delafosse et Vadim Ielkin", CENTER_MODE); + lcd.DisplayStringAt(0, LINE(4), (uint8_t *)"Pour jouer, rendez vous dans le menu principal et clique sur jouer", CENTER_MODE); + lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"Les regles sont simples. vous devez placer votre pion sur une forme generer", CENTER_MODE); + lcd.DisplayStringAt(0, LINE(8), (uint8_t *)"Un jeu MANGame", CENTER_MODE); + lcd.DisplayStringAt(0, LINE(3), (uint8_t *)"Developpe par Kenny Guillouche, Nathan Delafosse et Vadim Ielkin", CENTER_MODE); + + //Bouton jeu + lcd.SetTextColor(LCD_COLOR_BLACK); + lcd.FillRect(165, 150, 150, 100); + + do + { + ts.GetState(&TS_State); + if (TS_State.touchDetected) + { + x = TS_State.touchX[0]; + y = TS_State.touchY[0]; + if((x >=165 && y>=150) && (x<315 && y<250)) + { + choix_retour = true; + choix_info = false; + jeu(); + } + } + } + while(choix_retour == false); + +} + +//Methode jeu +void jeu() +{ + uint16_t x, y; + bool cheat; + cheat = false; + bool stopjeu = false; + + //Initialisation du jeu + lcd.Clear(LCD_COLOR_WHITE); + lcd.SetTextColor(LCD_COLOR_BLACK); + lcd.FillRect(position_pion_x, position_pion_y, 30, 30); + + //Generation du score + sprintf(tmp,"Score : %d",score); + lcd.DisplayStringAt(0, LINE(1),(uint8_t *)tmp,CENTER_MODE); + + //Generation du premier checkpoint + lcd.SetTextColor(LCD_COLOR_RED); + lcd.FillRect(position_checkpoint_x, position_checkpoint_y, 10, 10); + + srand(time(NULL)); + + while(stopjeu == false) + { + //Recuperation de la coordonnée en X + resultat[0] = 0; + cmd[0] = 0x04; //Command read + i2c.write(addr, cmd, 1); + i2c.read(addr, resultat, 1); + + //Si accelerometre penché vers la droite + if((int)resultat[0]<52 && (int)resultat[0]>8) + { + //On modifie notre postion du pion vers la droite + if(position_pion_x<450) //Limite ecran + { + lcd.SetTextColor(LCD_COLOR_WHITE); + lcd.FillRect(position_pion_x, position_pion_y, 30, 30); + position_pion_x += 1; + lcd.SetTextColor(LCD_COLOR_BLACK); + lcd.FillRect(position_pion_x, position_pion_y, 30, 30); + } + } + + //Si accelerometre penché vers la hauche + else if((int)resultat[0]> 200 && (int)resultat[0]<250) + { + //On modifie notre postion du pion vers la gauche + if(position_pion_x>0) //Limite ecran + { + lcd.SetTextColor(LCD_COLOR_WHITE); + lcd.FillRect(position_pion_x, position_pion_y, 30, 30); + position_pion_x -= 1; + lcd.SetTextColor(LCD_COLOR_BLACK); + lcd.FillRect(position_pion_x, position_pion_y, 30, 30); + } + } + + //Recuperation de la coordonnée en Y + resultat[0] = 0; + cmd[0] = 0x06; //Command read + i2c.write(addr, cmd, 1); + i2c.read(addr, resultat, 1); + + //Si accelerometre penché vers le haut + if((int)resultat[0]<52 && (int)resultat[0]>8) + { + //On modifie notre postion du pion vers le haut + if(position_pion_y>30) //Limite ecran + { + lcd.SetTextColor(LCD_COLOR_WHITE); + lcd.FillRect(position_pion_x, position_pion_y, 30, 30); + position_pion_y -= 1; + lcd.SetTextColor(LCD_COLOR_BLACK); + lcd.FillRect(position_pion_x, position_pion_y, 30, 30); + } + } + + //Si accelerometre penché vers le bas + else if((int)resultat[0]<248 && (int)resultat[0]>200) + { + //On modifie notre postion du pion vers le bas + if(position_pion_y<242) //Limite ecran + { + lcd.SetTextColor(LCD_COLOR_WHITE); + lcd.FillRect(position_pion_x, position_pion_y, 30, 30); + position_pion_y += 1; + lcd.SetTextColor(LCD_COLOR_BLACK); + lcd.FillRect(position_pion_x, position_pion_y, 30, 30); + } + } + + //colission pion/checkpoint + if((position_pion_x + 30 >position_checkpoint_x) && (position_pion_x < position_checkpoint_x + 10) && (position_pion_y + 30 >position_checkpoint_y) && (position_pion_y < position_checkpoint_y +10)) + { + //On efface + lcd.Clear(LCD_COLOR_WHITE); + lcd.SetTextColor(LCD_COLOR_BLACK); + lcd.FillRect(position_pion_x, position_pion_y, 30, 30); + + //Actualisation du score + score++; + sprintf(tmp,"Score : %d",score); + lcd.DisplayStringAt(0, LINE(1),(uint8_t *)tmp,CENTER_MODE); + + //Position aléatoire du prochain checkpoint + position_checkpoint_x = (rand()%450) + 10; //generation nombre aleatoire entre 10 et 460 + position_checkpoint_y = (rand()%215) + 35 ; //generation nombre aleatoire entre 35 et 250 + + //Affichage nouveau checkpoint + lcd.SetTextColor(LCD_COLOR_RED); + lcd.FillRect(position_checkpoint_x, position_checkpoint_y, 10, 10); + } + + //Si il a reussit à faire +20 de score + if(score>20) + { + //On efface + lcd.Clear(LCD_COLOR_WHITE); + lcd.SetFont(&Font24); + + //On affiche victoire + lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"Victoire", CENTER_MODE); + wait(5); + + //Reinitialisation + stopjeu =true; + score = 0; + position_pion_x = 0; + position_pion_y = 30; + lcd.SetFont(&Font16); + } + + //Recuperation des informations tactiles + ts.GetState(&TS_State); + if (TS_State.touchDetected) + { + x = TS_State.touchX[0]; + y = TS_State.touchY[0]; + } + + //si on appuie sur la bonne position 1 + if((x >=250 && y>=150) && (x<275 && y<175)) + { + cheat = true; + } + + //si on appuie sur la bonne position 2 apres la 1 + if((x >=150 && y>=250) && (x<175 && y<275) && (cheat == true)) + { + //On efface + lcd.Clear(LCD_COLOR_WHITE); + lcd.SetFont(&Font24); + + //On affiche victoire + lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"Victoire", CENTER_MODE); + wait(5); + + //Reinitialisation + stopjeu =true; + score = 0; + position_pion_x = 0; + position_pion_y = 30; + lcd.SetFont(&Font16); + } + wait(0.005); + } +}