Jeux Libres

Envie de créer un jeu vidéo ?   Le site qui vous accompagne de A à Z.


» Les Forums » A propos de la création de jeux vidéo » Résultat


Aller à la page : 1.

Résultat
Lo



Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
Ecrit le: 14 Dec 2008, 10:46             Message non corrigé

Ai vous moquez pas hein, c'est déjà bien que j'en soit arrivé là.

Alors si quelqu'un peu m'expliquer le bug...
De plus je comprend pas très bien GL_MAG_FILTER et GL_MIN_FILTER.
Si je les mets pas, il m'affiche rien, et si je les mets, il m'affiche ceci :

http://www.jeux-libres.com/membres/mes_images/445_1229247571_essaytextureresultat.jpg

Perso moi je trouves que c'est déjà pas mal.
Mais si ça pouvait me l'afficher correctement se serait encore meiux.  

Alors bah j'ai utiliser donc la même manière que David, en regardant un tuto bien expliqué sur les fichiers bmp.

Mais je pense pas que l'erreur se trouves dans ces deux fichiers.
chargerImage.h

#ifndef CHARGERBMP_H_INCLUDED
#define CHARGERBMP_H_INCLUDED
#include <iostream>
#include <fstream>
   struct rgba {
char r;
char g;
char b;
   char a;
};
class Image
{
private :
int width;
int height;
rgba* texture;
const char* nomFichier;

public :
rgba* chargerBMP (const char* nomFichier);
Image (const char* nomFichier);
int getWidth () const;
int getHeight () const;
rgba* getRGBA () const;
~Image();
};


#endif // CHARGERBMP_H_INCLUDED


Et le fichier .cpp

#include "chargerImage.h"
#include "stdlib.h"
using namespace std;
Image::Image (const char* nomFichier) : nomFichier(nomFichier) {
texture = chargerBMP(nomFichier);
}
rgba* Image::chargerBMP (const char* nomFichier) {
   cout<< "Chargement de l'image " << nomFichier << endl;
ifstream fichierBMP (nomFichier, ios::in, ios::binary);

   if (!fichierBMP)
       return 0;

   char format[2];
   fichierBMP.read (format, 2 * sizeof (char));


   if(format[0] != 'B' || format[1] != 'M')
       return 0;

   // On se positionne au niveau de l'information sur l'offset
fichierBMP.seekg(10, ios::beg);

   // On récupère l'offset
   unsigned long offset = 0;
   fichierBMP.read ((char*) &offset, sizeof(int));
   

   // On récupère la largeur et le hauteur
   unsigned long largeur;
   unsigned long hauteur;
fichierBMP.seekg(18, ios::beg);
   fichierBMP.read((char*) &largeur, sizeof(int));
   fichierBMP.read ((char*) &hauteur, sizeof(int));
   width = largeur;
height = hauteur;
   // On récupère le nombre de bits par pixel
   unsigned short bitsParPixel;
fichierBMP.seekg(28, ios::beg);
   fichierBMP.read ((char*) &bitsParPixel, sizeof(short));

   // S'il ne s'agit pas d'un BMP de 24 bits/px -> erreur
   if(bitsParPixel != 24)
       return 0;

   // On se déplace au debut de l'image
fichierBMP.seekg(offset, ios::beg);

   int nbPixels = largeur * hauteur;
cout<<nbPixels;
   // Puis on récupère la totalité de l'image
texture = (new rgba[nbPixels * sizeof(rgba)]);

   int i;
   for (i = nbPixels; i >=0; i--)
   {
       // Attention BMP est en BGR et non RGB !!
       fichierBMP.read ((char*) &texture[i].b, sizeof (char));
fichierBMP.read ((char*) &texture[i].g, sizeof (char));
fichierBMP.read ((char*) &texture[i].r, sizeof (char));
       texture[i].a = 0;
   }

  /* int positionCourante = 1;
   int positionFinale = largeur - 1;
   int i;

   for (i = nbPixels - largeur; i != positionFinale; i++)
   {
       // Attention BMP est en BGR et non RGB !!
       fichierBMP.read ((char*) &texture[i].b, sizeof(char));
           
       fichierBMP.read ((char*) &texture[i].g, sizeof(char));
           
       fichierBMP.read ((char*) &texture[i].r, sizeof(char));
           
       texture[i].a = 0;


       if(positionCourante == largeur)
       {
           i -= (2 * largeur);
           positionCourante = 1;
       }
       else
           positionCourante++;
   }*/

   fichierBMP.close();

   cout << "Image BMP Chargee !\n";

   return texture;
}
int Image::getWidth () const {
return width;
}
int Image::getHeight () const {
return height;
}
rgba* Image::getRGBA () const {
return texture;
}
Image::~Image ()
{
   delete[] texture;
}

