[C++] Création d'un Point & Click

Résolu/Fermé
Crazy Legs Messages postés 635 Date d'inscription jeudi 10 avril 2008 Statut Membre Dernière intervention 27 septembre 2016 - Modifié par Crazy Legs le 8/07/2010 à 09:38
Crazy Legs Messages postés 635 Date d'inscription jeudi 10 avril 2008 Statut Membre Dernière intervention 27 septembre 2016 - 9 juil. 2010 à 15:53
Bonjour, je suis en équipe sur un projet de jeu point & click à la Machinarium, je dois le coder en C++ avec la SDL.

Bon je vais essayer d'être le plus clair possible ; ma question est :

"Comment programmer le plus aisément ?"

J'ai plusieurs solutions mais je ne sais pas comment m'y prendre :

1. Soit je crée une classe globale Game contenant toutes les classes d'un jeu point & click (Sprites, Personnage, Room, Dialogue, Item, j'en passe...) afin d'insérer un pointeur SDL_Surface attribut contenant l'écran où je blitterai toutes mes image au fur et à mesure...

2. Soit je crée les classes précédentes à part et indépendantes entre elles, mais le problème c'est qu'il faut un pointeur SDL_Surface et donc à n'importe quelle fonction je serai toujours obligé de l'envoyer en paramètre, ce qui peut être lourd et ennuyeux).

3. Est-ce que dans ce genre de cas un pointeur globale est nécessaire ? Y aurais-je accès à toutes les méthodes ?

Ce qui me fait bien sûr penser à ça c'est pour maximiser à fond l'orientation objet du main.cpp et faire en sorte que la SDL soit gérer toute seule dans les méthodes.

Je sais pas si je suis clair dans mon explication, si vous voulez des précisions n'hésitez pas :)

Merci, à bientôt.



J'aide les personnes qui ont un problème dans certaines sections du forums.
A voir également:

16 réponses

Crazy Legs Messages postés 635 Date d'inscription jeudi 10 avril 2008 Statut Membre Dernière intervention 27 septembre 2016 98
Modifié par Crazy Legs le 8/07/2010 à 11:52
Oula je vois pas pourquoi tu te braques ?

Déjà je suis justement en phase de découpage cad j'essaye d'imaginer tout ce que je vais avoir besoin avant de programmer, j'ai déjà commencé certes et c'est comme ça que ma question s'est créée.
J'ai pas dit non plus que j'avais besoin de plus de 5 arguments, effectivement j'en aurai besoin de 3 ou 4 maximum, mais le fait de devoir mettre à chaque fois l'écran me fais dire : "tiens on a un récurrence du même paramètre pour 50 fonctions, c'est louche !".

Pour te faire une image de mon interrogation, je préfère en math avoir une équation factorisée x(2a + 3b) plutôt que 2ax + 3bx ; {x est écran, 2 et 3 sont les fonctions et a et b sont les paramètres} ; c'est une philosophie de programmation, après c'est peut être moins bon je sais pas c'est pour ça que je demande.

Je n'ai aucunement dit que c'est de la programmation de porc de faire comme tu m'as dit, moins propre signifiait que ça me dérangeait de procéder de cette manière, mais que théoriquement y a clairement aucun problème.

Et je sais très bien qu'il faut l'écran pour blitter, sinon je n'aurais logiquement pas posé cette question !

Pour contrer ton expression, je dirai simplement qu'il est évident d'avoir l'assiette pour avoir les aliments, mais on peux autant manger dans le salon que dans les chiottes, tout dépend du confort que l'on veut se donner !!!
J'aide les personnes qui ont un problème dans certaines sections du forums.
1
matthoffman Messages postés 405 Date d'inscription lundi 24 mars 2008 Statut Membre Dernière intervention 22 janvier 2013 47
Modifié par matthoffman le 8/07/2010 à 09:02
Bonjour,

Je ne suis pas sur de saisir ton dilemne la... En gros tu hesites entre une implantation statique ou dynamique c'est bien ca ?

Dans un cas tu utilises la POO, dans l'autre cas tu la simules quoi .

Une autre chose: tout ce qui est variable globale c'est le mal !!
0
Crazy Legs Messages postés 635 Date d'inscription jeudi 10 avril 2008 Statut Membre Dernière intervention 27 septembre 2016 98
Modifié par Crazy Legs le 8/07/2010 à 09:36
On peut faire du dynamique avec le C/C++ ? o_O

En fait mon point faible c'est le pointeur SDL_Surface*, prenons un exemple :

int main() 
{ 
SDL_Surface *ecran; 

Personnage *cHeros; 
cHeros.SetFrame("frame01.PNG"); 
cHeros.Visible(true); 

if(cHeroe.isVisible()) 
{ 
cHeros.afficherDansLaRoom(ecran);
} 
} 

/// Personage.h /// 

Personnage::afficherDansLaRoom(SDL_Surface *ecran) 
{ 
   // CODE 
} 


L'exemple montre bien que je suis obligé d'ajouter à chaque fois en paramètre la variable ecran afin d'opérer les modification de l'écran.

