A vous de jouer!
Étape 5
Notre jeu Attrap'oeuf n'est pas encore fini. Ensemble, nous avons ajouté le panier et les œufs. Il vous reste à implémenter les carottes. Mais avec l'aide des boucles for et l'organisation des fonctions, je suis sûr que vous pouvez le faire !
Petites indications de design: commencer par ajouter un nombre fixe de carottes, ensuite essayez de créer un mini système de progression, c'est-à-dire que plus le score sera grand, plus il y aura de carottes qui tombent, avec une quantité maximale de carottes a ne pas dépasser. Autre mission: centrez le panier pour qu'il change de taille sûr la gauche et la droite (actuellement, seul le côté droit grandit/rapetisse).
Astuce #1: Par rapport au système de progression, vous pouvez utiliser la fonction min()
pour ne pas dépasser le nombre maximal de carottes (en savoir plus ici.
Astuce #2: Toujours pour le système de progression, il vous faudra une variable qui traque le nombre de carottes actuellement en jeu, et une constante pour le nombre maximal de carottes.
Astuce #3: Pour centrer le panier, il faut que panierX
corresponde au centre du panier. A vous de trouver comment l'afficher et gérer les collisions.
Partage ton talent sur les réseaux avec #gamebuino #atelier #attrapoeuf, on les regarde tous ;)
Exemple de Solution
Si vous êtes en panne d'inspiration, voilà ce qu'on a fait de notre côté :)
Attrapoeuf.ino
#include <Gamebuino-Meta.h>
// Eggs
const int NBR_D_OEUFS = 10;
int oeufsX[NBR_D_OEUFS] = {};
int oeufsY[NBR_D_OEUFS] = {};
const int OEUF_LARGEUR = 2;
const int OEUF_HAUTEUR = 3;
// Carots
const int NBR_MAX_DE_CAROTTES = 8;
int nbrDeCarottes = 0;
int carottesX[NBR_MAX_DE_CAROTTES] = {};
int carottesY[NBR_MAX_DE_CAROTTES] = {};
const int CAROTTE_LARGEUR = 3;
const int CAROTTE_HAUTEUR = 5;
// Panier
int panierX = 20; // Le panier peut bouger horizontalement, donc ce n'est pas une constante
const int PANIER_Y = gb.display.height() - 4; // Constante car le panier est fixe selon l'axe Y
int panierLargeur = 0; // Pas constant car la taille dépend de la nourriture restante
const int PANIER_HAUTEUR = 3; // Constante
int score = 0;
int highscore = 0;
int nourriture; // Plus de nourriture est mieux. 0 nourriture = game over
void setup() {
gb.begin();
// Placer les oeufs aléatoirement au dessus de l'écran
for (int i = 0; i < NBR_D_OEUFS; i += 1) {
oeufsX[i] = random(0, gb.display.width());
oeufsY[i] = random(-40, -OEUF_HAUTEUR); // Au dessus de l'écran
}
nourriture = 300;
}
void loop() {
while (!gb.update());
entrees();
miseAJour();
affichage();
}
entrees.ino
void entrees() {
if (gb.buttons.repeat(BUTTON_LEFT, 0) && panierX > 0) {
panierX -= 2;
}
else if (gb.buttons.repeat(BUTTON_RIGHT, 0) && panierX < gb.display.width()) {
panierX += 2;
}
}
miseAJour.ino
void miseAJour() {
// La faim fait doucement baisser notre nourriture dans la panier
nourriture--;
panierLargeur = nourriture / 20;
if (nourriture <= 0) { // Somme nous mort de faim??
nbrDeCarottes = 0; // Reset les carottes
score = 0; // Recommencer le jeu
nourriture = 300; // Reset nourriture
for (int i = 0; i < NBR_D_OEUFS; i += 1) {
oeufsX[i] = random(0, gb.display.width());
oeufsY[i] = random(-40, -OEUF_HAUTEUR); // Au dessus de l'écran
}
}
// Eggs
for (int i = 0; i < NBR_D_OEUFS; i += 1) {
oeufsY[i] += 1;
// Collisions
if (gb.collide.rectRect(panierX - panierLargeur / 2, PANIER_Y, panierLargeur, PANIER_HAUTEUR, oeufsX[i], oeufsY[i], OEUF_LARGEUR, OEUF_HAUTEUR)) {
score += 1;
if (score > highscore) {
highscore = score;
}
nourriture = nourriture + 20; // MMmmmmm des oeufs
// Ajouter des carrotes. Sans dépasser le plafond
nbrDeCarottes = min(score / 5, NBR_MAX_DE_CAROTTES);
// Reset l'oeuf
oeufsX[i] = random(0, gb.display.width());
oeufsY[i] = random(-40, -OEUF_HAUTEUR); // Au dessus de l'écran
}
// Verifier que la carotte ne soit pas sortie de l'écran
if (oeufsY[i] >= gb.display.height()) {
// Reset l'oeuf
oeufsX[i] = random(0, gb.display.width());
oeufsY[i] = random(-40, -OEUF_HAUTEUR); // Au dessus de l'écran
}
}
// Carottes
for (int i = 0; i < nbrDeCarottes; i += 1) {
carottesY[i] += 2;
// Collisions avec le joueur
if (gb.collide.rectRect(panierX - panierLargeur / 2, PANIER_Y, panierLargeur, PANIER_HAUTEUR, carottesX[i], carottesY[i], CAROTTE_LARGEUR, CAROTTE_HAUTEUR)) {
nourriture -= 40; // Allergie => moins de nourriture :(
// Reset la carotte
carottesX[i] = random(0, gb.display.width());
carottesY[i] = random(-20, -CAROTTE_HAUTEUR); // Au dessus de l'écran
}
// Verifier que la carotte ne soit pas sortie de l'écran
if (carottesY[i] >= gb.display.height()) {
// Reset la carotte
carottesX[i] = random(0, gb.display.width());
carottesY[i] = random(-20, CAROTTE_HAUTEUR); // Au dessus de l'écran
}
}
}
affichage.ino
void affichage() {
gb.display.clear();
// Eggs
gb.display.setColor(BROWN);
for (int i = 0; i < NBR_D_OEUFS; i += 1) {
gb.display.fillRect(oeufsX[i], oeufsY[i], OEUF_LARGEUR, OEUF_HAUTEUR);
}
// Carrots
gb.display.setColor(ORANGE);
for (int i = 0; i < nbrDeCarottes; i += 1) {
gb.display.fillRect(carottesX[i], carottesY[i], CAROTTE_LARGEUR, CAROTTE_HAUTEUR);
}
// Player
gb.display.setColor(WHITE);
gb.display.fillRect(panierX - panierLargeur / 2, PANIER_Y, panierLargeur, PANIER_HAUTEUR);
// Score
gb.display.setColor(WHITE);
gb.display.setCursor(gb.display.width() - 8, 0);
gb.display.print(score);
gb.display.setColor(RED);
gb.display.setCursor(gb.display.width() - 8, 8);
gb.display.print(highscore);
}
Par Julien Giovinazzo