Bonjour à tous,

Je suis en train de créer un jeu de plate-forme largement inspiré de Mario, en fait j'ai même pour but de coller au plus au jeu original, que ce soit au niveau de la maniabilité, de la physique ou des graphismes.

Voilà mon problème : à force de bidouiller, de rajouter des fonctionnalités, de faire des combines à 3 francs pour que telle où telle chose ne bug plus, des "if else if" par centaine"s", j'en suis arriver à un code qu'on qualifierait de pourri (à moins qu'il y ai un qualificatif plus fort que pourri ).

Bien que ce soit un problème purement conceptuel, je me permet de poster dans le forum SDL car une des raisons pour lesquelles mon code est illisible (si, personnellement j'ai du mal) est que je n'arrive pas a visualiser comment séparer ma partie affichage du reste du code. Il en résulte que des SDL_qqch trainent un peu partout dans mes classes.

Un exemple simple sur lequel je bloque : ma classe cPlayer s'occupe de calculer la position du personnage et différente variable sur son état ensuite je veux l'afficher en fonction de ses paramètres calculés :

dans mon cas j'exécute la fonction Draw contenu dans ma classe cPlayer :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
void cPlayer::Draw(SDL_Surface *screen, int xCamera, int yCamera);
{
	coord.x = int(x) - xCamera;
	coord.y = int(y) - yCamera;
 
	clip.x = pos * width; //pos équivaut à la position sur la feuille de sprite et width est la largeur du sprite
 
	if ( SDL_BlitSurface(player, &clip, screen, &coord) < 0 )
		fprintf(stderr, "Blit failed: %s\n", SDL_GetError());
}
Mais là c'est pas bon donc, j'aimerais que la classe player soit détachée de toute fonction d'affichage, et j'ai du mal a voir comment faire passer ses paramètres proprement dans une fonction d'affichage...

dans ma tête ca donne ca :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
int main (int argc, char** argv)
{
	cEngine engine;
	cPlayer player;
 
	/* Création de la map, des collisions */
 
	while(!engine.end)
	{
		engine.Event();
		...
		/* Calcul map, camera, collisions, joueur  */
		...
		engine.DrawSprite(player.GetX(), player.GetY(), player.GetWidth(), player.GetPos(), "mario.bmp", etc ... 
		// A n'en plus finir si je veux faire une fonction très générique
	}
	engine.Quit();
}
Mais je trouve ça lourd par rapport à une fonction Draw(...) comme au dessus, avec toute les variable initialisées avec le constructeur de classe.

Un autre exemple où j'ai du mal : j'utilise (et abuse surement) de SDL_GetTicks() dans ma classe player, or comment récupérer ce timer si je n'utilise pas SDL dans ma classe cPlayer... (encore dans le main ?)

Donc ma question finale (enfin ! ) :

Comment s'y prend t'on pour garder un code organisé (d'un jeu video plus spécifiquement), sachant qu'il faut bidouiller tout le temps, faire des tests, ajouter moultes fonctionnalités.

et

Y a-t'il un méthode classique pour séparer la partie affichage du reste ?
(je n'utilise pas vraiment les concepts de polymorphismes ni d'héritages, est-ce cela qu'il me manque ?)

Merci de m'avoir lu en tout cas ! et encore merci si quelqu'un a des éclaircicements à m'apporter.