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 [Tutoriel]


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre éclairé
    Avatar de Gregouar
    Profil pro
    Doctorant en mathématiques
    Inscrit en
    décembre 2007
    Messages
    228
    Détails du profil
    Informations personnelles :
    Âge : 27
    Localisation : Belgique

    Informations professionnelles :
    Activité : Doctorant en mathématiques

    Informations forums :
    Inscription : décembre 2007
    Messages : 228
    Points : 811
    Points
    811
    Par défaut 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 éclairé
    Avatar de Gregouar
    Profil pro
    Doctorant en mathématiques
    Inscrit en
    décembre 2007
    Messages
    228
    Détails du profil
    Informations personnelles :
    Âge : 27
    Localisation : Belgique

    Informations professionnelles :
    Activité : Doctorant en mathématiques

    Informations forums :
    Inscription : décembre 2007
    Messages : 228
    Points : 811
    Points
    811
    Par défaut
    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

    Profil pro
    Développeur informatique
    Inscrit en
    novembre 2006
    Messages
    6 906
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : novembre 2006
    Messages : 6 906
    Points : 14 577
    Points
    14 577
    Par défaut
    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é
    Ce dont on ne peut parler il faut le taire ( Wittgenstein )

  4. #4
    Membre éclairé
    Avatar de Gregouar
    Profil pro
    Doctorant en mathématiques
    Inscrit en
    décembre 2007
    Messages
    228
    Détails du profil
    Informations personnelles :
    Âge : 27
    Localisation : Belgique

    Informations professionnelles :
    Activité : Doctorant en mathématiques

    Informations forums :
    Inscription : décembre 2007
    Messages : 228
    Points : 811
    Points
    811
    Par défaut
    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

    Profil pro
    Développeur informatique
    Inscrit en
    novembre 2006
    Messages
    6 906
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : novembre 2006
    Messages : 6 906
    Points : 14 577
    Points
    14 577
    Par défaut
    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 !
    Ce dont on ne peut parler il faut le taire ( Wittgenstein )

  6. #6
    Membre éclairé
    Avatar de Gregouar
    Profil pro
    Doctorant en mathématiques
    Inscrit en
    décembre 2007
    Messages
    228
    Détails du profil
    Informations personnelles :
    Âge : 27
    Localisation : Belgique

    Informations professionnelles :
    Activité : Doctorant en mathématiques

    Informations forums :
    Inscription : décembre 2007
    Messages : 228
    Points : 811
    Points
    811
    Par défaut
    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é Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    février 2006
    Messages
    798
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : février 2006
    Messages : 798
    Points : 1 058
    Points
    1 058
    Par défaut
    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 éclairé
    Avatar de Gregouar
    Profil pro
    Doctorant en mathématiques
    Inscrit en
    décembre 2007
    Messages
    228
    Détails du profil
    Informations personnelles :
    Âge : 27
    Localisation : Belgique

    Informations professionnelles :
    Activité : Doctorant en mathématiques

    Informations forums :
    Inscription : décembre 2007
    Messages : 228
    Points : 811
    Points
    811
    Par défaut
    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
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    mars 2019
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : mars 2019
    Messages : 1
    Points : 1
    Points
    1
    Par défaut 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;
    }

Discussions similaires

  1. Moteur de lumière 2D dynamique
    Par pokap dans le forum Débuter
    Réponses: 5
    Dernier message: 23/11/2010, 00h06
  2. Réponses: 4
    Dernier message: 19/12/2006, 21h06
  3. declaration d'un tableau dynamique 2 dimensions
    Par mike600river dans le forum C++Builder
    Réponses: 4
    Dernier message: 22/05/2006, 09h53
  4. Réponses: 1
    Dernier message: 09/03/2006, 18h25

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