trajectoire d'un objet

fabricelens

5 years ago

Bonjour, je suis actuellement sur la programmation d'un petit jeu de foot cependant je n'arrive pas lorsque le joueur à la balle au pied à tirer en faisant A j'arrive simplement a "teleporter" le ballon.

Merci d'avance pour votre aide.

#include <Gamebuino-Meta.h>
//variables boucle for
int i=0;
int speedx=1;
int counter=counter+1;
// Caracteristique de la balle
int balle_posx=38;
int balle_posy=30;
int balle_diametre=3;
// Caractéristiques du joueur
int joueur_posx = 5;
int joueur_posy = 27.5;
int corps_taillex=4;
int corps_tailley=10;
int tete_posx=joueur_posx+2;
int tete_posy=joueur_posy-3;
int tete_diametre=2;
int main_taillex=2;
int main_tailley=2;
int main_posx=joueur_posx+3;
int main_posy=joueur_posy+2;
int pied_taillex=2;
int pied_tailley=2;
int pied_posx=8;
int pied_posy=35.5;
void setup() {
  // MENU DU JEU:
gb.begin();
}
void loop() {
  // put your main code here, to run repeatedly:
while(!gb.update());
gb.display.clear();
  // Si la balle atteint le bord gauche


  gb.display.print("positionX: ");
  gb.display.print(balle_posx - balle_diametre);
   gb.display.print("\npositionX: ");
  gb.display.print(pied_posx);
int position_teteX=tete_posx;
int position_joueurX=joueur_posx;
int position_mainX=main_posx;
int position_piedX=pied_posx;
int position_balleX=balle_posx;
gb.display.setColor(BLUE);
gb.display.fillRect(joueur_posx,joueur_posy,corps_taillex,corps_tailley);
gb.display.setColor(WHITE);
gb.display.fillCircle(tete_posx,tete_posy,tete_diametre);
gb.display.fillRect(pied_posx,pied_posy,pied_taillex,pied_tailley);
gb.display.fillRect(main_posx,main_posy,main_taillex,main_tailley);
gb.display.setColor(WHITE);
gb.display.fillCircle(balle_posx,balle_posy,balle_diametre);

if(gb.buttons.repeat(BUTTON_UP,0)){
  main_posy=main_posy-1;
  pied_posy=pied_posy-1;
  joueur_posy=joueur_posy-1;
  tete_posy=tete_posy-1;
}
if(gb.buttons.repeat(BUTTON_DOWN,0)){
  main_posy=main_posy+1;
  pied_posy=pied_posy+1;
  joueur_posy=joueur_posy+1;
  tete_posy=tete_posy+1;
}
if(gb.buttons.repeat(BUTTON_LEFT,0)){
  main_posx=main_posx-1;
  pied_posx=pied_posx-1;
  joueur_posx=joueur_posx-1;
  tete_posx=tete_posx-1;
}
if(gb.buttons.repeat(BUTTON_RIGHT,0)){
  main_posx=main_posx+1;
  pied_posx=pied_posx+1;
  joueur_posx=joueur_posx+1;
  tete_posx=tete_posx+1;
}
while ((((balle_posx - balle_diametre)<= pied_posx) && ((balle_posx + balle_diametre)>= pied_posx)) && (((balle_posy - balle_diametre)<= pied_posy) && ((balle_posy + balle_diametre)>= pied_posy)))
{
    if   (gb.buttons.repeat(BUTTON_RIGHT,0)){
    main_posx=main_posx+1;
    pied_posx=pied_posx+1;
    joueur_posx=joueur_posx+1;
    tete_posx=tete_posx+1;
    balle_posx=balle_posx+2;
    }
      if   (gb.buttons.repeat(BUTTON_LEFT,0)){
    main_posx=main_posx-1;
    pied_posx=pied_posx-1;
    joueur_posx=joueur_posx-1;
    tete_posx=tete_posx-1;
    balle_posx=balle_posx-2;
    }
          if  (gb.buttons.repeat(BUTTON_UP,0)){
    main_posy=main_posy-1;
    pied_posy=pied_posy-1;
    joueur_posy=joueur_posy-1;
    tete_posy=tete_posy-1;
    balle_posy=balle_posy-2;
    }
          if   (gb.buttons.repeat(BUTTON_DOWN,0)){
    main_posy=main_posy+1;
    pied_posy=pied_posy+1;
    joueur_posy=joueur_posy+1;
    tete_posy=tete_posy+1;
    balle_posy=balle_posy+2;
    }
    gb.lights.fill(BROWN);
}
   if (((balle_posx - balle_diametre-1)== pied_posx) && ((balle_posx + balle_diametre)>= pied_posx))
{
 //  c'est à ce moment là que ca bloque
      if (gb.buttons.pressed(BUTTON_A)){    
      balle_posx=balle_posx += 15;
      gb.lights.clear();
      }
  }

}

