| Les listes chaînées |
Lo

Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
|
| Ecrit le: 25 Fev 2009, 21:06 Message non corrigé | |
|
Salut, justement, j'aimerais bien écrire un petite librairie qui me permettrais de gérer des liste en c++ un peu comme le fait Java.
Justement ça tombe bien, à l'école je dois faire un projet en C traitant sur les listes chaînées.
Et bon j'aimerais bien m'en servir en c++ de mes connaissances histoire de gérer ainsi après facilement la génération de terrain en 3D.
J'aurais à gérer une liste de Points de triangles pour les pentes.
Ce code là en C marche très bien, ce programme gère une liste de cours.
Mais quand je le compile en tant que projet c++ il me met qu'il ne peut pas convertir Cours* en Cours*.
Quand je le compile en C, ce message d'erreur deviens un warning.
Sans doute parce que il faut utiliser les références en c++.
Et, lorsque j'essaye d'ajouter un élément avec une fonction, il ne me l'ajoute pas, la liste reste vide.
pPremier à toujours comme valeur null.
Et bon, pour le fichier, ça, r+ ce n'est pas que ça ne fonctionne pas mais ça ne crée pas le fichier.
Et w+ ça m'efface tout comme un barbare.
Enfin, j'ai pas trouvé mieux que r+ comme mode d'ouverture.
a et a+ pas besoin, j'ai envie de lire les cours dans le fichier, et ensuite d'effacer le fichier et de réécrire dedans.
Y'a pas une fonction qui permet d'effacer ce qu'il y a d'écrit dans un fichier ?
Et lorsque je fais l'ajout dans une fonction, ma liste reste vide. (Dans main)
Sans doute il faut manipuler des doubles pointeurs mais là avec de simples pointeurs j'ai déjà du mal.
Pour trier la liste j'ai rien trouver de mieux que l'algorithme que j'ai là, car changer les valeurs pointeurs houlalala...
Bon voici mon projet.
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
//Liste chaînée de cours, définition de sa strucure.
typedef struct {
int id;
char nom[21];
int annee;
char prof[16];
struct Cours *pSuivant;
//Pointeur qui contient l'adresse de l'élément suivant.
} Cours;
void main () {
//Fonction qui trie la liste.
void trier (Cours *pPremier, int nb);
//La fonction en marche pas.
void ajoutEnFin (Cours *pPremier, Cours *pAjout, int *nb);
//Déclarations des varaibles.
Cours *pPremier = NULL;
//Variable qui contient l'adresse de la liste, et du première élément de la liste.
Cours *pCourant = NULL, *pSuivant = NULL, *pPrecedent = NULL, *pAjout = NULL;
//Variables pour les ajouts, suppressions...
int nb = 0, j, cont = 1, n, id = 0;
char rep, nom[21];
FILE *fdat = NULL;
FILE *fres = NULL;
fdat = fopen ("cours.dat","w+");
pCourant = (Cours*) malloc(sizeof (Cours));
if (fdat != NULL)
fscanf(fdat,"%d", &id);
if (fdat == NULL || feof(fdat)) {
printf("Le fichier est vide ou pas créé ou a été supprimé.\n");
} else {
do {
//Lecture d'un cours dans le fichier.
pCourant->id = id;
fscanf(fdat,"%s%d%s", &pCourant->nom, &pCourant->annee, &pCourant->prof);
pCourant->pSuivant = NULL;
if (pPremier == NULL) {
pPremier = pCourant;
printf("Ajout en debut\n");
}
fscanf(fdat,"%d", &id);
//Si on est pas à la fin du fichier, on réserve de la place pour le cours suivant.
if (!feof(fdat)) {
pSuivant = malloc(sizeof(Cours));
pCourant->pSuivant = pSuivant;
pCourant = pSuivant;
}
nb++; //On augmente le nombre de cours.
} while (!feof(fdat));
}
while (cont) {
//Menu principal de l'application.
printf("Menu : \nTaper a pour ajouter un/des cours.\n");
printf("Taper s pour supprimer un/des cours.\n");
printf("Taper r pour rechercher un cours.\n");
printf("Taper m pour modifier un/des cours.\n");
printf("Taper l pour afficher la liste des cours actuels.\n");
printf("Taper w pour sauvegarder les modifications\n");
printf("Taper q pour quitter l'application (Attention enregistrer les modif avant!).\n");
printf("Ensuite pressez la touche enter pour confirmer\n");
scanf("%c", &rep);
if (rep == 'a') {
printf("Combien de cours voulez vous ajouter ?\n");
//Ajout de plusieurs cours en fin de liste.
scanf("%d", &n);
for (j = 0; j < n; j++) {
pAjout = malloc (sizeof (Cours));
pAjout->id = nb;
printf("Entrer le nom du cours : \n");
scanf("%s", &pAjout->nom);
printf("Entrer l'année à laquelle le cours est donné : \n");
scanf("%d", &pAjout->annee);
printf ("Entrer le nom du prof qui le donne \n");
scanf("%s", &pAjout->prof);
pAjout->pSuivant = NULL;
//Comme il sera ajouté à la fin, il n'aura pas de suivant.
//Si la liste est vide, on le place en début de liste.
if (pPremier == NULL) {
printf("Ajout en debut\n");
pPremier = pAjout;
} else {
//Sinon, on parcours la liste jusqu'au dernier élément.
pCourant = pPremier;
while (pCourant->pSuivant != NULL) {
pCourant = pCourant->pSuivant;
}
//On ajoute le cours en fin de liste.
pCourant->pSuivant = pAjout;
}
nb++;
}
trier (pPremier, nb);
} else if (rep == 's') {
printf("Combien de cours voulez vous supprimer ?\n");
//Ajout de plusieurs cours en fin de liste.
scanf("%d", &n);
for (j = 0; j < n; j++) {
printf("Entrer le nom du cours à supprimer\n");
scanf("%s",&nom);
pCourant = pPremier;
pSuivant = pCourant->pSuivant;
if (pCourant == NULL) {
printf("La liste est vide\n");
} else {
//Supprimer le première élément.
if (strcmp (pCourant->nom, nom) == 0) {
pPremier = pCourant->pSuivant;
free (pCourant);
} else {
//Recherche de l'élément à supprimer.
pPrecedent = malloc (sizeof (Cours));
do {
pPrecedent = pCourant;
pCourant = pPrecedent->pSuivant;
pSuivant = pCourant->pSuivant;
} while (strcmp(pCourant->nom, nom) != 0 && pSuivant != NULL);
//Si l'élément l'avant dernière élément deviens le dernier.
if (strcmp (pCourant->nom, nom) == 0 && pSuivant == NULL) {
pPrecedent->pSuivant = NULL;
free (pCourant);
//Sinon, le suivant du précédent devient le suivant de celui qui succède l'élément supprimé.
} else if (pSuivant != NULL) {
pPrecedent->pSuivant = pSuivant;
free (pCourant);
} else {
//Sinon, l'élément n'est pas dans la liste, si on est au dernier élément et que ce n'est pas le bon.
printf("Ce cours n'est pas dans la liste!.\n");
}
}
}
}
} else if (rep == 'l') {
//Si la liste est vide.
if (pPremier == NULL) {
printf("La liste des cours est vide!\n");
} else {
//Sinon, on affiche la liste élément par élément.
pCourant = pPremier;
while (pCourant != NULL) {
printf("Id : %-2d nom : %-20s année : %-d donné par : %-15s\n",
pCourant->id,pCourant->nom, pCourant->annee,pCourant->prof);
pCourant = pCourant->pSuivant;
}
}
} else if (rep == 'w') {
if (pPremier == NULL) {
printf("La liste est vide!\n");
} else {
//Ecriture de la liste dans le fichier.
pCourant = pPremier;
while (pCourant != NULL) {
fprintf(fdat, "%-2d %-20s %-d %-15s\n",
pCourant->id, pCourant->nom, pCourant->annee, pCourant->prof);
pCourant = pCourant->pSuivant;
}
fscanf(fdat, "%d", &id);
if (feof(fdat))
printf("Erreur");
}
} else if (rep == 'q') {
cont = 0;
}
scanf("%*c");
}
fclose (fdat);
}
void trier (Cours *pPremier, int nb) {
char tmpC[21];
int tmpI;
Cours* pPrecedent = pPremier; //Variables pour le tri.
Cours* pElement;
int i;
//Tri classique.
for (i = 0; i < nb; i++) {
pElement = pPrecedent->pSuivant;
while (pElement != NULL) {
if(strcmp (pPrecedent->nom, pElement->nom) > 0) {
strcpy (tmpC, pPrecedent->nom);
strcpy (pPrecedent->nom, pElement->nom);
strcpy (pElement->nom, tmpC);
strcpy (tmpC, pPrecedent->prof);
strcpy (pPrecedent->prof, pElement->prof);
strcpy (pElement->prof, tmpC);
tmpI = pPrecedent->annee;
pPrecedent->annee = pElement->annee;
pElement->annee = tmpI;
}
pElement = pElement->pSuivant;
}
pPrecedent = pPrecedent->pSuivant;
}
}
Je sais que c'est bordelique comme code, mais j'ai pas su faire mieux.
Si quelqu'un à une meilleure solution pour un code plus clair je suis partant, mais je vous préviens, c'est tordu à faire.
Autrement dis ce n'est pas pour les débutants.
________ Parce qu'on ne peut s'exprimer que par nos créations. ^^
|
|
| |
|
|
Lo

Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
|
| Ecrit le: 28 Fev 2009, 13:47 Message non corrigé | |
|
Ha voilà, j'ai réussi finalement à utiliser les doubles pointeurs.
Je progresse bien, je posterai le code une fois que je l'aurai fini.
Mais pour ceux qui veulent, je poste le code ne fuse pour ajouter un élément à la fin d'une liste pour ceux qui en auraient besoin.
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
//Liste chaînée de cours, définition de sa strucure.
typedef struct {
int id; //Sera égal aux nombres d'éléments -1.
char nom[21];
int annee;
char prof[16];
struct Cours *pSuivant;
} Cours;
void main () {
void trier (Cours *Premier, int nb);
void ajouterEnFin (Cours **p2Premier, Cours *p2Ajout, int *nb);
//Déclarations des varaibles.
Cours *pPremier = NULL, *pCourant = NULL, *pSuivant = NULL, *pPrecedent = NULL, *pAjout = NULL; //Variables pour les ajouts, suppressions...
int nb = 0, j, cont = 1, n, id = 0;
char rep, nom[21];
FILE *fdat = NULL;
fdat = fopen ("cours.dat","r+");
pCourant = (Cours*) malloc(sizeof (Cours));
while (cont) {
//Menu principal de l'application.
printf("Menu : \nTaper a pour ajouter un/des cours.\n");
printf("Taper s pour supprimer un/des cours.\n");
printf("Taper r pour rechercher un cours.\n");
printf("Taper m pour modifier un/des cours.\n");
printf("Taper l pour afficher la liste des cours actuels.\n");
printf("Taper w pour sauvegarder les modifications\n");
printf("Taper q pour quitter l'application (Attention enregistrer les modif avant!).\n");
printf("Ensuite pressez la touche enter pour confirmer\n");
scanf("%c", &rep);
if (rep == 'a') {
printf("Combien de cours voulez vous ajouter ?\n");
//Ajout de plusieurs cours en fin de liste.
scanf("%d", &n);
for (j = 0; j < n; j++) {
pAjout = malloc (sizeof (Cours));
pAjout->id = nb;
printf("Entrer le nom du cours : \n");
scanf("%s", &pAjout->nom);
printf("Entrer l'année à laquelle le cours est donné : \n");
scanf("%d", &pAjout->annee);
printf ("Entrer le nom du prof qui le donne \n");
scanf("%s", &pAjout->prof);
pAjout->pSuivant = NULL;
//Comme il sera ajouté à la fin, il n'aura pas de suivant.
//Si la liste est vide, on le place en début de liste.
ajouterEnFin (&pPremier, pAjout, &nb);
}
}//Fin du for.
trier (pPremier, nb);
scanf("%*c");
} //Fin du while.
}//Fin du main
void ajouterEnFin (Cours **p2Premier, Cours *pAjout, int *nb) {
Cours *pCourant = NULL;
if (*p2Premier == NULL) {
*p2Premier = pAjout;
} else {
//Sinon, on parcours la liste jusqu'au dernier élément.
pCourant = *p2Premier;
while (pCourant->pSuivant != NULL) {
pCourant = pCourant->pSuivant;
}
//On ajoute le cours en fin de liste.
pCourant->pSuivant = pAjout;
}
(*nb)++;
}
void trier (Cours *pPremier, int nb) {
if (pPremier != NULL) {
char tmpC[21];
int tmpI;
Cours* pPrecedent = pPremier; //Variables pour le tri.
Cours* pElement = NULL;
int i;
for (i = 0; i < nb; i++) {
pElement = pPrecedent->pSuivant;
while (pElement != NULL) {
if(strcmp (pPrecedent->nom, pElement->nom) > 0) {
strcpy (tmpC, pPrecedent->nom);
strcpy (pPrecedent->nom, pElement->nom);
strcpy (pElement->nom, tmpC);
strcpy (tmpC, pPrecedent->prof);
strcpy (pPrecedent->prof, pElement->prof);
strcpy (pElement->prof, tmpC);
tmpI = pPrecedent->annee;
pPrecedent->annee = pElement->annee;
pElement->annee = tmpI;
}
pElement = pElement->pSuivant;
}
pPrecedent = pPrecedent->pSuivant;
}
}
}
Il faut juste bien savoir combien d'étoiles il faut mettre.
Ou alors une autre solution plus simple aurait été de retourner le pointeurs pPremier.
C'est quand même parce que il faut bien savoir si on travaille sur les adresses ou les valeurs.
Et quelqu'un m'a dis gentillement ce que voulait dire pPremier, *pPremier et **pPremier.
Car il n'y avait pas de tutoriel de Matéo21 là dessus.
pPremier contient l'adresse du pointeur qui contient l'adresse du première élément de la liste.
*pPremier contient l'adresse du première élément de la liste.
**pPremier c'est le première élément de la liste.
J'ai enfin compris.
Le truc vraiment chien c'est que faut écrire (*nb)++ comme cela sinon il va incrémenter l'adresse mémoire de nb car le ++ à priorité sur l'étoile, et je vous dis pas combien de temps j'ai passé avant de comprendre pourquoi ça buguait.
Maudites étoiles.
________ Parce qu'on ne peut s'exprimer que par nos créations. ^^
|
|
| |
|
|
Lo

Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
|
| Ecrit le: 28 Fev 2009, 16:50 Message non corrigé | |
|
Voilà, j'ai finis mon programme enfin.
Gestion d'une liste de cours.
Mon fichier cours.h :
#ifndef COURS
#define COURS
//Liste chaînée de cours, définition de sa strucure.
typedef struct {
int id; //Sera égal aux nombres d'éléments -1.
char nom[21];
int annee;
char prof[16];
struct Cours *pSuivant;
} Cours;
//Déclaration des fonctions.
void trier (Cours *Premier, int nb);
void ajouterEnFin (Cours **p2Premier, int *nb);
void supprimer (Cours **p2Premier, char nom[]);
void afficher (Cours *pPremier);
void rechercher (Cours *pPremier, char nom[]);
void remplacer (Cours *pPremier, char nom[]);
#endif
Et mon fichier cours.cpp
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "cours.h"
int main (int argc, char* argv[]) {
//Déclarations des varaibles.
Cours *pPremier = NULL, *pCourant = NULL, *pSuivant = NULL; //Variables pour les ajouts, suppressions...
int nb = 0, j, cont = 1, n, id = 0;
char rep, nom[21];
FILE *fdat = NULL;
fdat = fopen ("cours.dat","r");
if (fdat != NULL)
fscanf(fdat,"%d", &id);
if (fdat == NULL || feof(fdat)) {
printf("Le fichier est vide ou pas créé ou a été supprimé.\n");
} else {
pCourant = malloc (sizeof (Cours));
do {
pCourant->id = id;
fscanf(fdat,"%s%d%s", &pCourant->nom, &pCourant->annee, &pCourant->prof);
pCourant->pSuivant = NULL;
if (pPremier == NULL) {
pPremier = pCourant;
printf("Ajout en debut\n");
}
fscanf(fdat,"%d", &id);
//Si on est pas à la fin du fichier, on réserve de la place pour le cours suivant.
if (!feof(fdat) && id != pCourant->id) {
pSuivant = malloc(sizeof(Cours));
pCourant->pSuivant = pSuivant;
pCourant = pSuivant;
}
nb++; //On augmente le nombre de cours.
} while (!feof(fdat) && id != pCourant->id);
fclose(fdat);
}
while (cont) {
//Menu principal de l'application.
printf("Menu : \nTaper a pour ajouter un/des cours.\n");
printf("Taper s pour supprimer un/des cours.\n");
printf("Taper r pour rechercher un cours.\n");
printf("Taper m pour modifier un cours.\n");
printf("Taper l pour afficher la liste des cours actuels.\n");
printf("Taper w pour sauvegarder les modifications.\n");
printf("Taper q pour quitter l'application. (Attention enregistrer les modif avant!)\n");
printf("Ensuite pressez la touche enter pour confirmer.\n");
scanf("%c", &rep);
if (rep == 'a') {
printf("Combien de cours voulez vous ajouter ?\n");
//Ajout de plusieurs cours en fin de liste.
scanf("%d", &n);
for (j = 0; j < n; j++) {
ajouterEnFin (&pPremier, &nb);
}
trier (pPremier, nb);
} else if (rep == 'r') {
printf("Entrer le nom du cours à rechercher\n");
scanf("%s", &nom);
rechercher (pPremier, nom);
} else if (rep == 's') {
printf("Combien de cours voulez vous supprimer ?\n");
//Ajout de plusieurs cours en fin de liste.
scanf("%d", &n);
for (j = 0; j < n; j++) {
printf("Entrer le nom du cours à supprimer\n");
scanf("%s",&nom);
supprimer (&pPremier, nom);
}
} else if (rep == 'm') {
printf ("Entrer le nom du cours à modifier\n");
scanf("%s", &nom);
remplacer (pPremier, nom);
} else if (rep == 'l') {
afficher(pPremier);
} else if (rep == 'w') {
//Si la liste est vide, on écrit rien.
if (pPremier == NULL) {
printf("La liste est vide!\n");
} else {
fopen ("cours.dat", "w");
//Sinon, tant que on est pas au dernier élément, on l'écrit.
pCourant = pPremier;
while (pCourant != NULL) {
fprintf(fdat, "%-2d %-20s %-d %-15s\n",
pCourant->id, pCourant->nom, pCourant->annee, pCourant->prof);
pCourant = pCourant->pSuivant;
}
fscanf(fdat, "%d", &id);
if (feof(fdat))
printf("Erreur");
}
fclose (fdat);
} else if (rep == 'q') {
//On libère les ressources et quitte le programme si l'utilisateur presse q.
cont = 0;
free(pPremier);
}
scanf("%*c");
}
return EXIT_SUCCESS;
}
void ajouterEnFin (Cours **p2Premier, int *nb) {
/*p2Premier contient l'adresse du pointeur sur le première élément de la liste.
*Obligation de faire celà pour que l'adresse du première élément de la liste soit
* aussi modifiée dans le main.*/
Cours *pCourant = NULL, *pAjout = NULL;
pAjout = malloc (sizeof (Cours));
pAjout->id = *nb;
printf("Entrer le nom du cours : \n");
scanf("%s", &pAjout->nom);
printf("Entrer l'année à laquelle le cours est donné : \n");
scanf("%d", &pAjout->annee);
printf ("Entrer le nom du prof qui le donne \n");
scanf("%s", &pAjout->prof);
pAjout->pSuivant = NULL;
if (*p2Premier == NULL) {
*p2Premier = pAjout;
} else {
//Sinon, on parcours la liste jusqu'au dernier élément.
pCourant = *p2Premier;
while (pCourant->pSuivant != NULL) {
pCourant = pCourant->pSuivant;
}
//On ajoute le cours en fin de liste.
pCourant->pSuivant = pAjout;
}
(*nb)++;
}
void supprimer (Cours **p2Premier, char nom[]) {
Cours *pCourant = NULL, *pPrecedent = NULL, *pSuivant = NULL;
pCourant = *p2Premier;
pSuivant = pCourant->pSuivant;
if (pCourant == NULL) {
printf("La liste est vide\n");
} else {
//Si l'élément à supprimer est en début de liste.
if (strcmp (pCourant->nom, nom) == 0) {
*p2Premier = pCourant->pSuivant;
free (pCourant);
//Sinon on parcours la liste jusqu'à ce que on trouve l'élément à supprimer ou alors on arrive au dernier élément.
} else {
do {
pPrecedent = pCourant;
pCourant = pPrecedent->pSuivant;
pSuivant = pCourant->pSuivant;
} while (strcmp(pCourant->nom, nom) != 0 && pSuivant != NULL);
//Si l'élément à supprimer est le dernier de la liste.
if (strcmp (pCourant->nom, nom) == 0 && pSuivant == NULL) {
pPrecedent->pSuivant = NULL;
free (pCourant);
//Sinon si l'élément suivant est un noeud intermédiaire.
} else if (pSuivant != NULL) {
pPrecedent->pSuivant = pSuivant;
free (pCourant);
//Sinon c'est que l'élément n'est pas dans la liste.
} else {
printf("Ce cours n'est pas dans la liste!.\n");
}
} //Fin du premier else
} //Fin du second else.
}
void rechercher (Cours *pPremier, char nom[]) {
Cours *pCourant = NULL;
pCourant = pPremier;
while (pCourant != NULL && strcmp (pCourant->nom, nom) != 0) {
pCourant = pCourant->pSuivant;
}
if(pCourant == NULL) {
printf("Ce cours n'est pas dans la liste\n");
} else {
printf("%-2d %-20s %-d %-15s\n", pCourant->id, pCourant->nom, pCourant->annee, pCourant->prof);
}
}
void afficher (Cours *pPremier) {
Cours *pCourant = NULL;
if (pPremier == NULL) {
printf("La liste des cours est vide!\n");
} else {
//Sinon, on affiche la liste élément par élément.
pCourant = pPremier;
while (pCourant != NULL) {
printf("Id : %-2d nom : %-20s année : %-d donné par : %-15s\n",
pCourant->id,pCourant->nom, pCourant->annee,pCourant->prof);
pCourant = pCourant->pSuivant;
}
}
}
void remplacer (Cours *pPremier, char nom[]) {
Cours *pCourant = NULL;
char nvNom[21];
int nvAnnee;
char nvProf[16];
pCourant = pPremier;
while (pCourant != NULL && strcmp (pCourant->nom, nom) != 0) {
pCourant = pCourant->pSuivant;
}
if(pCourant == NULL) {
printf("Ce cours n'est pas dans la liste\n");
} else {
printf("Entrer le nom du cours : \n");
scanf("%s", &nvNom);
strcpy (pCourant->nom, nvNom);
printf("Entrer l'année du cours : \n");
scanf("%d", &nvAnnee);
pCourant->annee = nvAnnee;
printf("Entrer le nom du proffesseur : \n");
scanf("%s", &nvProf);
strcpy (pCourant->prof, nvProf);
}
}
void trier (Cours *pPremier, int nb) {
if (pPremier != NULL) {
char tmpC[21];
int tmpI;
Cours* pPrecedent = pPremier; //Variables pour le tri.
Cours* pElement = NULL;
int i;
for (i = 0; i < nb; i++) {
pElement = pPrecedent->pSuivant;
while (pElement != NULL) {
if(strcmp (pPrecedent->nom, pElement->nom) > 0) {
strcpy (tmpC, pPrecedent->nom);
strcpy (pPrecedent->nom, pElement->nom);
strcpy (pElement->nom, tmpC);
strcpy (tmpC, pPrecedent->prof);
strcpy (pPrecedent->prof, pElement->prof);
strcpy (pElement->prof, tmpC);
tmpI = pPrecedent->annee;
pPrecedent->annee = pElement->annee;
pElement->annee = tmpI;
}
pElement = pElement->pSuivant;
}
if (pPrecedent->pSuivant != NULL)
pPrecedent = pPrecedent->pSuivant;
}
}
}
Ca c'est du code que j'aime, bah oui, c'est mon code.
________ Parce qu'on ne peut s'exprimer que par nos créations. ^^
|
|
| |
|
|
OSasuke

