MOTEUR 3D ISOMÉTRIQUE EN OPENGL

Mattpbem Messages postés 46 Date d'inscription vendredi 14 janvier 2005 Statut Membre Dernière intervention 31 juillet 2006 - 11 sept. 2005 à 19:12
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008 - 28 sept. 2006 à 13:05
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/33750-moteur-3d-isometrique-en-opengl

cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
28 sept. 2006 à 13:05
PUISSANT ! :D
sasuk13 Messages postés 2 Date d'inscription mercredi 27 septembre 2006 Statut Membre Dernière intervention 27 septembre 2006
27 sept. 2006 à 21:12
svp je cherche des personne pour créer un mmorpg en 3d isometrique ajouter moi sasuk13@hotmail.fr
Mattpbem Messages postés 46 Date d'inscription vendredi 14 janvier 2005 Statut Membre Dernière intervention 31 juillet 2006
9 juil. 2006 à 22:07
j'ai crée un nouveau moteur 2.5d
il fonctionne en perspective dimétrique et permet l'inclinaison et la rotation ainsi que le loading des textures en tga,png & jpg
allez le voir sur : http://www.cppfrance.com/code.aspx?ID=38507
Mattpbem Messages postés 46 Date d'inscription vendredi 14 janvier 2005 Statut Membre Dernière intervention 31 juillet 2006
9 oct. 2005 à 14:17
le code a été un millier de fois et pas une seule note T_T
sinon le le rar c'est http://matt2000.free.fr/All.rar faut pas oublier la majuscule
Mattpbem Messages postés 46 Date d'inscription vendredi 14 janvier 2005 Statut Membre Dernière intervention 31 juillet 2006
7 oct. 2005 à 16:01
J'ai essayé le programme avec GLUT,SDL,WINAPI et ca ne marche toujours pas(le projet est maintenant multi-Librairie, il n'y a qu'un define à changer pour utiliser une autre librairie) alors que l'ancienne version qui est en lien sur le zip marche : la nouvelle addresse est http://matt2000.free.fr/all.rar il y a aussi d'autres zips qui ne reprennent que les DLLs ou le Programme seul
Mattpbem Messages postés 46 Date d'inscription vendredi 14 janvier 2005 Statut Membre Dernière intervention 31 juillet 2006
2 oct. 2005 à 13:39
le zip est devenu trop gros : il est maintenant disponible sur :
http://matt2000.free.fr/prog/SGT.zip
la version avec gLUT ne marche pas : ce serai bien si quelqu'un pouvait m'aider et me dire Pourquoi ???
kami_kenjin Messages postés 1 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 11 mai 2007
21 sept. 2005 à 07:42
lol. J'aime bien ce site. Je débute dans le code en C dans mes études, mais à mon avis ça ne suffira pas. Je vais m'y mettre dès à présent. Vous avez des bon tuyaux à me présenter ? ;)
Des sources faciles pour le moment avec des commentaires et tout ?

Merci beaucoup ;)
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
18 sept. 2005 à 00:02
A priori il n'y a pas de problème de compatibilité glut / opengl, puisque glut se contente d'ouvrir une fenêtre. Tiens nous au courant ^^.
Mattpbem Messages postés 46 Date d'inscription vendredi 14 janvier 2005 Statut Membre Dernière intervention 31 juillet 2006
17 sept. 2005 à 20:35
merci beaucoup kirua ! j'ai pas eu internet pendant quelque jours et depuis le temps j'ai crée un fichier main.h pour mes constantes et j'ai verifié mes includes, je vais faire avec les <c...>, j'avais déja tout remplacé par des enums : vu que j'ai recupéré des morceaux de codes certains commentaires ne sont pas de moi (ex: la def du PI): en ce moment j'ai un petit probléme : j'ai voulu utiliser la creation de Windows de Glut et ces callbacks, le code compile bien mais il ne m'affiche plus que le clearcolor à l'ecran,je connais pas trés bien glut alors je me demande si il arrive bien a travaillé avec les fonctions OpenGl de base. je ne suis pas sur Internet avec le même disque dur que celui oû il y a le code (à cause d'un probléme Internet) mais je vais essayer de l'updater dans la semaine à suivre
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
12 sept. 2005 à 22:25
Mouarf, ben oui je suis en vacances, mais ceci dit, je fais plein de choses, tjs mille projets en cours, ah et puis ma vie sociale aussi ;). Ceci dit, pour une raison ou une autre, j'ai pas pu ne pas dire tout ça ... il a 14 ans, et il fait les mêmes fautes que moi à son âge ^_^ ça a dû m'attendrire :D.
Et toi, des projets en cours? Dans quelques mois on se revoit à Lille ;) J'espère que les dates tomberont bien ...
MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 1
12 sept. 2005 à 22:21
Kirua t'en vacances ? T'as pas de projet ? T'as fais pleins de bétises et tu veux te faire pardonner ?
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
12 sept. 2005 à 19:47
un dernier et puis je regarde plus ton code ;)

