IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Game design [Besoin d'aide, conseils....]


Sujet :

Langage Delphi

  1. #21
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Ok, quand je dis enfantin, y'a comme même des limites, on ne peut pas acceder à tant de puissance et de fonctionnalités sans un travail dur.

    Tu peux faire une recherche sur le net sur opengl et delphi, récupere qlqs exemples, lire des articles et dissequer qlqs sources.

    Si tu veux, je vais essayer d'écrire un petit prog en Delphi qui explique qlqs trucs de base, et te le passer ensuite. Mais un peu de patience, car je ne me connecte pas tous les jours.

    En attendant, fais un effort, le resultat vaut la peine, et bonne chance.

  2. #22
    Membre habitué Avatar de poussinphp
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 428
    Points : 176
    Points
    176
    Par défaut
    Merci. En faite je me connais j'aime avoir des resultats assez vite pour pas me décourager. Je propose donc de faire de l'opengl avec du glscene. Comme ça je pourrais avoir un ptit résultat et je pousse un peut avec de l'opengl pur pour debuter, puis je lache ptit à ptit glscene pour faire du 100% opengl pur.

  3. #23
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Bon, comme je te l'ai promis hier, voici un petit exemple pour te montrer comment utiliser OpenGL
    (Et que les modérateurs m'excusent pour cette avalanche)
    Rq : si tu me files ton mail, je pourrais t'envoyer tout le projet en un fichier RAR (54 Ko).
    Rq2: Dissèques cet exemple, j'y ai mis plein de commentaires
    Rq3: Pour que ce projet fonctionne, tu dois :
    - soit avoir une image "d:\x.bmp"
    - soit remplacer ce chemin dans la source par un autre chemin valide
    Rq4: Tu dois aussi avoir l'entête de l'OpenGL 1.5, disponible sur DelphiGL.de
    Rq5: Avec les fichiers Sprites.pas et Textures.Pas, tu peux dire que t'as la squelette d'un moteur 2D !
    une fois que t'aurais avancé en OpenGL, tu peux les etoffer avec d'autres effets et t'aurais un vrai moteur 2D
    Je t'ai bien dit que c'etait enfantin !
    Rq6: Tu m'en dois une l'ami, ça m'as pris 1 heure et 35 minutes ! (il est 00:38, et j'ai cours demain à 8:30)


    Bon, passons maintenat au code :

    le fichier sprites.pas
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    unit Sprites;
     
    interface
    uses tdOpenGL15;
     TYPE
      TSprite = record
        XPos, YPos : Single; // les coordonnées du sprite
        Angle      : Single; // La rotation du sprite
        Width,
        Height     : single; // Dimensions du Sprite
        TextureID  : Word;   // L'identificateur de la texture
                             // du sprite
      end;
     
      procedure drawSprite(s:TSprite);
     
    implementation
     
      procedure drawSprite(s:TSprite);
      begin
       (*
         On passe au mode matrice MODELVIEW
         dans lequel on spécifie les transformations qu'on
         veut appliquer aux objets.
         On charge l'identité pour que les transformations
         qu'on a indiqué avant n'influencent pas cet objet.
       *)
       glMatrixMode(GL_MODELVIEW);
       glLoadIdentity();
       (*
         On spécifie les transformations
     
     
         glTranslatef(x, y, z) : fait translater les objets à venir
         de x unités dans l'axe des x, y unités dans l'axe des y
         et z unités dans l'axe des z (pour la 2D, tu n'auras pas besoin de la
         composante z (en géneral))
       *)
       glTranslatef(s.XPos, s.YPos, 0);
       (*
         glRotatef(angle, x, y, z) : fait tourner les objets à venir
         de angle degrés parapport à l'axe (x, y, z).
         Pour la 2D, on fait les rotations parapport à l'axe des Z (0,0,1)
       *)
       glRotatef(s.Angle, 0,0,1);
     
       (*
         On indique à OpenGL qu'elle texture utiliser pour habiller les
         objets à venir.
         le premier paramètre indique que c'est une texture 2D (il y'a 1D et 3D !)
         le deuxième est l'ID d'une texture déja enregistré, regarde dans le fichier
         textures.pas pour plus de details !
       *)
       glBindTexture(GL_TEXTURE_2D, s.TextureID);
     
       (*
         On va maintenat commencer à dessiner.
         On communique les  objets qu'on veut dessiner à OpenGL
         sous la forme de vertices (points) qui sont encadrés par
         un spécificateur de primitive triangles, lignes, rectangles, ...
     
         Pour utiliser les textures, on doit spécifier pour chaque vertex
         les coords du pixel de la texture qui sera plaqué sur ce vertex,
         OpenGL s'occupe de faire l'interpolation pour habiller toute la forme !
       *)
       glBegin(GL_QUADS); //Dans ce cas, ce sont des rectangles
     
         glTexCoord2f(0,0); // Les coords du coin inférieur gauche de la texture
         glVertex2f(0, 0);  // Les coords du coin inférieur gauche de l'objet
     
         glTexCoord2f(1,0); // Les coords du coin inférieur droit de la texture
         glVertex2f(s.Width, 0);  // Les coords du coin inférieur droit de l'objet
     
         glTexCoord2f(1,1); // Les coords du coin supèrieur droit de la texture
         glVertex2f(s.Width, s.Height);  // Les coords du coin supèrieur droit de l'objet
     
         glTexCoord2f(0,1); // Les coords du coin supèrieur gauche de la texture
         glVertex2f(0, s.Height);  // Les coords du coin supèrieur gauche de l'objet
       glEnd; // fin de l'objet !
       (*
         Remarques que les coords des vertices qu'on communique à OpenGL sont constantes,
         On dit qu'elle sont dans l'espace Objet, puis, comme tu as spécifié une translation
         et une rotation, OpenGL transforme ces vertices, qui seront dorénavant
         dans l'espace monde.
         à la fin, une autre transformation est appliqué par OpenGL, qui est la projection, pour
         que l'on obtient des pixels à l'ecran !
       *)
      end;
    end.
    Le fichier Textures.pas :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    unit Textures;
    interface
     Uses tdOpenGL15, Windows, SysUtils;
     
     (*
       Cette fonction charge un bitmap, le communique à OpenGL
       pour l'enregistrer dans la mémoire Vidéo (plus rapide), et
       retourne un ID avec lequel on pourra acceder à la texture sauvegardé
     *)
     function loadBitmap(FileName : String) : Word;
    implementation
     
     function loadBitmap(FileName : String) : Word;
      var
       FH:TBitmapFileHeader;
       IH:TBitmapInfoHeader;
       RGB:RGBTriple;
       F:File;
       SrcB,DestB:^Byte;
       I,Size:LongWord;
       Width, height : integer;
       buffer : pointer;
       TextureID : Word;
      Begin
     
       if Not (FileExists(FileName)) then
        begin
         Result:=0;
         exit;
        end;
     
       FileMode:=0;
       AssignFile(F,FileName);
       Reset(f,1);
       BlockRead(F,FH,SizeOf(FH));
       BlockRead(F,IH,SizeOf(IH));
     
       Width:=IH.biWidth;
       Height:=IH.biHeight;
       Size:=Width*Height*3;
     
       GetMEm(Buffer, size);
       BlockRead(f, Buffer^, size);
       CloseFile(f);
     
       (*
         maintenant, on dans Width la largeur du bitmap,
         dans Height sa hauteur et ses pixels dans Buffer.
     
         On va l'enregistrer auprés d'OpenGL
       *)
       glGenTextures(1,@textureID); // on recupère dans textureID l'ID d'une texture alloé par OpenGL
       glBindTexture(GL_TEXTURE_2D, TextureID); // On active cette texture
     
       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);// on indique à OpenGL le filtre pour agrandir les images
       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);// on indique à OpenGL le filtre pour retrécir les images
     
        // Et on stocke la texture
        glTexImage2D(GL_TEXTURE_2D, 0, 3, Width, Height, 0, GL_BGR, GL_UNSIGNED_BYTE, Buffer);
     
        // Et on crée les mimaps
        gluBuild2DMipmaps(GL_TEXTURE_2D, 3, Width, Height, GL_BGR, GL_UNSIGNED_BYTE, Buffer);
     
        Result := TextureID;
      end;
     
    end.
    le fichier principal unit1.pas :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, tdopengl15, Sprites, Textures;
     
    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure FormPaint(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        RC : HGLRC;
     
        S: TSprite;
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     InitOpenGL();
     (*
       On commence par créer un Rendering context, une sorte de
       lien avec OpenGL et notre fenetre !
     *)
     RC:=createRenderingContext(GetDC(Handle), [opDoubleBuffered], 32, 24, 0,0,0,0);
     
     (*
        On active ce lien
     *)
     ActivateRenderingContext(GetDC(Handle), RC);
     
     (*
       on va maintenat initialiser la matrice de projection.
       dans ton cas, une vue orthogonale est le meilleur choix
       puisque tu travailles en 2D, et comme ça, tu pourras specifier les
       coordonnées de tes points (Vertex) comme tu le fais pour
       les pixels !
     *)
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
     glOrtho(0,width,0,height,-1,1);
     
     (*
       On va maintenat spécifier la couleur du fond (RGBA),
       disons le noir
     *)
     glClearColor(0,0,0,0);
     
     //On active le texturing
     glEnable(GL_TEXTURE_2D);
     
     
     //Maintenant, on va initialiser un sprite
     s.XPos:=150;
     s.YPos:=150;
     s.Angle:=45;
     s.Width:=200;
     s.Height:=160;
     s.TextureID:=loadBitmap('d:\x.bmp');// attention : changes ce chemin par un autre valide !
    end;
     
     
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
     (*
       On va maintenat detruire les ressources qu'on a
       alloué en créant le lien avec OpenGL
     *)
     DeactivateRenderingContext();
     DestroyRenderingContext(RC);
    end;
     
    procedure TForm1.FormPaint(Sender: TObject);
    begin
     glClear(GL_COLOR_BUFFER_BIT);// On efface l'ecran
     drawSprite(s); // on dessine le sprite s
     swapBuffers(GetDC(Handle));// !!!!!
    end;
     
    end.
    Bon, j'ai pas opté pour une approche objet histoire de simplifier un peu la chose.
    Amuse toi avec ça, tu peux par exemple ajouter un gestionnaire d'evenement OnKeyDown et modifier les coordonnées du sprite ou sa rotation, n'oublies pas de redissiner la fenetre pour voir les modifications !

  4. #24
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Voici le lien à partir duquel tu peux télecharger les headers de l'OpenGL 1.5 :
    http://www.delphigl.com/do_download.php?f=12000

Discussions similaires

  1. Besoin d'aide/conseil pour alternance.
    Par Eliada dans le forum Emploi
    Réponses: 2
    Dernier message: 05/12/2011, 13h10
  2. Java/DB : Besoin d'aide/conseils
    Par Askle dans le forum JDBC
    Réponses: 8
    Dernier message: 29/12/2009, 20h09
  3. Besoin d'aide/conseils licenciement faute lourde
    Par minette dans le forum Licenciement
    Réponses: 26
    Dernier message: 08/07/2008, 18h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo