Jeux Libres
       
           

» Les Forums » Aide à propos de la création de jeux vidéo » [C++] Lo reprend ses tutos!


Aller à la page : 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11.

[C++] Lo reprend ses tutos!
Lo



Grade : Maître
Inscrit le: 26 Dec 2007, 17:33
Ecrit le: 26 Juin 2014, 19:12             Message non corrigé

En fait j'ai trouvé c'est index.php et non pas index.html qu'il fallait mettre comme nom de fichier.

C'est bon, ça marche!!!

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



Grade : Maître
Inscrit le: 11 Mai 2005, 20:30
Ecrit le: 26 Juin 2014, 22:00             Message non corrigé

:)

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



Grade : Maître
Inscrit le: 26 Dec 2007, 17:33
Ecrit le: 27 Juin 2014, 11:04             Message non corrigé

Ouais ça fait un petit temps que je n'ai plus touché au php mais ici je m'y suis remis. :)

Mais il n'y a pas que ça j'ai aussi du javascript dans mon code.

Mais ici là je dois finir mon moteur, j'ai encore un petit peu de boulot et je dois mettre de l'ordre dans mon code pour la démo et faire encore quelques tilesets.

Et je bloque un peu avec les maths et la physique ainsi que avec la synchronisation des mouvements en réseau car je n'ai pas beaucoup d'expérience là dedans à vrai dire j'ai débuté sur ce site tout comme toi au niveau conception de jeux vidéos.
Pour ça que j'attends la partie réseau.

Bref dû cherché un algorithme mieux que celui de SAT qui projette tous les sommets sur les normales des 2 polygones et qui marche aussi pour tester si un points ou bien un rayon intersecte un polygone, un cercle ou une ellipse (en 2D ou bien en 3D) pour mon moteur de lumière.

Mais à part ses 2 points là sur lesquels j'ai plus du mal suite à mon manque d'expérience, le reste ça va.
En général je trouve que je me débrouille bien pour quelqu'un qui n'a pas d'expérience dans le domaine. (Et bientôt j'aurai déjà une IA fonctionnelle et je pourrai commencer le gameplay)

Le plus lourd restera de tester toute les fonctionnalités du moteur, corriger les derniers bugs/crash ainsi que de produire la doc et le site.

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



Grade : Maître
Inscrit le: 11 Mai 2005, 20:30
Ecrit le: 27 Juin 2014, 12:55             Message non corrigé

  Et je bloque un peu avec les maths et la physique ainsi que avec la synchronisation des mouvements en réseau car je n'ai pas beaucoup d'expérience là dedans à vrai dire j'ai débuté sur ce site tout comme toi au niveau conception de jeux vidéos.
Pour ça que j'attends la partie réseau.
     


Je t'expliquerais comment je me suis débrouillé pour synchroniser les mouvements sur le réseau. Ne regarde pas le code de la première version du FPS, les mouvement n'était pas synchronisé, le réseau était mal fais. Dans sa version actuelle, en revanche, le réseau est plutôt réussi, tu verras.

  Bref dû cherché un algorithme mieux que celui de SAT qui projette tous les sommets sur les normales des 2 polygones et qui marche aussi pour tester si un points ou bien un rayon intersecte un polygone, un cercle ou une ellipse (en 2D ou bien en 3D) pour mon moteur de lumière.      


Sur ce point je ne vais pas savoir t'aider, j'ai moi même eu beaucoup de difficultés sur le même genre de problème sur des petits projets de tests lors de l'étude de faisabilité du FPS. Tu peux quand même poser ton problème à résoudre sur ce forum, éventuellement j'y jetterais un il, mais je ne pense pas que je réussirai.

  Mais à part ses 2 points là sur lesquels j'ai plus du mal suite à mon manque d'expérience, le reste ça va.
En général je trouve que je me débrouille bien pour quelqu'un qui n'a pas d'expérience dans le domaine.
     