if (up==true) { Scroll(0,MOUSE_Y); }
if (down==true) { Scroll(s_height-1,MOUSE_Y); }
if (lft==true) { Scroll(0,MOUSE_X); }
if (rght==true) { Scroll(s_width-1,MOUSE_X); }

if (button[1]==true && lbutton == true && cursor.x<768) DrawMap(mapx,mapy,SABLE,TILE);
if (button[2]==true && lbutton == true && cursor.x<768) DrawMap(mapx,mapy,ARBRE,OBJECT);

if(up) suffit, car ce qui compte c'est la condition, et up est une condition en soi. pareil pour if(down), pareil pour if(button[1] && lbutton && ...)

et soit dit en passant, le 768 a rien à faire là, tu as déclaré les dimensions de l'écran en haut de fichier, utilise la variable "hauteur écran" (je connais plus le nom).
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
12 sept. 2005 à 19:39
je suis (presque) sincèrement désolé de multiplier les posts, mais tu as ça dans ton code:

void DrawCursor() {
glPointSize(8.0);
glPushMatrix();
glBegin(GL_POINTS);
glColor3f (0.0, 1.0, 1.0);
glVertex2f (cursor.x, cursor.y);
glEnd();
glPopMatrix();
}

bon, outre le fait que pour l'indentation c'est pas encore ça (^_^), c'est les push/pop matrix qui m'embêtent. pusher et poper la matrice c'est ce qu'on fait pour sauvegarder la matrice courante quand on veut la modifier provisoirement. or ici, tu ne modifies pas la matrice, donc t'as pas besoin de la sauvegarder. tu peux virer les push/pop, parce que c'est quand même pas bénin comme opération de copier une matrice, de l'empiler et puis de la dépiler pour rien. tu devrais aussi remettre le glPointSize à 1 je pense. si cursor.x / .y sont des int, tu dois faire ça:
glVertex2i et pas glVertex2f, mais j'ai pas vérifié, juste un soupçon. la lettre à la fin indique le type des paramètres, et f float, i entier (d = double d'ailleurs).


Et maintenant, une bonne grosse tarte à la crême du C :) l'erreur qu'on fait TOUS (aller, peut-être que john carmack ne l'a pas faite, et encore ... j'ai un sérieux doute):

char* color;
if(color=="white") ...

(dans glPrint())

ça ça va être un peu plus long à expliquer :D c'est archi faux en fait, mais t'en fais pas, tu comprendras obligatoirement plus vite que moi, c'est statistique ;).

color est un POINTEUR sur un caractère (char). "white" est une (désolé) "expression littérale constante" créée par le compilateur, rien que pour toi pour la comparaison. en gros, tu compares un pointeur (un entier, une adresse mémoire) avec qqch d'incompatible. pour une raison qui m'échappe, G++ ne gueule pas quand on écrit ça ... mais ce test est VOUÉ à retourner false à chaque fois. ce qu'il faut faire, c'est comparer les caractères de color (qui est l'adresse du premier élément d'un tableau de caractères en réalité) avec ceux de "white", et pour ça on écrit ceci:

strcmp(première chaine, deuxième chaine) == 0

si strcmp renvoie 0, c'est que les deux chaînes sont identiques, je te passe les détails. fais une recherche google pour voir l'usage.