Mais sinon au lieu d'opérer "à distance" il pourrait suffire de mettre cela en place dans les évènements ? Ça serait pas bête !

Genre :

int main() 
{ 
SDL_Surface *ecran; 

Personnage *cHeros; 
cHeros.SetFrame("frame01.PNG"); 
cHeros.Visible(true); 

SDL_WaitEven(SDL_Event event) 
  switch(event.type) 
  { 
    // code. 
  } 

if(cHeros.isVisible) SDL_BlitSurface .... 

//Code 
}


En gros tout ce qui touche à la SDL doit être traiter dans le main, et généralement dans la phase d'évènement, cela risque d'être bien rempli cependant, mais je trouve que ça comme solution.
J'aide les personnes qui ont un problème dans certaines sections du forums.//
0
matthoffman Messages postés 405 Date d'inscription lundi 24 mars 2008 Statut Membre Dernière intervention 22 janvier 2013 47
8 juil. 2010 à 10:01
Euuuh ba si tu utilises un pointeur qui pointe sur ta classe, pour moi, tu es en dynamique ... ;).

Et je vois pas ton probleme, (et de toute facon tu n'as pas le choix car si tu veux blitter il te faut l'ecran), ca te fais quoi d'avoir UN parametre a chaque fois ? C'est pas comme si t'en avais 20 par fonctions ^^.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Crazy Legs Messages postés 635 Date d'inscription jeudi 10 avril 2008 Statut Membre Dernière intervention 27 septembre 2016 98
Modifié par Crazy Legs le 8/07/2010 à 11:09
OK.
Ben ça fait pas très propre ? Si ? En plus ça sera pas tout le temps UN paramètre, mais UN DE PLUS à mettre...

Je vais essayer ma méthode et je verrai.
Merci.

Si quelqu'un d'autre à une suggestion, qu'il n'hésite pas ;)

J'aide les personnes qui ont un problème dans certaines sections du forums.
0
matthoffman Messages postés 405 Date d'inscription lundi 24 mars 2008 Statut Membre Dernière intervention 22 janvier 2013 47
Modifié par matthoffman le 8/07/2010 à 12:43
En fait la methode pas propre c'est de le faire avec les events, mais bon fais le si tu veux, mais supposons t'as un probleme vers les 3/4 de ton projet et qu'il te faut trouver une solution, tu vas bien galerer que si tu auras au prealable decouper ton code.

Et normalement non tu ne devrais pas depasser 5 parametres dans ton projet par fonction (et encore j'ai pris large, il s'agit plutot de 2 ou 3 parametres).

Et ca n'as jamais ete code de porc de donner ta variable ecran en parametre puisque tu en a besoin pour blitter des choses dessus ... O_o
Sinon tu m'explique comment tu vas appeller les fonctions de SDL_BlitSurface() sans avoir acces a ton ecran ??? ^^

NB: Pour manger dans une assiette, avoir l'assiette est une necessite ;)
0
matthoffman Messages postés 405 Date d'inscription lundi 24 mars 2008 Statut Membre Dernière intervention 22 janvier 2013 47
8 juil. 2010 à 12:40
Lol t'en fais pas je ne me braque pas ^^.

Et je comprends un peu ton point de vu sur le fait de le repeter 50 fois, et bien sur que moi aussi je le fais quand on peut le faire.

Mais juste c'est le principe du decoupage de code, le fait de decouper te contraint forcement ( je vois pas dans quel autre programme, language, ou principe tu fais differemment ^o) ) a donner en parametre les variables que tu utilises...

En fait c'est juste ta question que je trouve bizarre, parce que tu parles comme si c'etait faisable, ou que tu l'avais deja fait. Et si tel est le cas, alors je veux bien apprendre, ca aurait bien embelli tous mes precedents projets ^^ !

NB: si tu te trimballes dans les chiottes ou le salon sans ton assiette, alors tu ne mageras pas dans l'assiette ;)
XD
0
Crazy Legs Messages postés 635 Date d'inscription jeudi 10 avril 2008 Statut Membre Dernière intervention 27 septembre 2016 98
Modifié par Crazy Legs le 8/07/2010 à 12:56
Bon ok alors tout va bien.
Eh bien alors je t'explique, je programme beaucoup avec le logiciel AGS qui permet de créer des jeux point & click, sauf que le logiciel s'est avéré avoir trop de limite donc on a préféré choisir de programmer avec un langage : C++.

Et là tu te doute bien de ce que je vais te dire : quand on voulais afficher un personnage à l'écran, il suffisait juste d'écrire :

cPersonnage.Visible(true);

Comme tu peux le constater, pas de variable SDL_Surface dans les paramètres.
J'en ai (peut être trop hâtivement) conclu qu'il était possible de reproduire cette méthode, étant bien plus souple et efficace. Et je pense que pour ce faire, il faut englober cPersonnage (enfin... la classe Personnage) dans une classe plus grande -> Game et d'ajouter ce fameux pointeur en tant qu'attribut à la classe, ainsi non seulement on évite d'ajouter le paramètre, mais en plus il suffit d'ajouter les autres classe énumérées plus haut pour appliquer cette astuce pour tous les éléments.