Tout à fait.

  Le plus lourd restera de tester toute les fonctionnalités du moteur, corriger les derniers bugs/crash ainsi que de produire la doc et le site.      


C'est pas désagréable. Et pour le site, bien que je ne soit pas pour les CMS tout prêt fait, rien ne tempêche de t'y pencher.

A bientôt !

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



Grade : Maître
Inscrit le: 26 Dec 2007, 17:33
Ecrit le: 27 Juin 2014, 15:20             Message non corrigé

Alors pour mon problème ou je sèche c'est pour trouver la distance entre le center du polygone et l'intersection du côté du polygone avec le rayon d.



Je fais une projection au lieu de chercher les intersections entre les rayons car je veux que ça marche aussi en 3D.

p1 et p2 sont donc les projections des diagonales sur d.

Sinon j'ai essayé ça comme solution mais sans grande conviction : (en recherchant la diagonale la plus proche de d pour projeter ensuite les 2 diagonales sur d.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
static Vec2f projectShapeOnAxisFromCenter(Vec3f axis, Vec3f center, std::vector<Vec3f> vertices) {
       float dpMax = 0.f;
       int ind = 0;
       Vec3f v = axis - center;
       for (int i = 0; i < vertices.size(); i++) {
           float dp = vertices[i].dot(v);
           if (dp > dpMax) {
               dpMax = dp;
               ind = i;
           }
       }        //for (unsigned int i = 0; i < 3; i++) {
       float p1 = Math::abs((vertices[ind] - center).projOnAxis(v));
       float p2 = Math::abs((vertices[(ind+1 == vertices.size()) ? 0 : ind+1] - center).projOnAxis(v));
       if (p1 > p2) {
           float tmp = p1;
           p1 = p2;
           p2 = tmp;
       }
       float dp = 1.f - Math::abs((vertices[ind] - center).dot(v));
       float max = p2;
       float min = (p2 - p1) * dp;
       return Vec2f(min, max);
   }
1
2
3
4
5
6
7
8
bool BoundingPolyhedron::isPointInside(Vec3f p) {
   float c = (p - center).magnitude();
   Vec2f pr = Computer::projectShapeOnAxisFromCenter(p, center, points);
   float r = pr.y - pr.x;
   if (r - c < 0)
       return false;    //}
   return true;
}








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



Grade : Maître
Inscrit le: 11 Mai 2005, 20:30
Ecrit le: 27 Juin 2014, 19:27             Message non corrigé

J'ai beaucoup de mal à te comprendre.

  Alors pour mon problème ou je sèche c'est pour trouver la distance entre le center du polygone et l'intersection du côté du polygone avec le rayon d.      


C'est un octogone régulier ?
Tu connais l'angle de ton rayon ?

Peux-tu définir clairement les informations à l'entrée de ton algorithme et la forme sous laquelle tu souhaites obtenir ton résultat.

  Je fais une projection au lieu de chercher les intersections entre les rayons car je veux que ça marche aussi en 3D.      


Tu veux dire que tu veux connaitre la distance entre le centre d'un polyèdre régulier et l'intersection de l'un de ses rayons ?

C'est quoi ton objectif à la base ? Je veux dire, qu'est-ce qu'il t'a amené à devoir calculer ça ?

Est-ce que ce calcule sera souvent effectué par l'ordinateur ? As-tu des contraintes en terme de délais / temps de réponse ?



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



Grade : Maître
Inscrit le: 26 Dec 2007, 17:33
Ecrit le: 27 Juin 2014, 20:33             Message non corrigé

