Bonjour
Je suis en train d'essayer de concevoir un Jeux Pacman sur un écran LCD 2004 avec pour controlle un Joystick.
J'essaye de faire le déplacement de fantôme sans (affichage multiple de fantôme, recréation de carré au passage du fantôme).
Je pense que je suis sur la bonne voie mais un petit coup de main me serais utile.
Voici mon code :
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27(Cooperate with 3 short circuit caps) for a 16 chars and 2 line display
// Vitesse personnage
#define Speed_Pacman 200
#define Speed_Fantome 4000
long Millis = 0;
long Millis2 = 0;
// Pin bouton
int gauche = 12; // Gauche
int droite = 8; // Droite
int haut = 6; // Haut
int bas = 5; // Bas
// Joystick axe
int axeX = A0;
int axeY = A1;
int valX;
int valY;
// Création des personnages et décors
byte pac1Def[8] = {
B00000,
B01110,
B10111,
B11111,
B11111,
B01110,
B00000,
B00000
};
byte pac2Def[8] = {
B00000,
B01110,
B10100,
B11000,
B11100,
B01110,
B00000,
B00000
};
byte pillDef[8] = {
B00000,
B00000,
B00000,
B01100,
B01100,
B00000,
B00000,
B00000
};
byte Fantome[8] = {
B00000,
B01110,
B10101,
B11111,
B11111,
B10101,
B00000,
B00000
};
byte FantomeFear[8] = {
B00000,
B01110,
B10101,
B11111,
B10001,
B11111,
B10101,
B00000
};
byte eatSmall[8] = {
B00000,
B00000,
B00000,
B00110,
B00110,
B00000,
B00000,
B00000
};
byte eatBig[8] = {
B00000,
B00000,
B01111,
B01111,
B01111,
B01111,
B00000,
B00000
};
byte MurHorizontal[8] = {
B11111,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B11111
};
byte MurVerticalRight[8] = {
B11111,
B00001,
B00001,
B00001,
B00001,
B00001,
B00001,
B11111
};
byte MurVerticalLeft[8] = {
B11111,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B11111
};
int x = 0;
int y = 0;
int px = 0;
int py = 0;
byte points[19][3];
byte vide=false;
/* Au début */
// Position des Fantomes
int xfant1 = 8;
int yfant1 = 0;
int pxfant1 = 0;
int pyfant1 = 0;
byte light=true;
long keystruck=0;
long poursuite=0;
byte partieEnCours=true;
byte level=0;
int score=0;
void setup() {
lcd.begin(20, 4);
lcd.init(); // initialize the lcd
lcd.backlight();
lcd.home();
// create a new character
lcd.createChar(0, pac1Def);
// create a new character
lcd.createChar(1, pac2Def);
// create a new character
lcd.createChar(2, pillDef);
// create a new character
lcd.createChar(3, Fantome);
// create a new character
lcd.createChar(4, FantomeFear);
// create a new character
lcd.createChar(5, eatSmall);
// create a new character
lcd.createChar(6, eatBig);
// Bouton Pin Mode
pinMode(gauche, INPUT_PULLUP); //
pinMode(droite, INPUT_PULLUP); //
pinMode(haut, INPUT_PULLUP); //
pinMode(bas, INPUT_PULLUP); //
// set up the lcd's number of columns and rows:
lcd.begin(20, 4);
// fill the display
fill();
}
void loop() {
int axeG = digitalRead(gauche);
int axeD = digitalRead(droite);
int axeH = digitalRead(haut);
int axeB = digitalRead(bas);
int valX = analogRead(axeX);
int valY = analogRead(axeY);
// Bouton déplacement
if (axeG == LOW) {
x--;
delay(100);
}
if (axeD == LOW) {
x++;
delay(100);
}
if (axeH == LOW) {
y--;
delay(100);
}
if (axeB == LOW) {
y++;
delay(100);
}
// Joystick Déplacement
if (valX > 700){ // droite
x = x - 1;
delay(100);
}else if (valX < 400){ // gauche
x = x + 1;
delay(100);
}else if (valY > 700){ // en haut
y = y + 1;
delay(100);
}else if (valY < 400){ // en bas
y = y - 1;
delay(100);
}
if(millis() - Millis > Speed_Pacman){
Millis = millis();
// Déplacement
if(x > 19 || y > 3){
x = 0;
y = 0;
}else if(x > 19 && y <= 3){
x = 0;
y = 0;
fill();
}
}
if(millis() - Millis2 > Speed_Fantome){
Millis2 = millis();
// Déplacement Fantome
if (yfant1 < y) {
yfant1 = yfant1 + 1;
}else if (yfant1 > y){
yfant1 = yfant1 - 1;
}else if (xfant1 < x){
xfant1 = xfant1 + 1;
}else if (xfant1 > x){
xfant1 = xfant1 - 1;
}
}
// Déplacement Pacman
anim_Pacman();
// Déplacement Fantome
anim_Fantome();
}
// Affichage nourriture
void fill() {
for (int i=0; i<20; i++){
for (int j=0; j<4; j++){
lcd.setCursor(i, j);
lcd.write(byte(2));
}
}
}
// Animation Pacman
void anim_Pacman(){
lcd.setCursor(px,py);
lcd.print(" ");
score++;
lcd.setCursor(x,y);
lcd.write(byte(1)); //pac2
delay(50);
lcd.setCursor(x,y);
lcd.write(byte(0)); //pac1
delay(50);
px = x;
py = y;
}
// Animation Fantome
void anim_Fantome() {
int oldx1 = pxfant1 - 1;
int oldy1 = pyfant1 - 1;
lcd.setCursor(pxfant1,pyfant1);
if ((pxfant1!=oldx1)||(pxfant1!=oldy1)){
lcd.write(2);
}else{
lcd.print(" ");
}
lcd.setCursor(xfant1,yfant1);
lcd.write(byte(3));
pxfant1 = xfant1;
pyfant1 = yfant1;
}
Je pense aller plus loin, avec la partie gagne si tout les blocs sont récupérer/perdu si un fantome nous mange, affichage des murs en aléatoires en fonction du niveau, plusieurs niveaux, augmenter la rapidité des fantômes.
Mais je souhaite d'abord régler ce problème.
Je ne trouve toujours pas ou est le bug.
Je vous remercie d'avance pour votre aide.