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

Développement 2D, 3D et Jeux Discussion :

Moteur de lumières dynamiques en dimension 2


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre éprouvé
    Moteur de lumières dynamiques en dimension 2
    Bonjour,

    Je viens vous présenter un moteur de lumières dynamiques en dimension 2 que j'ai conçu à la base pour mon projet jeu, mais qui peut facilement être adaptable à tout autre application en dimension 2.

    Suite à des avis positif sur ce moteur, j'ai décidé d'en faire un article sur mon blog et enfin un tutoriel sur Developpez.

    J'explique donc de A à Z le fonctionnement de ce moteur, ainsi que la façon dont je l'ai conçu.

    Vous pouvez consulter l'article ici.



    Bonne lecture.
    Holyspirit : Hack'n'Slash amateur gratuit !

    www.holyspirit.fr

  2. #2
    Membre éprouvé
    Petite correction dans l'article :

    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
    if(l1.x * l1.x + l1.y * l1.y < m_radius * m_radius)
            {
                sf::Vector2f i = Intersect(pt1,pt2,sf::Vector2f (0,0),l1);
     
                if((pt1.x > i.x && pt2.x < i.x) || (pt1.x < i.x && pt2.x > i.x))
                if((pt1.y > i.y && pt2.y < i.y) || (pt1.y < i.y && pt2.y > i.y))
                    if((l1.y > 0 && i.y > 0) || (l1.y < 0 && i.y < 0))
                    if((l1.x > 0 && i.x > 0) || (l1.x < 0 && i.x < 0))
                    AddTriangle(i, pt2, w, m_wall), pt2 = i;
            }
            if(l2.x * l2.x + l2.y * l2.y < m_radius * m_radius)
            {
                sf::Vector2f i = Intersect(pt1,pt2,sf::Vector2f (0,0),l2);
     
                if((pt1.x > i.x && pt2.x <= i.x) || (pt1.x <= i.x && pt2.x >= i.x))
                if((pt1.y > i.y && pt2.y <= i.y) || (pt1.y <= i.y && pt2.y >= i.y))
                    if((l2.y >= 0 && i.y >= 0) || (l2.y <= 0 && i.y <= 0))
                    if((l2.x >= 0 && i.x >= 0) || (l2.x <= 0 && i.x <= 0))
                    AddTriangle(pt1, i, w, m_wall), pt1 = i;
            }


    Devient :

    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
    if(l1.x * l1.x + l1.y * l1.y < m_radius * m_radius)
            {
                sf::Vector2f i = Intersect(pt1,pt2,sf::Vector2f (0,0),l1);
     
                if (pt1 != i && pt2 != i)
                if((pt1.x >= i.x && pt2.x <= i.x) || (pt1.x <= i.x && pt2.x >= i.x))
                if((pt1.y >= i.y && pt2.y <= i.y) || (pt1.y <= i.y && pt2.y >= i.y))
                    if((l1.y >= 0 && i.y >= 0) || (l1.y <= 0 && i.y <= 0))
                    if((l1.x >= 0 && i.x >= 0) || (l1.x <= 0 && i.x <= 0))
                    AddTriangle(i, pt2, w, m_wall), pt2 = i;
            }
            if(l2.x * l2.x + l2.y * l2.y < m_radius * m_radius)
            {
                sf::Vector2f i = Intersect(pt1,pt2,sf::Vector2f (0,0),l2);
     
                if (pt1 != i && pt2 != i)
                if((pt1.x > i.x && pt2.x <= i.x) || (pt1.x <= i.x && pt2.x >= i.x))
                if((pt1.y > i.y && pt2.y <= i.y) || (pt1.y <= i.y && pt2.y >= i.y))
                    if((l2.y >= 0 && i.y >= 0) || (l2.y <= 0 && i.y <= 0))
                    if((l2.x >= 0 && i.x >= 0) || (l2.x <= 0 && i.x <= 0))
                    AddTriangle(pt1, i, w, m_wall), pt1 = i;
            }


    Afin d'éviter des problèmes quand on a un mur vertical.

    PS : Merci à 4ian pour cette correction.
    Holyspirit : Hack'n'Slash amateur gratuit !

    www.holyspirit.fr

  3. #3
    Expert éminent sénior
    Salut tu pourrais un peu factoriser ton code il est pas terrible
    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
     
    if(l1.x * l1.x + l1.y * l1.y < m_radius * m_radius)
            {
                sf::Vector2f i = Intersect(pt1,pt2,sf::Vector2f (0,0),l1);
     
                if (pt1 != i && pt2 != i)
                if((pt1.x >= i.x && pt2.x <= i.x) || (pt1.x <= i.x && pt2.x >= i.x))
                if((pt1.y >= i.y && pt2.y <= i.y) || (pt1.y <= i.y && pt2.y >= i.y))
                    if((l1.y >= 0 && i.y >= 0) || (l1.y <= 0 && i.y <= 0))
                    if((l1.x >= 0 && i.x >= 0) || (l1.x <= 0 && i.x <= 0))
                    AddTriangle(i, pt2, w, m_wall), pt2 = i;
            }
            if(l2.x * l2.x + l2.y * l2.y < m_radius * m_radius)
            {
                sf::Vector2f i = Intersect(pt1,pt2,sf::Vector2f (0,0),l2);
     
                if (pt1 != i && pt2 != i)
                if((pt1.x > i.x && pt2.x <= i.x) || (pt1.x <= i.x && pt2.x >= i.x))
                if((pt1.y > i.y && pt2.y <= i.y) || (pt1.y <= i.y && pt2.y >= i.y))
                    if((l2.y >= 0 && i.y >= 0) || (l2.y <= 0 && i.y <= 0))
                    if((l2.x >= 0 && i.x >= 0) || (l2.x <= 0 && i.x <= 0))
                    AddTriangle(pt1, i, w, m_wall), pt1 = i;
            }

    A quoi ça sert les fonctions en langage de programmation ?
    Tu vois bien qu'il y a du code qui se ressemble dans les 2 conditions donc tu peux faire une fonction qui teste si des coordonnées de points sont inférieures à un rayon au carré
    La théorie, c'est quand on sait tout et que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.
    ( A Einstein)

  4. #4
    Membre éprouvé
    Oui, j'y ait pensé, mais je ne trouvais pas ça particulièrement utile dans ce cas-ci.
    Maintenant, si tu trouve que c'est réellement important, ça peut facilement se faire.
    Holyspirit : Hack'n'Slash amateur gratuit !

    www.holyspirit.fr

  5. #5
    Expert éminent sénior
    Citation Envoyé par Gregouar Voir le message
    Oui, j'y ait pensé, mais je ne trouvais pas ça particulièrement utile dans ce cas-ci.
    Maintenant, si tu trouve que c'est réellement important, ça peut facilement se faire.
    moi je m'en fiche mais imagines que tu gères un projet avec des milliers de lignes de code !
    Après si tu dois te relire et modifier un truc bonjour les problèmes !
    La théorie, c'est quand on sait tout et que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.
    ( A Einstein)

  6. #6
    Membre éprouvé
    C'est sûr, mais ici on ne parle que d'un groupe de quelques lignes qui ne revient que deux fois et dans le cadre d'un tutoriel.

    PS :
    moi je m'en fiche mais imagines que tu gères un projet avec des milliers de lignes de code !
    Ne t'en fais pas pour ça, j'ai l'habitude de m'y retrouver dans mon foutoir de 25 000 lignes.
    Holyspirit : Hack'n'Slash amateur gratuit !

    www.holyspirit.fr

  7. #7
    Membre éprouvé
    J'avoue qu'il faudrait monter d'un cran le niveau d'abstraction là
    Sinon beau travail, le résultat est très sympathique

  8. #8
    Membre éprouvé
    Mise à jour du fichier d'exemple avec les sources pour la nouvelle API SFML2.
    Holyspirit : Hack'n'Slash amateur gratuit !

    www.holyspirit.fr

  9. #9
    Nouveau Candidat au Club
    Division par 0
    Bonjour.
    Dans (d - b) / (a - c) on peux avoir une division par 0 si les droite sont parallèle a et c sont égaux donc a - c = 0, donc (d - b) / (a - c) = NaN.

    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
     
    sf::Vector2f Intersect(sf::Vector2f p1, sf::Vector2f p2, sf::Vector2f q1, sf::Vector2f q2)
    {
        sf::Vector2f i;
     
        if((p2.x - p1.x) == 0 && (q2.x - q1.x) == 0)
            i.x = 0, i.y = 0;
        else if((p2.x - p1.x) == 0)
        {
            i.x = p1.x;
     
            float c = (q2.y - q1.y) / (q2.x - q1.x);
            float d = q1.y - q1.x * c;
     
            i.y = c * i.x + d;
        }
        else if((q2.x - q1.x) == 0)
        {
            i.x = q1.x;
     
            float a = (p2.y - p1.y) / (p2.x - p1.x);
            float b = p1.y - p1.x * a;
     
            i.y = a * i.x + b;
        }
        else
        {
            float a = (p2.y - p1.y) / (p2.x - p1.x);
            float b = p1.y - p1.x * a;
     
            float c = (q2.y - q1.y) / (q2.x - q1.x);
            float d = q1.y - q1.x * c;
     
            i.x = (d-b)/(a-c);
            i.y = a * i.x + b;
        }
     
        return i;
    }

###raw>template_hook.ano_emploi###