Description

Mise à jour à venir.

Ghost Mysteries

Plus mon travail avançait avec OpenGL via LWJGL, plus je me décourageais.
Rien ne fonctionnait, le chargement des images était trop long et en plus
elles ne se dessinaient pas à l’écran. En suivant la méthodologie de
Kevin Glass, j’ai finalement réussi à obtenir un résultat intéressant.
Les projectiles sont bien rendus. Mais je n’ai pas réglé le temps de
chargement. En plus, jusqu’à tout récemment, je ne pouvais afficher
d’objets primitifs à l’écran. J’ai cherché une solution sur le web sans
rien trouver. Mais à force de réfléchir, j’ai résolu mon problème.

Un objet primitif, est un objet dessiné directement avec des fonctions
d’OpenGL. Un carré par exemple, ou une ligne. Je voulais en dessiner sans
passer par des images pré-dessinées pour pouvoir représenter des lasers à
longueurs variables ou différentes choses (effets visuels) destinées à
évoluer selon la situation de jeu. Comme un système de particule, de la
pluie, etc. Sauf que malgré tous mes efforts, les formes n’étaient pas
rendues à l’écran. Personne ne semblait avoir de solution à ce problème,
ce qui est relativement rare sur le web. Voici ma solution :

public void gameRender2(){

        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
              EnemyFireManager2.INSTANCE.displayGL();

cWhiteTexture32x32.bind();
    GL11.glBegin(GL11.GL_POLYGON);
    {
      float color = 1f;
      GL11.glColor4f(color, color, color, 1f);

      GL11.glVertex2f(position.getStepX() + 0.0f, position.getStepY() + 0.0f);
      GL11.glVertex2f(position.getStepX() + 0.0f, position.getStepY() + 30.0f);
      GL11.glVertex2f(position.getStepX() + 40.0f, position.getStepY() + 30.0f);
      GL11.glVertex2f(position.getStepX() + 60.0f, position.getStepY() + 15.0f);
      GL11.glVertex2f(position.getStepX() + 40.0f, position.getStepY() + 0.0f);
    }
    GL11.glEnd();

GL11.glPushMatrix();
GL11.glColor3f(1f,1f,1f);
GL11.glBegin(GL11.GL_LINES);
GL11.glVertex2f(100.0f, 100.0f); // origin of the FIRST line
GL11.glVertex2f(300.0f, 140.0f); // ending point of the FIRST line
GL11.glVertex2f(120.0f, 170.0f); // origin of the SECOND line
GL11.glVertex2f(540.0f, 120.0f); // ending point of the SECOND line
GL11.glEnd( );
GL11.glPopMatrix();

    int factor = 0;
    for (int i = 0; i < firePress; i++) {
         factor = i * 60;
    GL11.glBegin(GL11.GL_TRIANGLE_FAN);
        GL11.glColor4f(color1, color2, color3, 1f); // 0 et 1.
        GL11.glVertex2f(x + factor, y);
        for (int angle = 0; angle < 400; angle += 40) {
            GL11.glVertex2f(x + factor + Trigo.sin(angle) * (radius + factor/10), y + Trigo.cos(angle) * (radius + factor/10));
        }
    GL11.glEnd();
    }
    }    // fin de la méthode.


Il s’agit de ma méthode d’affichage des éléments de jeu dans ma classe
principale. Évidemment, elle n’est pas complète. C’est cette ligne qui
s’occupe d’afficher les projectiles :
EnemyFireManager2.INSTANCE.displayGL();. Tout fonctionnait
correctement pour l’affichage de formes texturées, mais les primitives ne
s’affichaient pas. Jusqu’à ce que j’ajoute la ligne suivante :
cWhiteTexture32x32.bind();.

Mon raisonnement est le suivant, les primitives semblent exister puisque
lorsque l’écran est pollué d’images (projectiles), la forme des
primitives est parfois visible (noir sur fond noir). Et ce même si je
demandais que les primitives soient colorées en blanc. Je me suis demandé
alors, si le problème ne venait pas du fait que ces formes n’avaient pas
de textures. En fait c’était un peu comme peindre sur du vide. Alors,
j’ai simplement créé une texture 32x32 blanche. Tout simplement. Un carré
blanc. Que j’ai chargé, et que j’ai « bindé » avant le rendu des
primitives. Ligne : cWhiteTexture32x32.bind();.

Et bien, j’avoue que sans trop savoir pourquoi, les formes ont étés
dessinées exactement comme je le souhaitais par la suite. Avec la couleur
que je souhaitais. Peut importe que le carré soit blanc ou non. La
couleur venait de GL11.glColor3f ou GL11.glColor4f. En plus, j’ai lié la
texture à OpenGL qu’une fois. Toutes les primitives, même les lignes ont
été rendus adéquatement. Je n’ai pas encore fini mon expérimentation,
mais je suis convaincu que je pourrai appliquer des effets de
transparence ou de brouillage à mes formes.

Enfin, je suis bien content. C’est le mystère du fantôme blanc.

Commentaires