Grade : Connaisseur
Inscrit le: 29 Juin 2008, 10:54
|
| Ecrit le: 20 Mars 2009, 12:06 Message non corrigé | |
|
Oui , c'est aussi un code qui fait mal a la téte.
________
|
|
| |
|
|
Lo

Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
|
| Ecrit le: 22 Mars 2009, 22:31 Message non corrigé | |
|
Meuh non c'est pas difficile, et puis c'est pas dur, et c'est ce genre de code qui sont utilisés dans les librairies de bas niveaux donc c'est normal que ce soit plus élaboré.
Mais je te préviens, ici je suis occupé sur un jeux dont le code fait 12k de lignes et c'est pas un jeux en 3D. (2D diamétrique)
Sinon ce qu'il y a de vraiment pratique à utiliser si tu ne veux pas te casser la tête tu peux utiliser une librairies de haut niveau comme par exemple vector.
Mais bon comme je suis curieux et que j'aime bien quand c'est mon code, :P je programme moi même.
Sinon pour la manipulation des listes de vecteurs pour la gestion des collisions, je me souviens enfin mieux comment fonctionne la géométrie de l'espace, en fait suffit d'additionner les deux vecteur pour un translation, pour la rotation, suffit de multiplier deus vecteurs entre eux, etc...
Faudra encore que je squatte mes cours de physique pour me souvenir de certaines formules comme l'accélération, etc...
Au pire si c'est trop casse tête pour moi, j'utilise ogre, mais bon faut quand même savoir comment faire les rotations, et translation, pour le déplacement de vaisseaux, trouver ce qu'il faut faire pour que le vaisseaux se dirige bien vers l'endroit ou on a cliqué et bien le faire ralentir quand il tourne pour pas le faire tourner en ronds.
J'ai participé à un projet comme ça avant, et j'ai eu un peu de mal à bien paramétrer mais maintenant ça marche bien, le type était content car ses vaisseaux allaient enfin ou il le voulais.
________ Parce qu'on ne peut s'exprimer que par nos créations. ^^
|
|
| |
|
|
OSasuke

Grade : Connaisseur
Inscrit le: 29 Juin 2008, 10:54
|
| Ecrit le: 30 Mars 2009, 16:38 Message non corrigé | |
|
Alors, on peut compter sur toi pour refaire Havok ou encore CryEngine.
C'est quoi Havok et CryEngine ? Cherche !
Je ne dirais pas que je suis au top, mais au moin je programme proprement avec les classs.
See here : [url]http://www.micodec.1s.fr/IrrlichtBullet/tutorial [irrlicht-bullet].html[/url]. ( C'est moi qu'il est fait , désoler si c'est de l'anglais )
________
|
|
| |
|
| |