Amaubi-wan

NEW 5 years ago

Bonjour !

(j'avoue n'avoir lu que la partie où vous galérez, donc j'espère ne pas me tromper) Vous pouvez peut-être écrire une boucle dans laquelle à chaque frame vous déplacez la balle de x pixels jusqu'à ce qu'elle arrive à destination (en faisant ça, cependant, tout le reste de l'écran sera freeze). Ou alors, vous pouvez écrire une fonction qui à n frames, déplace le ballon de x pixels, jusqu'à son arrivée à destination.

Codnpix

NEW 5 years ago

Bonjour, j'ai essayé de suivre le raisonnement de ton code, mais ce n'est pas évident de visualiser exactement ce que tu es en train de faire sans au moins un petit screenshot :).

Sur l'endroit ou ça bloque, de ce que j'ai vu le principal truc un peu bizarre qui m'a sauté aux yeux est "balle_posx=balle_posx += 15;"  Ce qui revient à dire "balle_posx = balle_posx = balle_posx + 15", ça ne semble pas très optimal à première vue, ou alors je n'ai pas compris ce que tu cherchais à faire. Je pense que juste "balle_posx += 15" suffirait.

Au niveau de la condition de position de la balle :" if (((balle_posx - balle_diametre-1)== pied_posx) && ((balle_posx + balle_diametre)>= pied_posx))". Sans voir c'est difficile de se rendre compte mais à vue de nez je dirai qu'il y a un petit problème logique. 

avec : "balle_posx - balle_diametre-1) == pied_posx " Tu spécifies le moment ou le bord gauche de la balle est sur la même ligne verticale que le pied du joueur.

et avec : "balle_posx + balle_diametre)>= pied_posx" Tu marques toutes les positions possibles de la balle dans la zone à droite du pied du joueur

Donc, je ne sais pas comment est censée pouvoir bouger la balle sur l'axe des Y, mais déjà entre les deux conditions qu'il y a ici il y en a au moins une d'inutile, et la 1ere condition d'égalité est assez dure à remplir car elle ne sera vraie que au moment précis ou les deux positions seront égales, et apparemment il faut que ça coïncide au moment ou on appuie sur le bouton A donc ça semble assez serré. Je pense qu'il y a moyen de trouver une écriture plus logique. Faire un schéma aide bien à solutionner ce genre de chose.


