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 » 2D dans de la 3D avec SDL et OpenG


Aller à la page : 1.

2D dans de la 3D avec SDL et OpenG
Mjlayak



Grade : Nouveau venu
Inscrit le: 23 Mai 2011, 12:03
Ecrit le: 23 Mai 2011, 13:15             Message corrigé par ryzou

Salut, je suis donc bloqué sur plusieurs points. Après avoir suivi le tutoriel sur la création d'un jeu, je souhaite aller plus loin.

Première question : Comment mettre de la 2D [ SDL ] sur du 3D [ OpenGL ] ; c'est à dire un viseur sur le fond 3D, de même, comment mettre une arme, un menu sur le fond 3D, qui soit attachée à l'écran en gros.

Deuxième question : Comment créer une surface au sol avec des "montagnes", et donc que la texture prenne la forme du terrain ? Donc par la même occasion il faudrait avoir une gravité.

J'espère recevoir une réponse de votre part.

Merci d'avance.
  Profil Mail
David



Grade : Expert
Inscrit le: 11 Mai 2005, 20:30
Ecrit le: 23 Mai 2011, 16:28             Message corrigé par ryzou

Salut Mjlayak,

  Comment mettre de la 2D sur du 3D ?      


Pour dessiner un objet, que tu sois en 2D ou en 3D, tu devras le faire avec OpenGL.

De la 2D avec OpenGL



Actuellement, tu as quelque-chose de semblable à ça :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        // Vidage de l'ecran
       glClear(GL_COLOR_BUFFER_BIT);
 
       // Chargement / Definition du contexte 3D
       glLoadIdentity( );
       glMatrixMode( GL_MODELVIEW );
       gluPerspective(70,(double)640/480,1,1000);
 
       // Place la camera
       gluLookAt(2.0,2,3,2.0,0,0,0,1,0);
 
 
       // Dessin de la scene en 3D
       // . . .

A la suite de ça, tu devras "basculer" en 2D.
1
2
3
4
5
6
7
8
        // Chargement / Definition du contexte 2D
       glLoadIdentity();
       glMatrixMode(GL_PROJECTION);
       gluOrtho2D(0.0, 640.0, 0.0, 480.0);
 
 
       // Dessin du menu, viseur... (2D)
       // . . .

Et enfin, afficher le dessin à l'écran :
1
2
        glFlush();
       SDL_GL_SwapBuffers();

De nouvelles primitives



Vu qu'on fait maintenant du la 2D, les primitives ne sont plus les mêmes.
Par exemple, glVertex3i(3, 1, 1); n' "existe plus". Par contre, tu peux maintenant utiliser glVertex2i(20, 400);

Un code d'exemple simple



Voici un exemple de code qui dessine un rectangle 2D et deux cubes en 3D.

Le code


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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <SDL/SDL.h>
#include <GL/gl.h>
#include <GL/glu.h>
 