Je suis sûr que c'est possible. En faite ma question n'est pas : que dois-je faire ? Mais : comment dois-je faire ?
Sachant donc que d'un cas ya le même argument, de l'autre ça pourrait compliquer le codage.

Allez un petit exemple :

Ta méthode :

  
Perso1.afficher(ecran);   
chaise.afficher(ecran);   
gui.afficher(ecran);   
textes.afficher(ecran);   


Ma méthode :

game.afficherPersos();   
game.afficherItems();   
game.afficherTextes();   
game.afficherObjets();  


Est-ce que tu comprends what I said ?

J'aide les personnes qui ont un problème dans certaines sections du forums.
0
matthoffman Messages postés 405 Date d'inscription lundi 24 mars 2008 Statut Membre Dernière intervention 22 janvier 2013 47
Modifié par matthoffman le 8/07/2010 à 14:18
Ouais ok je comprends je faisais la meme chose avec les forms en delphi.

Une petite question: quand tu utilisais ton logiciel AGS, tu explotais toi meme une librairie graphique ou c'etait le logiciel qui gerait ca tout seul sans que tu t'en charge ?

Et dans afficherPersos() par exemple, tu utilisais pas une librairie systeme te permettant de specifier l'ecran ?
0
Crazy Legs Messages postés 635 Date d'inscription jeudi 10 avril 2008 Statut Membre Dernière intervention 27 septembre 2016 98
8 juil. 2010 à 14:18
Le logiciel gérait tout seul et tout ce qui est graphique et sonore, je sais même pas si AGS utilise la SDL vu qu'on touche à aucune lib !
0
matthoffman Messages postés 405 Date d'inscription lundi 24 mars 2008 Statut Membre Dernière intervention 22 janvier 2013 47
8 juil. 2010 à 14:22
Ouais ok ba c'est pour ca, le logiciel integrait lui meme ses bibliotheques et grace a des fonctions tu faisais appels a d'autres fonctions de plus bas niveau.

Le probleme la c'est que tu codes en bas niveau, donc bon je ne dis pas avoir la science infuse, mais je ne pense pas (j'en suis meme sur) que tu puisses faire comme ca.
0
Crazy Legs Messages postés 635 Date d'inscription jeudi 10 avril 2008 Statut Membre Dernière intervention 27 septembre 2016 98
8 juil. 2010 à 14:32
Voilà c'est exactement ça, et c'est ce que je voulais reproduire un petit peu de manière à manipuler le moins possible la SDL dans le main.c
Parce que n'étant pas seul dans le projet, j'ai pas envie que les programmeurs ne comprennent pas telles ou telles fonction sur cette lib...
0
matthoffman Messages postés 405 Date d'inscription lundi 24 mars 2008 Statut Membre Dernière intervention 22 janvier 2013 47
8 juil. 2010 à 14:48
Ouais c'est sur que ca serait le top... mais bon d'un autre cote, c'est justement parce que c'est du bas niveau que le C/C++ est excellent, t'as vachement plus de libertes :).

En tout cas bon courage ;).

PS: normalement dans ton main.c tu le manipule juste pour appeler la fonction d'une partie entiere, donc ca devrait le faire, un truc du style

loop{
moteur graphique()
moteur physique()
...
}
0
Crazy Legs Messages postés 635 Date d'inscription jeudi 10 avril 2008 Statut Membre Dernière intervention 27 septembre 2016 98
9 juil. 2010 à 07:40
Salut, juste pour dire que j'ai eu une autre réponse dans Hardware.fr qui me conseillait de ne gérer les sprites qu'avec cette classe (Sprites) et que ce serait que le Game et non pas chaque méthodes graphiques des classes qui s'en chargeraient de les afficher à coups de blit().

Donc, je savais bien qu'il y avait mieux à faire ! ^^
0
matthoffman Messages postés 405 Date d'inscription lundi 24 mars 2008 Statut Membre Dernière intervention 22 janvier 2013 47
Modifié par matthoffman le 9/07/2010 à 13:39
Euuh tu vas pas pouvoir tout afficher en meme temps (items + perso + je sais pas quoi) avec une seule fonction.

Je vois pas en fait tu peux etre plus precis stp (pour la solution donnee)

En gros d'apres ce que je comprends de ton post, il y a un moyen de faire

Game {
Afficher_tous_sprites(ecran, tous_les_sprites)
}

Sprites{
items;
perso;
texte;
}

Et si c'est le cas je suis curieux de savoir la fonction "afficher_tous_sprites"
0
Crazy Legs Messages postés 635 Date d'inscription jeudi 10 avril 2008 Statut Membre Dernière intervention 27 septembre 2016 98
9 juil. 2010 à 15:53
Non pas une fonction mais plusieurs, mais encore mieux, grâce au type itérator me permettant d'accéder à tous les éléments créés d'une classe (ce que je n'ai pas appris malheureusement) et donc, par le moyen d'une boucle, donc de nombreuses fonctions (une pour chaque élément) mais codées de manière très efficace.

Game est une classe contenant les fonction afficher en somme et seulement elle gère ce qui est graphique donc seule elle possède la SDL.
0