et le main.cpp

#include <GL/glut.h>
#include <stdlib.h>
#include <iostream>
#include "chargerImage.h"
int nWindowID;
const int largeur = 640;
const int hauteur = 490;
void afficher ();
void attendre ();
void clavier (unsigned char touche, int x, int y);
void init ();
GLuint chargerTexture (Image* image);
GLuint textureId;
int main (int argc, char *argv[]) {
//Initialisation de glut.
glutInit (&argc, argv);
//Paramètrage de l'affichage.
glutInitDisplayMode (GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);
//Dimensionner la fenêtre.
glutInitWindowSize (largeur, hauteur);
//Création de la fenêtre.
nWindowID = glutCreateWindow ("Ma première fenêtre window.");
init ();
//Reférencement de la fonction d'affichage.
glutDisplayFunc (afficher);
//Référencement de la fonction d'attente.
glutIdleFunc(attendre);
//Référencement à la fonction qui gère les évènements.
glutKeyboardFunc(clavier);
// boucle de gestion des evenements.

glutMainLoop();

// le programme n'arrivera jamais jusqu'ici
return EXIT_SUCCESS;

}
void init () {
glEnable (GL_DEPTH_TEST);
glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
glEnable (GL_COLOR_MATERIAL);
glMatrixMode (GL_PROJECTION);
glEnable(GL_TEXTURE_2D);
glLoadIdentity ();
gluPerspective (45.0f, (float) (largeur/hauteur), 1.0, 200);
gluLookAt(-5, 20, -10, 0, 0, 0, 0, 1, 0);
Image *image = new Image ("sol_metal.bmp");
textureId = chargerTexture (image);
delete image;
}
//Fonction appelée pour l'affichage.
void afficher () {
//Effacement de l'écran et du tampon de profondeur.
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
GLfloat ambientColor[] = {255, 255, 255, 100};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientColor);
GLfloat lightColor[] = {0.7f, 0.7f, 0.7f, 1.0f};
GLfloat lightPos[] = {-10, 10, -10, 0};
glLightfv (GL_LIGHT0, GL_DIFFUSE, lightColor);
glLightfv (GL_LIGHT0, GL_POSITION, lightPos);
glBindTexture (GL_TEXTURE_2D, textureId);
glBegin (GL_QUADS);
//Sol.
glColor3f (1.0f, 1.0f, 1.0f);
glTexCoord2f (0.0f, 0.0f);
glVertex3d (-100, 0, -100);
glTexCoord2f (20.0f, 0);
glVertex3d (100, 0, -100);
glTexCoord2f (20.0f, 20.0f);
glVertex3d (100, 0, 100);
glTexCoord2f (0, 20.0f);
glVertex3d (-100, 0, 100);
//Face1.
glColor3ub(255, 0, 0);
glVertex3f (0, 0, 0);
glVertex3f (0, 5, 0);
glVertex3f (5, 5, 0);
glVertex3f (5, 0, 0);
//Face 2.
glColor3ub(0, 255, 0);
glVertex3f (5, 0, 0);
glVertex3f (5, 5, 0);
glVertex3f (5, 5, 5);
glVertex3f (5, 0, 5);
//Face 3.
glColor3ub (255, 255, 0);
glVertex3f (0, 0, 5);
glVertex3f (0, 5, 5);
glVertex3f (5, 5, 5);
glVertex3f (5, 0, 5);
//Face 4.
glColor3ub (255, 0, 255);
glVertex3f (0, 0, 5);
glVertex3f (0, 5, 5);
glVertex3f (0, 5, 0);
glVertex3f (0, 0, 0);
//Face5.
glColor3ub (255, 255, 0);
glVertex3f (0, 0, 0);
glVertex3f (5, 0, 0);
glVertex3f (5, 0, 5);
glVertex3f (0, 0, 5);
//Face6.
glColor3ub (0, 255, 255);
glVertex3f (0, 5, 0);
glVertex3f (5, 5, 0);
glVertex3f (5, 5, 5);
glVertex3f (0, 5, 5);
glEnd ();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

