Partage

Pong c++ / sfml

Pong c++ / sfml

Anonyme
3 avril 2016 à 16:59:59

Salut 

Ce topic est la suite de celui ci : https://openclassrooms.com/forum/sujet/quelques-questions-jeux-c

Pour faire un résumer court , l'autre sujet traité de questions afin de réaliser un premier jeux à l'aide du c++ et d'une librairie externe.

hs: Je remercie particulièrement @blackProgrammeur et @Ksass`Peuk pour le temps qu'ils ont pris pour me répondre et me venir en aide.

Chose "faite" j'ouvre un nouveau sujet car c'est un autre thème que je vais aborder ici. Donc comme marqué dans le titre le premier jeux que j'ai tenté de reproduire est le Pong, après avoir bien galéré j'ai réussi à faire quelque chose de potable selon moi mais j'aimerais avoir des retours afin de corriger le code et assimiler une bonne approche lors de la conception d'un programme car le principal problème que je rencontre c'est qu'il y a 100 façon de faire un programme mais comment choisir la bonne afin d'obtenir un programme stable et évolutif. D'ailleurs je compte bien faire évoluer le pong.

Pour consulter le code-source du pong : https://github.com/Chaanks/First-Pong

J'ai eu un premier retour de @Ksass`Peuk   sur l'ancien sujet où il me link un code différent mais ayant répondu par message privé il m'a conseillé de poser mes questions sur le sujet afin d'avoir plusieurs avis et de pouvoir en faire bénéficier tout le monde, du coup je re poste ici.

1.Quand tu parles de séparé la partie logique et graphique je pensé qu'il ne fallait pas utilisé la librairie SFML à l'intérieur de mes classes , uniquement dans le main ?

2.Les enum j'ai pas bien vu j'irais me documenter ,  concernant   les 3 méthodes je ne comprend pas le fonctionnement et pourquoi créer des objets dans une classe ( pour gérer les déplacements dans le pong.cpp ? ) .

3.à quoi sert le update()  quand on utilise une boucle de jeux comme dans mon code  ? De même utilisé le déplacements grâce aux frames est t-il vraiment moins bien que par rapport au temps (sf::clock) ?

4.à partir du main je suis perdu j'ai l'impression de n'avoir rien appris, même si j'arrive a voir le fonctionnement je ne comprend presque rien pourrais-tu détaillé un peut plus ?

class Pong{
public:
  enum class Pad { LEFT, RIGHT };
   
  void give_controller (Pad p, Controller& c){
    c.control ( (p == Pad::LEFT) ? left : right );
  }
  void give_paddle_viewer (Pad p, PaddleViewer& pv) const {
    pv.show( (p == Pad::LEFT) ? left : right );   
  }
  void give_ball_viewer (BallViewer& bv) const{
    bv.show( ball );  
  }
   
  void update();
   
private:
  Paddle left;
  Paddle right;
  Ball ball;
};
 
int main(){
  Pong pong { /* params */ };
   
  //c'est pong viewer qui va faire les appels à "give_<truc>_viewer"
  Viewer pong_viewer{ pong };
   
  Keyboard_pong_controller( pong_viewer.window(), /*touche haut*/, /*touche bas*/ );
  auto must_continue = [&Keyboard_pong_controller](){ Keyboard_pong_controller.must_continue(); };
  pong.give_controller(Pong::Pad::LEFT, Keyboard_pong_controller);
   
  IA_controller ia { pong };
  pong.give_controller(Pong::Pad::RIGHT, ia);
   
  while(must_continue()){
    Keyboard_pong_controller.action();
    ia.action();
     
    pong.update();
     
    pong_viewer.update_graphics();
  }
}



Je suis impressionné par le c++ j'ai réussi à faire un programme de moi même sans rien copier où je comprenais ce que je faisais et la le programme fait la même chose plus ou moins mais je suis perdu complet o_O c'est frustrant.

Merci d'avance à ceux qui participeront

-
Edité par Anonyme 3 avril 2016 à 17:01:45

3 avril 2016 à 17:11:34

Lu'!

1. C'est une possibilité, mais je préfère l'idée que le jeu hors graphismes/contrôles soit le programme principal, car c'est la partie qui n'est pas interchangeable : le jeu c'est le jeu. Dans le code que je propose, on trouvera la SFML à deux endroits : dans Viewer et les classes qu'il utilisera sûrement en interne, et dans Keyboard_pong_controller (que j'ai oublié de nommer pour l'instance dans le pseudo code que j'ai écris).

2. C'est la classe pong qui va s'assurer que ses objets paddle et ball ne font pas de connerie, et c'est également elle qui va s'occuper de faire le déplacement de la balle. Et de la cohérence de ce déplacement par rapport aux raquettes.

3. Le update que j'ai placé a pour objectif, suite aux déplacements potentiels des raquettes, de faire bouger la balle et de contrôler son éventuelle collision avec le bord ou encore avec les raquettes et de faire évoluer son mouvement en conséquence.

4. Cela reste du pseudo code. Mis à part le fait que j'ai oublié de donner un nom au contrôleur, la seule chose qui pourrait éventuellement te poser problème c'est la lambda. Et dans ce cas, tu peux simplement virer cette ligne :

auto must_continue = [&Keyboard_pong_controller](){ Keyboard_pong_controller.must_continue(); };

et réécrire le while comme ça :

while(Keyboard_pong_controller.must_continue()){

C'est exactement la même idée.

RTFM [C++][FaqC++][Boost][Qt] "Tout devrait être rendu aussi simple que possible, mais pas plus." Einstein. ZesteDeSavoir: SDZ Reborn.

Pong c++ / sfml

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
  • Editeur
  • Markdown