Bon, il est vrai que avec les angles, ça va déjà mieux :
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
static Vec2f projectShapeOnAxisFromCenter(Vec3f axis, Vec3f center, std::vector<Vec3f> vertices, std::vector<Vec3f> normals) {
       float dpMax = 0.f;
       int ind = 0;
       Vec3f v = axis - center;
       for (int i = 0; i < normals.size(); i++) {
           float dp = normals[i].dot(v);
           if (dp > dpMax) {
               dpMax = dp;
               ind = i;
           }
       }        //for (unsigned int i = 0; i < 3; i++) {
       Vec3f v1 = vertices[ind] - center;
       Vec3f v2 = vertices[(ind+1 == vertices.size()) ? 0 : ind+1] - center;
       float p1 = Math::abs(v1.projOnAxis(v));
       float p2 = Math::abs(v2.projOnAxis(v));
       if (p1 > p2) {
           float tmp = p1;
           p1 = p2;
           p2 = tmp;
       }
       float angle1 = Math::abs(v1.getAngleBetween(v, v1.cross(v)));
       float angle2 = Math::abs(v2.getAngleBetween(v, v2.cross(v)));
       float dp = (angle1 <= angle2) ? angle1 : angle2 / Math::abs(v1.getAngleBetween(v2, v1.cross(v2)));
       float max = p2;
       float min = (p2 - p1) * dp;
       return Vec2f(min, max);
   }

Cependant je n'arrive pas à bien calculer les angles entre les vecteurs : normalement les 2 angles entre la normale et les 2 diagonales du côté de la normale doivent être identique, hors ici ce n'est pas le cas avec cette fonction :
1
2
3
4
5
6
7
8
9
10
11
float Vec3f::getAngleBetween (const Vec3f &other, const Vec3f &n) {
   if(isNulVector() || other.isNulVector())
       return 0;
   float dotProduct = dot(other);
   Matrix3f matrix (x, y, z, other.x, other.y, other.z, n.x, n.y, n.z);
   float fDet = matrix.getDet();
   if (fDet >= 0)
       return Math::acosinus(dotProduct);
   else
       return -Math::acosinus(dotProduct);
}

Pareil pour le produit scalaire j'ai un produit scalaire de 0.555 au lieu d'avoir un produit scalaire de 0.5.

L'angle entre les diagonales d'un triangle et sa normale est pourtant de 60 degré donc je devrais avoir un produit scalaire de 0.5 mais j'ai pas ça j'ai 0.555 comme résultat donc un peu de trop.

Sinon ça doit marcher pour des polygones irrégulier aussi, et j'utilise cet algorithme souvent et pour la 2D et la 3D.

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



Grade : Maître
Inscrit le: 26 Dec 2007, 17:33
Ecrit le: 27 Juin 2014, 20:39             Message non corrigé

Sinon voici le main :
1
2
3
4
5
6
 odfaeg::BoundingPolyhedron t2;
   t2.addPoint(odfaeg::Vec3f(0, 0, 0));
   t2.addPoint(odfaeg::Vec3f(50, 100, 0));
   t2.addPoint(odfaeg::Vec3f(-50, 100, 0));
   odfaeg::Vec3f pt2 (25, 50, 0);
   std::cout<<t2.isPointInside(pt2)<<std::endl;

angle1 et angle2 devraient valoir la même chose hors que ce n'est pas le cas.



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



Grade : Maître
Inscrit le: 26 Dec 2007, 17:33
Ecrit le: 27 Juin 2014, 22:18             Message non corrigé

Voici une image qui illustre mieux ce que je veux faire :



Donc en gros je fais ceci :

Je prend le côté le plus prêt du point P.

Je projette les diagonales du triangle (seulement celles qui rejoignent le côté le plus prêt du point p) sur l'axe v.

Je prend le maximum parmi les 2 projections.

Je calcule l'angle entre le vecteur v et les diagonales et je choisi l'angle qui est le plus petit (ici c'est l'angle alpha sur le dessin.)

Je divise cet angle par l'angle (gamma sur le dessin) qui se trouve entre les deux diagonales.

Je fais (p2 - p1) * (alpha / gamma) pour avoir la distance entre p2 et t.

Et enfin je soustrais cette distance de p2 pour avoir la distance entre le centre et t.