//Echange les buffers "front" et ""back".
glFlush ();
glutSwapBuffers ();
}
void attendre () {
//Mémorise le temps à attendre.
static int nAttendreJusque = glutGet (GLUT_ELAPSED_TIME);
//Récupérer le moment présent.
int nTimer = glutGet (GLUT_ELAPSED_TIME);
//On compare l'instant qu'il faut attendre avec le moment présent.
if (nTimer >= nAttendreJusque) {
//Rafraichis l'affichage.
glutPostRedisplay ();
nAttendreJusque = nTimer + (1000 / 5);
}
}
// fonction de gestion du clavier
void clavier(unsigned char touche, int x, int y)
{
// traitement des touches q et echap
if(touche=='q' || touche == 27)
{
// destruction de la fenetre GLUT
glutDestroyWindow(nWindowID);
// on quitte notre programme
exit(EXIT_SUCCESS);
}
}
GLuint chargerTexture (Image* image) {
GLuint nom;
glGenTextures (1, &nom);
glBindTexture (GL_TEXTURE_2D, nom);
glTexImage2D (GL_TEXTURE_2D, 0, 4, image->getWidth(), image->getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, image->getRGBA());
return nom;
}


Alors je vois pas l'erreur, et ça m'énerve parce que j'aimerais en finir avec ça pour passer au chargement de l'ogre.

Sinon, si quelqu'un à un tuto qui explique les formats de fichiers .jpg et .png, ça m'intéresse.
Wai bon en C ça marche donc c'est surement en lisant mes valeurs rgb avec read mais je vois pas ou est le problème.
C'est bien un octet bleu, un autre vert et un rouge ?

________
Parce qu'on ne peut s'exprimer que par nos créations. ^^
  Profil Mail
Lo



Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
Ecrit le: 14 Dec 2008, 14:46             Message non corrigé

Réussi!
Mais j'ai du utiliser l'ancienne librairie du C pour lire mon fichier de texture car avec fstream ça ne marche pas.
Si quelqu'un sait pourquoi.
Donc quand je met ça par contre ça marche :