bon, ça c'est la méthode C ... et strcmp se trouve dans l'en-tête <cstring> (ce qui n'a rien à voir avec #include <string>, fais gaffe ^^ string c'est l'en-tête standard C++).

J'ai pas trop envie de te parler de std::string ici, mais sache juste ceci: pour les couleurs comme ça, on va de préférence utiliser un enum, parce que c'est bcp bcp bcp plus rapide! comparer des chaînes de caractère c'est LENT, comparer des nombres, qui plus est des nombres constants, c'est rapide comme l'éclaire :)

enum EColor
{
BLEU, VERT, JAUNE, MAUVE, ROUGE, ...............
};

glPrint(float x, float y, EColor clr, double size, const char *string, ...)
{
switch(clr)
{
case BLEU: glColor4f(...); break;
case VERT ...
...
default: ...
}
}

voilà, t'as franchement beaucoup intérêt à faire comme ça :).

au fait:

if (color=="white") glColor3f(1.0f, 1.0f, 1.0f);
if (color=="red") glColor3f(1.0f, 0.0f, 0.0f);
if (color=="green") glColor3f(0.0f, 1.0f, 0.0f);
if (color=="blue") glColor3f(0.4f, 0.4f, 1.0f);
if (color=="yellow") glColor3f(1.0f, 1.0f, 0.0f);
if (color=="cyan") glColor3f(0.0f, 1.0f, 1.0f);
if (color=="purple") glColor3f(1.0f, 0.0f, 1.0f);

ça s'écrit comme ça:

if (color=="white") glColor3f(1.0f, 1.0f, 1.0f);
else if (color=="red") glColor3f(1.0f, 0.0f, 0.0f);
else if (color=="green") glColor3f(0.0f, 1.0f, 0.0f);
else if (color=="blue") glColor3f(0.4f, 0.4f, 1.0f);
else if (color=="yellow") glColor3f(1.0f, 1.0f, 0.0f);
else if (color=="cyan") glColor3f(0.0f, 1.0f, 1.0f);
else if (color=="purple") glColor3f(1.0f, 0.0f, 1.0f);
//et éventuellement:
else ... (cas par défaut)

bien sûr en remplaçant les color "..." par un strcmp() 0, ou plus classiquement if(!strcmp(...)).

j'espère que le message est passé :) jamais plus faire color == "..." ;)
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
12 sept. 2005 à 19:24
Euh, en fait c'est vraiment le bordel dans tes règles de lieur et dans tes include :D

tu inclus deux fois ctime, et deux fois mal ^^ deux fois cstdio et deux fois mal aussi, c'est:

#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <cmath>
...

d'une manière générale, les en-têtes standard C++ ne portent pas d'extension .h, et les en-têtes standards C importés en C++ prennent un "c" devant leur nom et pas l'extension non plus.

quant au liage, tu inclus et lie glut et tu lies glaux, mais tu n'utilises aucun des deux: vire moi ça :)

je vais essayer de voir si je m'y retrouve dans ton bordel pour ton histoire de sélection de case, mais c'est pas gagné, j'appuie les autres quand ils disent que c'est le bordel :p je salue ta capacité à travailler là-dedans, c'est admirable :) mais je trouve très très positif que t'aies posté ton code, parce qu'on pu te faire qq remarques sans grande importance, ça t'aidera pour la prochaine fois j'imagine, et ton code fonctionne alors :)
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
12 sept. 2005 à 19:09
Bon, j'ai regardé le tout début du code, et je vois que tu connaissais les enum, donc ça c'est fait ^^ juste que:

typedef enum {
MAX_ID = 1,

} button_id;

c'est la syntaxe C-like. En C++, on préfère:

enum button_id
{
MAX_ID = 1
};

et puis, si tu n'as qu'une constante, préfère ceci:
const int MAX_ID = 1;

aussi, tes define et include:

#include "time.h"

on écrit: #include <ctime>

#define PI 3.1415926535897932384626433832795f // ca ira comme ca non? pour le -f ne me demandez pas

le f précise que c'est un flottant simple précision (float) par opposition aux flottants double précision (double). ceci dit, PI est déclaré dans l'en-tête <cmath> comme M_PI, et si tu ne veux pas inclure cmath, faire ceci:
const float PI = 3.1415927f;
suffira largement, puisque les flottants ne sont pas précis au-delà de 6 décimales (déjà 4-5 décimales c'est sportifs ...)

#define Blend_ON {glEnable(GL_BLEND);glDisable(GL_DEPTH_TEST);} // fondu de couleurs activé ...
#define Blend_OFF {glDisable(GL_BLEND);glEnable(GL_DEPTH_TEST);} // ... ou desactivé
#define Alpha_ON {glEnable(GL_ALPHA_TEST);glDisable(GL_DEPTH_TEST);} // fondu de couleurs activé ...
#define Alpha_OFF {glDisable(GL_ALPHA_TEST);glEnable(GL_DEPTH_TEST);} // ... ou desactivé

pour ce genre de chose, où tu fais des macros, càd quand tu veux que la macro soit remplacée par son code équivalent, en C++ on préfère des fonctions inline. avantage: c'est une vraie fonction, que le compilo peut vérifier (error checking etc), et c'est exactement la même chose que des macros dans l'exe à la fin. attention, à réserver à des petites fonctions comme ici:

inline void BlendOn()
{
glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
}

et pareil pour les autres. tu peux bien sûr séparer déclaration de la fonction et implémentation de celle-ci, comme d'hab. c'est vraiment mieux d'utiliser les inline par rapport aux macros, crois-moi, le compilateur peut beaucoup mieux s'en occuper.

sinon, question: c'est quoi la différence entre alpha et blend?

typedef enum {
TILE = 1,
OBJECT = 2,
RELIEF,

MAX_X = 32,
MAX_Y = 32,
MAX = 32,
} tableau;

je pense pas que ce soit fait pour ça les enums. les enums c'est plus pour réunir des cas "mutuellement exclusifs" dans un ensemble (une énumération). préfère ici des déclarations de constantes séparées, comme j'ai montré plus haut avec le mot clef const. pour "tile", "object" et "relief", ça peut rester dans un enum bien sûr, ça c'est logique. note: tu ne dois pas préciser 1 et 2: le standard prévoit que ça commence à 1 et que ça incrémente de 1 à chaque nouveau mot, sauf si tu forces une valeur, et alors il commence à partir de cette valeur et chaque fois +1.

int s_width=1024,s_height=768; // taille de l'écran!

ce sont des constantes ou tu peux modifier la taille de la fenêtre pendant l'exécution? sinon, const int ...

autre chose: ton "32" revient partout (taille des tiles?). préfère un
const int TILE_SIZE = 32;
comme ça tu changes facilement, et le résultat dans l'exe est le même: pas de perte de perf.

j'ai pas franchement regardé le reste sinon, je vais essayer de compiler ça avec G++ quand même. si je bronche plus, c'est que ça a marché ;)

excellent choix que le loader de Funto :-D
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
12 sept. 2005 à 12:48
euhm, pour compléter ce que disait MoDDiB, laisse tomber les define, fais plutôt ceci:

enum
{
ALLER_A_DROITE,
ALLER_A_GAUCHE,
ALLER_CHEZ_MAMAN,
//...
};

ça a l'avantage d'affecter des valeurs constantes différentes à chaque nom que tu mets dans la déclaration du enum (tu tappes ça dans un en-tête). si tu veux rajouter un élément quelque part dans la liste, toutes les constantes seront modifiées en conséquence, c'est très propre et rapide. si t'as pas compris parce que je parle en brouillon, dis-le ;)