int main(int argc, char *argv[])
{
   // Création de la fenetre
   SDL_Init(SDL_INIT_VIDEO);
   atexit(SDL_Quit);
   SDL_WM_SetCaption("Titre", NULL);
   SDL_SetVideoMode(640, 480, 32, SDL_OPENGL);
 
   // Couleur de vidage
   glClearColor(0.0, 0.0, 0.0, 0.0);
 
   // Epaisseur des lignes
   glLineWidth(5.0);
 
 
   for (;;)
   {
       // Gestion des evenements
       SDL_Event event;
       SDL_WaitEvent(&event);
       switch(event.type)
       {
           case SDL_QUIT:
           exit(0);
           break;
       }
 
       // Vidage de l'ecran
       glClear(GL_COLOR_BUFFER_BIT);
 
       // Chargement / Definition du contexte 3D
       glLoadIdentity( );
       glMatrixMode( GL_MODELVIEW );
       gluPerspective(70,(double)640/480,1,1000);
 
       // Place la camera
       gluLookAt(2.0,2,3,2.0,0,0,0,1,0);
 
       // Dessin 3D
       glBegin(GL_LINE_LOOP);
               glColor3ub(0, 0, 255);
               glVertex3i(0, 0, 1);
               glVertex3i(1, 0, 1);
               glVertex3i(1, 1, 1);
               glVertex3i(0, 1, 1);
       glEnd();
 
       glBegin(GL_LINE_LOOP);
               glVertex3i(0, 0, 0);
               glVertex3i(1, 0, 0);
               glVertex3i(1, 1, 0);
               glVertex3i(0, 1, 0);
       glEnd();
 
       glBegin(GL_LINES);
               glVertex3i(0, 1, 0);
               glVertex3i(0, 1, 1);
               glVertex3i(0, 0, 0);
               glVertex3i(0, 0, 1);
               glVertex3i(1, 1, 0);
               glVertex3i(1, 1, 1);
               glVertex3i(1, 0, 0);
               glVertex3i(1, 0, 1);
       glEnd();
 
       // Cube 2 décalé
       glTranslatef(2.5, 0.0, 0.5);
       glRotatef(45.0, 0.0, 1.0, 0.0);
       glTranslatef(-2.5, 0.0, -0.5);
 
       glBegin(GL_LINE_LOOP);
               glColor3ub(255, 0, 2);
               glVertex3i(2, 0, 1);
               glVertex3i(3, 0, 1);
               glVertex3i(3, 1, 1);
               glVertex3i(2, 1, 1);
       glEnd();
 
       glBegin(GL_LINE_LOOP);
               glVertex3i(2, 0, 0);
               glVertex3i(3, 0, 0);
               glVertex3i(3, 1, 0);
               glVertex3i(2, 1, 0);
       glEnd();
 
       glBegin(GL_LINES);
               glVertex3i(2, 1, 0);
               glVertex3i(2, 1, 1);
               glVertex3i(2, 0, 0);
               glVertex3i(2, 0, 1);
               glVertex3i(3, 1, 0);
               glVertex3i(3, 1, 1);
               glVertex3i(3, 0, 0);
               glVertex3i(3, 0, 1);
       glEnd();
 
       // Chargement / Definition du contexte 2D
       glLoadIdentity();
       glMatrixMode(GL_PROJECTION);
       gluOrtho2D(0.0, 640.0, 0.0, 480.0);
 
       // Dessin d'un rectangle
       glBegin(GL_POLYGON);
           glColor3f(0.0, 1.0, 0.0);
           glVertex2f(20, 400) ;
           glVertex2f(620, 400) ;
           glColor3f(1.0, 0.0, 0.0);
           glVertex2f(620, 460) ;
           glColor3f(1.0, 0.0, 1.0);
           glVertex2f(20, 460) ;
       glEnd();
 
       glFlush();
       SDL_GL_SwapBuffers();
   }
 
   return 0;
}

Le résultat





  Comment crée une surface au sol avec des montagnes ?      


Créer des montagnes



Pour créer des montagnes, tu devras utiliser une images de ce style là :



La valeur du pixel détermine la hauteur du point. (blanc = 255 = hauteur max)

Par un système de maillage, tu dessine chaque triangle qui constitue ton terrain.

Un triangle est régit de 3 pixels : celui-ci, celui juste au dessous, et celui juste à droite.
Un seconde triangle est régit de ce pixel, de celui juste au dessus, et de celui juste à gauche.
Et dans une double boucle imbriqué, tu parcours toute ton image pour dessiner ton terrain.

Avec 4 pixels, tu peux dessiner 2 triangles qui se touchent.

A l'aide d'une double boucle imbriquée, tu parcours toute ton image pour dessiner la totalité de ton terrain.

L'attraction



Pour ce qui est de l'attraction, tu pourras te contenter de décrémenter une variable contenant l'altitude de ton personnage.
Ce qui me semble être le plus difficile, c'est de gérer les collisions / éventuels glissements. Je ne suis pas à l'aise avec ce genre de chose. Osasuke te répondra sans doute mieux que moi.