rgba* Image::chargerBMP (const char* nomFichier) {
        cout<<"Chargement de l'image : "<<nomFichier<<endl;
    FILE* fichierBMP = fopen(nomFichier, "rb");

    if (! fichierBMP)
        return 0;

    char format[2];
    if(fread (format, sizeof(char), 2, fichierBMP) != 2)
        return 0;

    if(format[0] != 'B' || format[1] != 'M')
        return 0;

    // On se positionne au niveau de l'information sur l'offset
    fseek(fichierBMP, 10, SEEK_SET);

    // On récupère l'offset
    unsigned long offset = 0;
    if (fread (&offset, sizeof(long), 1, fichierBMP) != 1)
        return 0;

    // On récupère la largeur et le hauteur
   
    fseek(fichierBMP, 18, SEEK_SET);
    if (fread (&width, sizeof(int), 1, fichierBMP) != 1
        || fread (&height, sizeof(int), 1, fichierBMP) != 1)
        return 0;
       
    // On récupère le nombre de bits par pixel
    unsigned short bitsParPixel;
    fseek(fichierBMP, 28, SEEK_SET);
    if (fread (&bitsParPixel, sizeof(short), 1, fichierBMP) != 1)
        return 0;

    // S'il ne s'agit pas d'un BMP de 24 bits/px -> erreur
    if(bitsParPixel != 24)
        return 0;

    // On se déplace au debut de l'image
    fseek(fichierBMP, offset, SEEK_SET);

    int nbPixels = width * height;

    // Puis on récupère la totalité de l'image
    rgba* texture = new rgba[nbPixels * sizeof(struct rgba)];

    int i;
    for (i = 0; i < nbPixels; i++)
    {
        // Attention BMP est en BGR et non RGB !!
        if (fread (&texture[i].b, 1, 1, fichierBMP) != 1)
            return 0;
        if (fread (&texture[i].g, 1, 1, fichierBMP) != 1)
            return 0;
        if (fread (&texture[i].r, 1, 1, fichierBMP) != 1)
            return 0;
        texture[i].a = 0;
    }
        /*
    int positionCourante = 1;
    int positionFinale = largeur - 1;
    int i;
    for (i = nbPixels - largeur; i != positionFinale; i++)
    {
        // Attention BMP est en BGR et non RGB !!
        if (fread (&texture[i].b, 1, 1, fichierBMP) != 1)
            return 0;
        if (fread (&texture[i].g, 1, 1, fichierBMP) != 1)
            return 0;
        if (fread (&texture[i].r, 1, 1, fichierBMP) != 1)
            return 0;
        texture[i].a = 0;

        if(positionCourante == largeur)
        {
            i -= (2 * largeur);
            positionCourante = 1;
        }
        else
            positionCourante++;
    }*/


    fclose(fichierBMP);

    cout<<"Image BMP Chargee !\n"<<endl;

    return texture;
}
 
...Bizarre...

Et ça me donne :
http://www.jeux-libres.com/membres/mes_images/445_1229262238_sol.jpg
Par contre j'ai pas trouvé de tutos ou ils expliquent les formats compressés.  
Aller, je passe au chargement de modèles md2.
Et après les animations, me restera plus qu'à lire le tutos de oSasuke sur Newton.

________
Parce qu'on ne peut s'exprimer que par nos créations. ^^
  Profil Mail
Lo



Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
Ecrit le: 15 Dec 2008, 18:16             Message non corrigé

Ogre chargé. ^^
Ca donne ceci :
http://www.jeux-libres.com/membres/mes_images/445_1229361646_chargement.jpg

Bah voilà, me reste la gestion des collisions, et la création de terrain.

Ce qui va être difficile, c'est donner les armes aux personnages, gérer la collision avec les mines, ...

Et comment on fait les textures animée pour mettre de l'eau?
J'ai pas trouvé de tutos sur comment charger des gifs.

________
Parce qu'on ne peut s'exprimer que par nos créations. ^^
  Profil Mail
alexchef



Grade : Connaisseur
Inscrit le: 22 Mai 2008, 17:56
Ecrit le: 11 Oct 2009, 06:19             Message non corrigé

Heu ... Je sais que Hakf-Lifafisme ont été fais en e les grafisme on été fais en c++ mais tu i arivera mieu avec un logicielle 3D

________
Coin Coin
  Profil Mail
 


Aller à la page : 1.


Hébergeur du site : 1and1.fr



Site de création de Jeux Vidéo
Apprenez à créer vos propres Jeux Video

1198783 pages ont été consultées sur le site !
Dont 2298 pages pendant les 24 dernières heures.

Page générée en 0.336 secondes


Nos partenaires
- Otium Production : Aide aux débutants à créer leurs jeux
- Les bibliothèques de développement de jeux vidéo


  © 2005-2012 www.jeux-libres.com - Toute reproduction totale ou partielle du contenu de ce site est strictement interdite.