je vais regarder ton code moi :)
MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 1
12 sept. 2005 à 11:22
Le code est immangeable ; par exemple au lieu de
case 1023 :
il serait préférable de mettre
( tout en haut )
#define ALLER_A_DROITE 1023
case ALLER_A_DROITE
Tu devrais aussi mettre dans des fichiers différents pour une meilleure lisibilité

Ca permettra 2 choses : la premières c'est que tu auras vraiment envie de trouver de toi même d'ou vient le bug
et surtout que si tu ne trouves pas et bien quelqu'un aura envie de le faire !
Parce que la c'est beaucoup trop brouillon :/ mais c'est un bon début ! ( d'ailleurs enlève le code de la catégorie initié :))
MuPuF Messages postés 536 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 22 août 2008
11 sept. 2005 à 20:58
il faut glut.h, je vais ça apres manger, mais la capture a l'air pas mal. Le code est bien structuré, le seul reproche qu'on peux faire c'est le manque de commentaire (meme si ça me parait clair a moi qui n'ait jamais fais de 3D avec glut) et le fait que tu commentes des lignes de code au milieu de nulle part, en général commenter des lignes c'est une solution de debug rapide, mais c'est pas grave ... bravo, ça m'a l'air vraiment tres bien
MuPuF Messages postés 536 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 22 août 2008
11 sept. 2005 à 20:50
tu peux dire dans tes parametres de compte de recevoir un email quand on ajoute un commentaire a ta source. On se demande quel type de jeu tu va faire mdr. Vive stargate. je vais regarder ton code.
Mattpbem Messages postés 46 Date d'inscription vendredi 14 janvier 2005 Statut Membre Dernière intervention 31 juillet 2006
11 sept. 2005 à 19:12
je mets ce commentaire pour avoir la notificaiton par e-mail
n'hesitez pas à poster ;°)
Rejoignez-nous