IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de Gregouar
    Profil pro
    Chercheur en mathématiques
    Inscrit en
    Décembre 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur en mathématiques

    Informations forums :
    Inscription : Décembre 2007
    Messages : 246
    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.

  2. #2
    Membre émérite
    Avatar de Gregouar
    Profil pro
    Chercheur en mathématiques
    Inscrit en
    Décembre 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur en mathématiques

    Informations forums :
    Inscription : Décembre 2007
    Messages : 246
    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.

  3. #3
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 588
    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 : 8 588
    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é

  4. #4
    Membre émérite
    Avatar de Gregouar
    Profil pro
    Chercheur en mathématiques
    Inscrit en
    Décembre 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur en mathématiques

    Informations forums :
    Inscription : Décembre 2007
    Messages : 246
    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.

  5. #5
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 588
    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 : 8 588
    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 !

  6. #6
    Membre émérite
    Avatar de Gregouar
    Profil pro
    Chercheur en mathématiques
    Inscrit en
    Décembre 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur en mathématiques

    Informations forums :
    Inscription : Décembre 2007
    Messages : 246
    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.

Discussions similaires

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

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