Mais mon algorithme me donne un angle un peu plus grand que 120 degré pour l'angle gamma, et un produit scalaire un peu plus grand que 0.5.
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
#include "../../../include/odfaeg/Math/vec4.h"
#include "../../../include/odfaeg/Math/matrix3.h"
namespace odfaeg {
using namespace std;
using namespace sf;
const Vec3f Vec3f::xAxis(1.f, 0.f, 0.f);
const Vec3f Vec3f::yAxis(0.f, 1.f, 0.f);
const Vec3f Vec3f::zAxis(0.f, 0.f, 1.f);
 
ostream& operator<< (ostream &out, const Vec3f &vec3) {
   out<<"x : "<<vec3.x<<" y : "<<vec3.y<<" z : "<<vec3.z<<" w : "<<vec3.w<<endl;
   return out;
}
Vec3f::Vec3f () : Vector3f (0.f, 0.f, 0.f) {
   w = 1.f;
}
 
Vec3f::Vec3f(float x, float y, float z) : Vector3f (x, y, z) {
   w = 1.f;
}
Vec3f::Vec3f (float x, float y, float z, float w) : Vector3f(x, y, z) {
   this->w = w;
}
 
void Vec3f::set (float x, float y, float z) {
   this->x = x;
   this->y = y;
   this->z = z;
}
 
Vec3f Vec3f::normalizeToVec3 () const {
 
   Vector3f vec3 = getVec3sf();
   if (w != 0.f) {
       return Vec3f (vec3.x / w, vec3.y / w, vec3.z / w);
 
   }
   else
       return *this;
}
bool Vec3f::isNulVector () const {
   return x==0 && y==0 && z==0;
}
Vec3f Vec3f::operator- () const {
   return Vec3f (-this->x, -this->y, -this->z);
}
Vec3f Vec3f::operator+ (const Vec3f &other) {
 
   Vector3f vec3 = this->getVec3sf() + other.getVec3sf();
   return Vec3f (x + other.x, y + other.y, z + other.z);
 
}
Vec3f Vec3f::operator- (const Vec3f &other) {
   sf::Vector3f v1 = this->getVec3sf();
   sf::Vector3f v2 = other.getVec3sf();
   sf::Vector3f vec3 = v1 - v2;
   return Vec3f (x - other.x, y - other.y, z - other.z);
}
Vec3f Vec3f::operator* (const Vec3f &other) {
   float x = this->x * other.x;
   float y = this->y * other.y;
   float z = this->z * other.z;
   return Vec3f (x, y, z);
}
Vec3f Vec3f::operator* (const float scale) {
   sf::Vector3f v1 = this->getVec3sf();
   sf::Vector3f vec3 = v1 * scale;
   return Vec3f (x * scale, y * scale, z * scale);
}
Vec3f Vec3f::operator/ (const float scale) {
   sf::Vector3f v1 = this->getVec3sf();
   sf::Vector3f vec3 = v1 / scale;
   return Vec3f (vec3.x, vec3.y, vec3.z);
}
Vec3f Vec3f::operator/ (const Vec3f &other) {
   try {
       if (other.x == 0 || other.y == 0 || other.z == 0)
           throw Erreur(0, "Division by zero.", 1);
       else
           return Vec3f (this->x / other.x, this->y / other.y, this->z / other.z);
   } catch (Erreur err) {
       cerr<<err.what()<<endl;
   }
}
Vec3f& Vec3f::operator+= (const Vec3f &other) {
 
   this->x += other.x;
   this->y += other.y;
   this->z += other.z;
   return *this;
 
}
void Vec3f::operator-= (const Vec3f &other) {
  this->x -= other.x;
  this->y -= other.y;
  this->z -= other.z;
}
void Vec3f::operator*= (const Vec3f &other) {
  this->x *= other.x;
  this->y *= other.y;
  this->z *= other.z;
}
void Vec3f::operator*= (const float scale) {
  this->x *= scale;
  this->y *= scale;
  this->z *= scale;
}
void Vec3f::operator/= (const Vec3f &other) {
   try {
       if (other.x == 0 || other.y == 0 || other.z == 0)
           throw Erreur(0, "Division by zero.", 1);
       else {
           this->x /= other.x;
           this->y /= other.y;
           this->z /= other.z;
       }
   } catch (Erreur err) {
       cerr<<err.what()<<endl;
   }
}
 
 
Vec3f& Vec3f::operator= (const Vec3f &other) {
   x = other.x;
   y = other.y;
   z = other.z;
   w = other.w;
   return *this;
}
bool Vec3f::operator== (const Vec3f &other) {
   return x==other.x && y==other.y && z==other.z;
}
 
float Vec3f::computeDist (const Vec3f &other) {
   return Math::sqrt(Math::power(x - other.x, 2) + Math::power(y - other.y, 2) + Math::power(z - other.z, 2));
}
float Vec3f::magnitude () const {
   return Math::sqrt(Math::power(x, 2) + Math::power(y, 2) + Math::power(z, 2));
}
float Vec3f::magnSquared () {
   return Math::power(x, 2) + Math::power(y, 2) + Math::power(z, 2);
}
Vec3f Vec3f::normalize () const {
   float length = magnitude();
 
   Vec3f v3f;
   if (length==0) {
       v3f.set(0.f, 0.f, 0.f);
   } else {
       float x = this->x / length;
       float y = this->y / length;
       float z = this->z / length;
       v3f.set (x, y, z);
   }
 
   return v3f;
}
float Vec3f::dot2 (const Vec3f &other) {
   if (isNulVector ())
       return 0.f;
   /*Vec3f v (x + other.x, y + other.y, z + other.z);
   return 0.5f * Math::power(v.magnitude(), 2) - Math::power(magnitude(), 2) - Math::power(other.magnitude(), 2);*/

   return x * other.x + y * other.y + z * other.z;
 
}
float Vec3f::dot (const Vec3f &other) const {
   if(isNulVector ())
       return 0;
   Vec3f n1 = *this;
   Vec3f n2 = other;
   if (n1.magnitude() > 1)
       n1 = n1.normalize ();
   if (n2.magnitude () > 1)
       n2 = n2.normalize ();
 
 
   return n1.x * n2.x + n1.y * n2.y + n1.z * n2.z;
}
float Vec3f::getAngleBetween (const Vec3f &other, const Vec3f &n) {
   if(isNulVector() || other.isNulVector())
       return 0;
   float dotProduct = dot(other);
   Matrix3f matrix (x, y, z, other.x, other.y, other.z, n.x, n.y, n.z);
   float fDet = matrix.getDet();
   if (fDet >= 0)
       return Math::acosinus(dotProduct);
   else
       return -Math::acosinus(dotProduct);
}
Vec3f Vec3f::cross (const Vec3f &other) {
 
   return Vec3f (y * other.z - z * other.y, z * other.x - x * other.z, x * other.y - y * other.x);
}
float Vec3f::projOnAxis (const Vec3f &other) {
   Vec3f n1 = normalize();
   Vec3f n2 = other.normalize();
   float dp = n1.dot(n2);
   return dp * magnitude();
}
Vec3f Vec3f::projOnVector(Vec3f other) {
   Vec3f proj;
   float dp = dot(other);
   proj = *this * dp;
   return proj;
}
bool Vec3f::isOpposite (const Vec3f &other) const {
   if (isNulVector() || other.isNulVector())
       return false;
   if ((x > 0.f && other.x < 0.f) || (x < 0.f && other.x > 0.f)
       && (y > 0.f && other.y < 0.f) || (y < 0.f && other.y > 0.f)
       && (z > 0.f && other.z < 0.f) || (z < 0.f && other.z > 0.f))
       return true;
   return false;
}
float* Vec3f::getVec3 () const {
   float v[3] = {x, y, z};
   return v;
}
Vector3f Vec3f::getVec3sf () const {
   return Vector3f(x, y, z);
}
 
Vec3f Vec3f::fabs () const {
   float x = Math::abs(this->x);
   float y = Math::abs(this->y);
   float z = Math::abs(this->z);
   return Vec3f (x, y, z);
}
float& Vec3f::operator[](int i) {
   if (i == 0)
       return x;
   else if (i == 1)
       return y;
   else if (i == 2)
       return z;
   else
       return w;
}
}