Sinon sur l'ensemble je pense que tu y verrais plus clair si tu créais des fonctions pour ranger un peu les différents comportements de ton programme plutôt que de tout enchaîner d'un coup dans loop(). Est-ce que tu as suivi les tutos de base dans "académie" sur le site (pong, casse brique...) ? Si non je te conseille d'y jeter un œil, il n'y en a pas pour très longtemps et ça aide vraiment bien à se clarifier les idées sur comment organiser proprement un programme (séparer les entrées, la mise à jour des données, l'affichage, etc). Et ça donne pas mal d'exemples simples de déplacement d'objets en fonction d'événements etc.

Autre chose que j'ai vu au niveau des variables : a priori ce n'est pas une très bonne idée de déclarer au niveau global les variables qui te servent à parcourir une boucle for, surtout si tu as plusieurs boucles dans ton programme, tu vas devoir leurs trouver un nom différent pour chacune et tu vas vite te perdre.

En principe on déclare le "i" directement dans l'initialisation de la boucle :  "for (int i = 0, i< une_certaine_valeur, i++) { //faire des trucs}. Du coup la durée de vie de cette variable n'ira pas plus loin que son utilité, à savoir juste le temps de parcourir la boucle. Au sinon tu les déclares dans la fonction qui contient ta boucle, selon ce que tu fais...

Un dernier truc dont je pense que ça pourrait te simplifier la vie : Il m'a semblé que ton joueur qui se déplace est découpé en plusieurs parties du corps avec chacune une position à traiter séparément pour chaque mouvement.  Je pense que tu pourrais utiliser un type de donnée personnalisé avec des "struct" par exemple  (http://www.cplusplus.com/doc/tutorial/structures/), ça te permettrait te manipuler tes morceaux de joueurs sous forme d'un seul objet !

J'espère que ça t'aidera un petit peu, bon courage !

fabricelens

5 years ago

Salut les gars, merci pour vos réponses. 

Je suis novice, j’ai bien suivi les tutos du site mais j’avoue ne pas m’y être attardé (faute de temps), j’ai préféré me lancer dans le grand bain direct. Par contre je pense que je vais suivre plus en détail ton tuto "Struct" ça peut être utile dans mon cas.

je ferai des captures d'écran demain dans la soirée.

Merci pour votre aide bonne soirée.


fabricelens

NEW 5 years ago

Codnpix Codnpix

Salut les gars, merci pour vos réponses. 

Je suis novice, j’ai bien suivi les tutos du site mais j’avoue ne pas m’y être attardé (faute de temps), j’ai préféré me lancer dans le grand bain direct. Par contre je pense que je vais suivre plus en détail ton tuto "Struct" ça peut être utile dans mon cas.

je ferai des captures d'écran demain dans la soirée.

Merci pour votre aide bonne soirée.


jicehel

NEW 5 years ago

Une petite erreur sur l'affichage de la pos_X de la balle : tu fais 

  gb.display.print("positionX: ");
  gb.display.print(balle_posx - balle_diametre);

mais c'est soit  balle_posx pour avoir le bord gauche de la balle soit balle_posx + balle_diametre pour avoir le bord droit

Pour ta balle tu dois avoir un marqueur qui te dit que ta balle est tirée. Par exemple ça peut être sa vitesse propre qui va décroître avec le temps. Quand tu tires, tu initialises cette vitesse mais si tu n'en utilises qu'un ce sera plus complexe pour tester si la balle doit suivre le pied du footballeur. Je te conseille de mettre aussi un marqueur balleaupied  0 ou 1 pour faciliter les choses.

      if ((gb.buttons.pressed(BUTTON_A)) && (balleaupied==1) ){    
      balle_vitesse = 15;
      balleaupied=0;
      gb.lights.clear();
      }

      Tu mets à jour après dans ta boucle la position de la balle :

      if (balleaupied==1) balle_posx= pied_posx+3;

     if (balleaupied==0) {

          balle_posx= balle_posx + balle_vitesse;

          balle_posx -= 1;  // en considérant que la balle perd 1 de vitesse, sinon ajuster

    }

Voilà, j'espère que ça t'aidera et oui la structure peut clarifier un peu ton code aussi.

En tous cas, tu as bien fait de poster pour que l'on puisse t'aider à démarrer ton jeu. En plus ce sera le premier jeu de foot sur la META  ;)


fabricelens

NEW 5 years ago

Salut Jicehel, j'ai ajouté 2 int avec balleaupied=1 et balle_vitesse=10

Puis j'ai ajouter tes if, ça commence a ressembler un peu a quelque chose 

Il me restera à faire le fond d’écran et de mettre des conditions de victoire :) enfin pour ma version "beta", ne vous attendez pas à jouer à FIFA sur GAMEBUINO de si tôt :) en tout cas tu m'as bien aidé et je vais m'entrainer sur les STRUCT également.

Bonne soirée la team j'essayerai de poster une video dés qu'il y aura de l'avancement.

jicehel

NEW 5 years ago

Super ;) Heureusement que tu ne nous fais pas un Fifa sur la META dès tes premiers essais, je me sentirais mal mais je suis content que tu es réussi à avancer et c'est la bonne méthode pour commencer: faire simple et compliquer progressivement pour voir ses progrès  ;)

sylvain

NEW 5 years ago

Super, ça avance ! Par contre, je serai super exigent sur l'implémentation d'une feature obligatoire : pouvoir tacler l'arbitre :D

jicehel

NEW 5 years ago

:D Là tu passe dans Blood sports...  :D