Exemple de tir avec la croix directionnelle

General

Nicolas

5 years ago

Bonjour à tous,

Je me casse un peu la tête sur quelque chose de pas trop difficile je pense :D J'ai envie de faire un "tir" en utilisant la croix directionnelle.

Quand j'appuie sur droite, cela lance un petit carré vers la droite. Et ainsi de suite sur les 4 directions.

Pour l'instant j'ai fais ça :

#include <Gamebuino-Meta.h>

int positionX = 40;

void setup() {
  gb.begin();
}


void loop() {
  while (!gb.update());
  gb.display.clear();

  gb.display.fillRect(positionX, 32, 1, 1);


  if (gb.buttons.pressed(BUTTON_RIGHT)) {
    positionX = positionX + 1;
    gb.sound.playOK();
    gb.lights.drawPixel(1, 1, WHITE);
  }


}

Mais cela fait bouger le carré de 1 à chaque pression sur la touche droite. Moi je souhaite que le carré parte d'un coup, avec une seule pression sur la touche droite (et pas à chaque pression).
Si je sors positionX = positionX + 1; du if (gb.buttons.pressed(BUTTON_RIGHT)) {} le carré part tout seul vers la droite au lancement du jeu :/

Si vous avez des conseils je suis preneur !

Merci 

deeph

NEW 5 years ago

Le code est bon mais il faut utiliser la fonction gb.buttons.repeat() qui est "non bloquante" (faite pour les appuis maintenus, au contraire de la fonction gb.buttons.pressed() que tu utilises ici).

Autrement tu peux abréger positionX = positionX + 1; en positionX++; (incrémentation de 1).

Nicolas

5 years ago

Merci pour ta réponse ! L'effet est mieux avec gb.buttons.repeat() mais je souhaite que le carré parte dans la direction avec seulement une seule pression sur la touche. Sans maintenir le doigt sur la touche :)

Nicolas

NEW 5 years ago

deeph deeph

Merci pour ta réponse ! L'effet est mieux avec gb.buttons.repeat() mais je souhaite que le carré parte dans la direction avec seulement une seule pression sur la touche. Sans maintenir le doigt sur la touche :)

Sorunome

NEW 5 years ago

The idea is to store in a variable where you are going currently. For example you could do something like this:

int8_t direction = -1; // no direction
// 0 for right
// 1 for down
// etc.

void loop() {
  if (gb.buttons.pressed(BUTTON_RIGHT)) {
    direction = 0; // right
  }

  switch(direction) {
    case 0:
      positionX++;
      break;
    case 1:
      // walk down
      break;
  }

  gb.display.fillRect(positionX, 32, 1, 1);
}

jicehel

NEW 5 years ago

Oui et si tu as plusieurs tirs, tu dois faire un tableau avec les directions des tirs respectifs et à chaque cycle, tu balayes le tableau et tu incrémente chaque position selon sa direction.

Nicolas

NEW 5 years ago

Ok merci pour vos retours ! Je pensais pas que c'était si "compliqué" :)


Aurélien Rodot

5 years ago

Tu vas devoir stocker la position de ton "carré" en cours de vol, cf PONG dans l'Académie. Tu peux ajouter une variable pour stocker s'il est actif ou non. Lorsque tu tires, tu l'actives et du mets ses variables de vitess vx et vy de sorte à ce qu'il parte dans la bonne direction. Dès qu'il sort de l'écran ou qu'il touche un obstacle, tu le désactives.

C'est beaucoup plus simple si tu choisis de n'en n'avoir qu'un à la fois. Dans un second temps, Si tu veux pouvoir en avoir plusieurs qui existent en même temps, tu peux continuer les tutos de l'académie jusqu'à 202 attrap'oeuf pour voir comment utiliser les tableaux :)

Aurélien Rodot

NEW 5 years ago

Nicolas Nicolas

Tu vas devoir stocker la position de ton "carré" en cours de vol, cf PONG dans l'Académie. Tu peux ajouter une variable pour stocker s'il est actif ou non. Lorsque tu tires, tu l'actives et du mets ses variables de vitess vx et vy de sorte à ce qu'il parte dans la bonne direction. Dès qu'il sort de l'écran ou qu'il touche un obstacle, tu le désactives.

C'est beaucoup plus simple si tu choisis de n'en n'avoir qu'un à la fois. Dans un second temps, Si tu veux pouvoir en avoir plusieurs qui existent en même temps, tu peux continuer les tutos de l'académie jusqu'à 202 attrap'oeuf pour voir comment utiliser les tableaux :)