J'ai peut être fais une erreur dans le calcul du produit scalaire mais en tout cas moi je vois rien de suspect.

PS : sinon c'est peut être parce que le centre est en 0, 66.66666666... que ce n'est pas très précis.

Car j'ai une différence de 3 degrés.

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



Grade : Maître
Inscrit le: 26 Dec 2007, 17:33
Ecrit le: 28 Juin 2014, 14:38             Message non corrigé

Bon en fait j'ai trouvé!!!

Je pensais que les 2 angles entre la normale et les 2 diagonales étaient les même mais en fait non.

Donc ce n'étais pas sur la valeur des angles entre la normale et le vecteur v que je devais me baser pour le calcul de la distance entre t et p2, mais je devais chercher de quel côté de la normale le vecteur v se trouve, et ensuite calculer les angles comme ceci :
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
static Vec2f projectShapeOnAxisFromCenter(Vec3f axis, Vec3f center, std::vector<Vec3f> vertices, std::vector<Vec3f> normals) {
       float dpMax = 0.f;
       int ind = 0;
       Vec3f v = axis - center;
       for (int i = 0; i < normals.size(); i++) {
           float dp = (normals[i] - center).dot(v);
           if (dp > dpMax) {
               dpMax = dp;
               ind = i;
           }
       }        //for (unsigned int i = 0; i < 3; i++) {
       Vec3f v1 = vertices[ind] - center;
       Vec3f v2 = vertices[(ind+1 == vertices.size()) ? 0 : ind+1] - center;
       float p1 = Math::abs(v1.projOnAxis(v));
       float p2 = Math::abs(v2.projOnAxis(v));
       if (p1 > p2) {
           float tmp = p1;
           p1 = p2;
           p2 = tmp;
       }
       Vec3f n = normals[ind] - center;
       Vec3f vcn = v.cross(n);
       Matrix3f m (v.x, v.y, v.z, n.x, n.y, n.z, vcn.x, vcn.y, vcn.z);
       float angle = (m.getDet() >= 0) ? Math::abs(v1.getAngleBetween(v, v1.cross(v))) : Math::abs(v2.getAngleBetween(v, v2.cross(v)));
       float dp = angle / Math::abs(v1.getAngleBetween(v2, v1.cross(v2)));
       float max = p2;
       float min = (p2 - p1) * dp;
       return Vec2f(min, max);
   }

