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 :

[2D isometrique] Un point dans une tile


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 16
    Points : 14
    Points
    14
    Par défaut [2D isometrique] Un point dans une tile
    Bonjour à toutes et à tous.

    Je viens de me lancer dans la création d'un jeu en 2D en vue isométrique. J'ai déjà réaliser plusieurs jeux 2D avec une surcouche de la SDL2 que j'ai développez en C++. Je suis confronté à un problème assez récurrent sur l'isométrie.
    Je n'arrive pas à déterminer sur quelle tile se trouve ma sourie.
    J'ai parcourue beaucoup de sujet et essayer plusieurs méthodes mais aucune ne semble fonctionner ( du moins a 100% )
    Si je viens vers vous c'est surtout parce que je n'arrive pas à bien comprendre le fonctionnement des méthodes que j'utilise. En gros je trouve un code je le recopie et l'adapte a mon langage et a ma situation, pourtant je ne comprend pas pourquoi ce code doit fonctionner, il est donc difficile pour moi de déterminer où cela coince ^^

    Donc pour faire simple voici mon terrain ainsi que son indexation :
    Nom : screen.png
Affichages : 342
Taille : 145,6 Ko

    Je cherche donc a déterminer sur quelle tile la sourie se trouve.

    J'ai essayer la méthode suivante : http://www.developpez.net/forums/d78...-isometriques/ détaillé par nouknouk, j'aime beaucoup ce système car on n'est pas obligé de parcourir tout le tableau qui contient notre map. Mais je ne comprend pas bien la logique des calculs.


    Enfin bref, j'espère que quelqu'un ici s'y connait et pourrait éventuellement me donner un coup de main ou des conseils pour l'isométrie, c'est ma première fois et je me rend compte que j'aurais du être plus attentif en cours de maths XD ^^

    Merci d'avance de votre aide et de votre intérêt pour le sujet

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    A la limite tu peux faire un test point/triangle non ?b( 1 tile iso = 2 triangle)

  3. #3
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Salut je me suis creusé la tête pendant un bon bout de temps la dessus, et je suis arrivé à la formule que j'explique dans ce thread:
    http://www.developpez.net/forums/d15...d-isometrique/.

    N'hésite pas à tester et à me faire des retours la dessus .
    Pour l'instant je n'ai pas eu de soucis à son utilisation, ni concernant son perfectionnement, mais je serais curieux de voir si celà te convient aussi.
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 16
    Points : 14
    Points
    14
    Par défaut
    Oula excuse moi du temps de réponse aussi long mais j'ai galerer avec ma connexion internet ^^

    Donc ton algo marche plutôt bien j'ai un bon resultat, en revanche il y a un problème de précision, je te laisse regarder, j'ai fait une video pour te montrer le problème :


    et voici le code :
    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
    //            RECUPERATION DES COORDONNEES DE LA TILE CLIQUER ( indexe du tableau )
                int CaseWidth = TILE_WIDTH/2;
                int CaseHeight = TILE_HEIGHT/2;
     
                float casey = ((((e.motion.y-origin.y)*CaseWidth)/CaseHeight)-(e.motion.x-origin.x))/(CaseWidth+CaseWidth);
                float casex = ((casey*CaseWidth+(e.motion.x - origin.x))/CaseWidth) - 1;
                int vx = casex + 0.5;
                int vy = casey + 0.5;
     
    //            RECUPERATION DES COORDONNEES DE LA TILE CLIQUER ( position en pixels )
                int x = origin.x + (int)((vx - vy) * TILE_WIDTH / 2.);
                int y = origin.y + (int)((vx + vy) * TILE_HEIGHT / 2.);
     
                cursor.setDestX(x);
                cursor.setDestY(y);
                cout << vx << " " << vy << endl;
    Alors sachant que mes tiles font du 128 par 64 ( la taille de l'image qui contient la tile )
    e.motion.x ou .y me donne les coordonnées dans la fenetre de ma sourie.
    et le cursor est un objet qui me me permet de placer le rectangle rouge orange a l'écran


    Alors après avoir essayer de bidouiller un peu ton algo je n'arrive pas a bien comprendre ce qui peut cosser ce "décalage".

    Je te remercie de ton aide et ton algo est vraiment sympas tu m'as vraiment aider a avancer

  5. #5
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Tu as vérifier que les coordonnée retournée par mon algo ne sont pas bonnes?
    Je parle du vx et vy?

    Tu utilise TILE_WIDTH/2 et TILE_HEIGHT/2 pour définir la position des premier pixel de couleur, peux-tu vérifier que ça correspond bien? (que tu n'as pas de ligne de pixel vide dans tes images de tile).

    Sinon ça pourrait etre l'approximation des floatant qui pose problème.

    C'est étrange car je n'ais pas eu ce soucis.

    Concernant l'affichage tu utilise bien le même algo que moi?

    Tu observe ce décalage que sur les tile du haut, ou sur toute les tiles?

    Il faudrait que tu regarde le résultat avant l'approximation, c'est surement elle qui fout le bazar .

    Au passage, link moi tes tiles, que je teste avec mon algo d'affichage, si il y a des améliorations à faire, je les ferais directement sur mon poste pour te dire ce qu'il ne va pas .
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 16
    Points : 14
    Points
    14
    Par défaut
    Alors les coordonnées vx et vy sont bien les bonnes grâce au flux cout je le verifie et y'a aucun soucis la dessus. Enfin disont que la tile surligné correspond bien au vx et vy.

    Pour ce qui est de l'affichage oui je pense faire comme toi, peut être que je me trompe :
    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
        int beg_x = dest.x;
        int beg_y = dest.y;
        for(u_int i(0); i < world.size(); ++i)
        {
            dest.x = beg_x - i*src.w/2;
            dest.y = beg_y + i*src.h/2;
            for(u_int j(0); j < world[i].size(); ++j)
            {
                src.y = world[i][j] * src.h;
                SDL_RenderCopy(renderer, texture, &src, &dest);
     
                dest.x += src.w/2;
                dest.y += src.h/2;
            }
        }
    Dans le doute j'ai repris ton algo en l'adaptant au miens et ça a donnée le même résultat :

    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
        int x = 0;
        int y = 0;
        while (y < world.size())
        {
            x = 0;
            while (x < world[y].size())
            {
                //world[y][x].setPosition((x * TILE_WIDTH/2) - (y * TILE_WIDTH/2), (y * TILE_HEIGHT/2) + (x * TILE_HEIGHT/2));
                dest.x = (x * TILE_WIDTH/2) - (y * TILE_WIDTH/2) + beg_x;
                dest.y = (y * TILE_HEIGHT/2) + (x * TILE_HEIGHT/232) + beg_y;
                src.y = world[y][x] * src.h;
                SDL_RenderCopy(renderer, texture, &src, &dest);
                x++;
            }
            y++;
        }
    Le décalage a lieu partout de la même manière j'ai l’impression.

    Voici ma tile :

    Nom : tile1.png
Affichages : 279
Taille : 8,2 Ko

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 16
    Points : 14
    Points
    14
    Par défaut
    ..... ok j'ai trouver. Comme tu m'as dit de vérifier les valeur avant aproximation, j'ai pus constater que casey contenant toujours un entier. J'ai mis CaseWidth et CaseHeight en int et non en float


    Je te remercie énormément de ton aide Je ne comprend pas encore bien la logique de ton algorithme et ça m'embête de l'utiliser sans le comprendre, mais je vais y travailler

    Merci beaucoup et bonne continuation

  8. #8
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Ah oui j'ai oublié de mettre les types dans mon algo pour pas qu'a la compilation le calcul de l'algo se fasse sur des int et non pas des float ^^.

    Je modifierais ça dans mon post d'origine.

    En fait pour le calcul de l'algorythme, je suis partis de la formule d'affichage et j'ai fais le chemin inverse, je posterais une explication dès que j'aurais un peu de temps.

    En gros on a un premier algo qui transforme les coordonnées monde en coordonnées écran (formule d'affichage).
    Ensuite il suffit de reprendre cette formule, écrire un système d'équation à deux inconnues, et le résoudre . Donc je fais le chemin inverse de ma formule, ce qui me permet d'avoir des coordonnées mondes en fonction de coordonnées écrans. J'écrirais les formules dans mon post de base, ça pourra servir à tout le monde.

    A la fin de la formule, on obtiens des coordonnées monde flotante, il suffit de faire un approximation du flotant pour avoir le résultat entier, pour ça j'utilise la fonction round, et comme j'arrondis à l'unité la plus proche, ça revient au même que rajouter 0.5 et garder que la partie entière (ce qui est fait lors de la conversion d'un flotant en entier).

    Je suis en train de faire un algo dans le même style pour pouvoir afficher des tiles sur plusieurs niveau, mais c'est un peu plus compliqué avec une composante Z, surtout pour retrouver la case, je teste plusieurs technique pour le moment entre le lancer de rayon, ou le lancer de rayon.

    En tout cas si tu as besoin d'aide pour ton projet, n'hésite pas à demander .
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 16
    Points : 14
    Points
    14
    Par défaut
    ok très bien, si j'ai des soucis je n’hésiterai pas a te contacter alors

    Merci beaucoup et bon courage pour ton proejt avec les niveau en hauteur, ça doit pas être simple :o ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Relier des points dans une paintbox par une courbe
    Par Benjikos dans le forum Débuter
    Réponses: 4
    Dernier message: 19/08/2007, 13h06
  2. Réponses: 3
    Dernier message: 03/08/2007, 07h36
  3. interdiction d'un point dans une textbox
    Par fmris dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/07/2007, 15h09
  4. [Question] Deux-points dans une URL
    Par Karashi dans le forum Général Conception Web
    Réponses: 2
    Dernier message: 27/05/2007, 22h42
  5. le pixel noir le plus proche d'un point dans une image
    Par tlemcenvisit dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 28/03/2006, 08h44

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