________
Apprenez à créer votre propre FPS en C++ avec OpenGL. C'est pas dur ! :-)
  Profil Mail
Mjlayak



Grade : Nouveau venu
Inscrit le: 23 Mai 2011, 12:03
Ecrit le: 24 Mai 2011, 18:14             Message corrigé par ryzou

Merci bien pour toute ces explications. Ça m'a permis d’être plus éclairé sur le sujet.
  Profil Mail
Lo



Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
Ecrit le: 24 Mai 2011, 19:38             Message corrigé par ryzou

Regarde ce tutoriel.
Pour les collisions, ça m'a pas l'air si compliqué son système, il suffit de se baser sur les formules. Mais quelques connaissances en math (ou en physique pour les glissements) sont nécessaires.

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



Grade : Expert
Inscrit le: 11 Mai 2005, 20:30
Ecrit le: 25 Mai 2011, 01:59             Message corrigé par ryzou

Merci pour ce tutoriel.

Je pense que je vais réutiliser la fonction de collision proposée dans ce tutoriel pour implémenter le relief dans mon FPS. C'est une idée d'amélioration.

________
Apprenez à créer votre propre FPS en C++ avec OpenGL. C'est pas dur ! :-)
  Profil Mail
Lo



Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
Ecrit le: 25 Mai 2011, 11:32             Message corrigé par ryzou

Oui je l'ai proposé dans un autre topic, ainsi que quelques autres trucs. ^^

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



Grade : Membre motivé
Inscrit le: 07 Juin 2011, 20:21
Ecrit le: 08 Juin 2011, 12:23             Message non corrigé

Pour la 2D

Sinon en SDL tu peux mettre des images comme des gros blocs d'image ,ensuite viens la difficulté. Il faut que tu mettes des 0 et des 1 pour faire vide/objet. L’objet qui bloquera le personnage. Sur le site du zéro il y a un truc là dessus je te l’envoie.
Pour faire les 0 et 1 : http://www.siteduzero.com/tutoriel-3-198472-tile-mapping.html
Sinon pour faire des intéractions comme des sauts (il en faut bien sur de la 2D): http://www.siteduzero.com/tutoriel-3-35272-les-sauts-2d-en-c.html
Sinon suit les tuto en langage C ensuite tu vas SDL et la tu verras comment mettre une image de fond ( en gros tu dessine et ensuite tu mets les 0 et les 1 et tu obtient un résultat 10 fois mieux que si tu fesais 1 = herbe, 2 = pierre, 3 = air par exemple.)

Sinon pour la 3D j'apprends donc je suis nul^^

________
------------------------------------------------------------------------------------------------------------------------------
Tu t'es vu avec tes pains aux raisins sur les oreilles?
  Profil Mail
David



Grade : Expert
Inscrit le: 11 Mai 2005, 20:30
Ecrit le: 09 Juin 2011, 04:32             Message corrigé par ryzou

Ce que tu décris là est la méthode pour gérer les collisions en 2D entre différents sprites.

Mjlayak fait de la 3D avec OpenGL et cherche à incruster des éléments 2D sur sa fenêtre. Par exemple : un viseur, un score, un menu.

Son soucis, c'est que lorsqu'on utilise la SDL avec le contexte OpenGL, il n'est plus possible d'agir directement sur la surface principale.
1
2
3
4
5
6
// Ici, il est absurde de récupérer l'adresse sur la surface retourné par la
// fonction car, le contexte de rendu OpenGL étant chargé, il n'est plus
// possible de manipuler directement cette surface
SDL_Surface* ecran = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_OPENGL);
 
// Cette surface, allouée par la fonction, sera libérée lors de l'appel à SDL_Quit();

D'où la question de Mjlayak, qui était pertinente.

________
Apprenez à créer votre propre FPS en C++ avec OpenGL. C'est pas dur ! :-)
  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

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

Page générée en 0.408 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.