Algorithme qui parait un peu complexe mais qui me permet de projeter n'importe quel polygone sur un axe entre le centre du polygone et un point p pour avoir le rayon.

Je peux donc tester si un point est dans un polygone 2D ou bien 3D, mais aussi, si un autre polygone ou un cercle est en collision avec le polygone tout ça en réutilisant cette même fonction.

Je suis content d'avoir enfin pu trouvé une solution car depuis le temps que je suis là dessus...

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


Aller à la page : 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11.


Hébergeur du site : David
Version PHP : 5.4.45-0+deb7u2
Uptime : 269 jours 20 heures 36 minutes
Espace libre : 1546 Mo
Dernière sauvegarde : 20/08/2019
Taille de la sauvegarde : 1114 Mo


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

Page générée en 3.858 secondes


Nos sites préférés
- Création d'un jeu de plateforme de A à Z avec SDL
- Zelda ROTH : Jeux amateurs sur le thème de Zelda
- Zeste de Savoir : la connaissance pour tous et sans pépins
- YunoHost : s'héberger soi-même en toute simplicité
- Site de Fvirtman : recueil de projets et de codes en C et C++
- Par ici la sortie : le site des idées de sorties


  © 2005-2019 linor.fr - Toute reproduction totale ou partielle du contenu de ce site est strictement interdite.