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

XNA/Monogame Discussion :

[Monde isométrique] clique sur une case


Sujet :

XNA/Monogame

  1. #1
    Membre du Club
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    73
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 73
    Points : 47
    Points
    47
    Par défaut [Monde isométrique] clique sur une case
    Bonjour à tous,
    J'essaye d'avoir comme rendu une carte 2D isométrique, voilà un premier résultat proche de l'isométrique, mais le problème ne se pose pas là.


    J'aimerais savoir comment reconnaître un clique sur une case, quels sont les différents moyens? J'avais penser à faire des milliers de conditions (du style vérifier si la souris est à cette position, etc.) mais c'est du n'importe quoi.

    Bon voilà, j'espère que j'ai pu me faire comprendre et qu'il y aura des personnes qui prendront la peine de répondre.

    Merci à vous, à plus.

    Edit: image mise à jour (et petit problème avec les axes), problème non résolu.

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 218
    Points : 311
    Points
    311
    Par défaut
    Je ne suis pas un spécialiste, mais je pense que si tu poses ton pb comme un repère orthonorme qui a subit une rotation de 45° ca te faciliterait le raisonnement.
    Si tu commences par régler un repère orthonormé classique, tes cellules du bas aurait comme coordonnées 4,1 et 5,1, celle du haut 1,4. Il suffit après d'appliquer la rotation de 45° avec un sin/cos 45° sur tes coordonnées et tes conditions.

  3. #3
    Membre régulier
    Inscrit en
    Septembre 2010
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 78
    Points : 113
    Points
    113
    Par défaut
    Tu devrais jeter un coup d'oeil sur ça http://www.developpez.net/forums/d88...-isometriques/

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    J'ai étudié cette question cette année, est ma réponse est la suivante:

    Faire un premier repérage comme si on était en 2D (non isométrique). Cela permet d'avoir une première approximation de la tuile sur laquelle nous sommes.
    Maintenant, en fait, notre approximation, peut nous donner 5 tuiles ... (4 coins) celle du centre. Pour faire un répérage des coin, je divise le rectangle du premier repérage, en 4. Je repère quel rectangle contient mon curseur ( if x < width/2) ... et puis , finalement, on coupe le rectangle selectionner en deux ( if x < y ) ... cela nous indique dans quel moitié (coupage en diagonale) le curseur est. Selon le cas, il sera en dehors donc, sur la tuile à coté, donc on appliquera un décalage, sinon ... bah on avait la bonne tuile depuis le début (on ne change rien).

    Voilà ... je peux comprendre que cela ne soit pas clair sans schémas ...
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre du Club
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    73
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 73
    Points : 47
    Points
    47
    Par défaut
    Merci beaucoup pour vos réponses! Je vais les voir de plus prêt, je vous tiens au courant.
    Edit: le code n'est pas très clair dans le lien que tu m'a donné Nollo (il y a des variables qui tombent du ciel, je comprends pas), néanmoins je crois que la méthode est la bonne. Je vais aussi tenter de faire la même chose que macumba et LittleWhite.

  6. #6
    Membre habitué
    Inscrit en
    Avril 2011
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 59
    Points : 154
    Points
    154
    Par défaut
    Si je ne me trompe pas les "formules magiques" du lien de Nollo viennent d'une formule de changement de repère simplifiée grace à certaines propritétés des vecteurs utilisés comme base du repère "carte".

    En gros faut résoudre:

    1) sx = mx * i.x + my * j.x
    2) sy = mx * i.y + my * j.y

    i, j sont les vecteurs du repère carte.
    sx, sy les coordonnées écrans(s pour screen).
    mx, my les coordonées carte (celles qu'on cherche à trouver/m pour map).

    J'ai pas trop le temps la, mais j'essayerais de développer demain

  7. #7
    Membre régulier
    Inscrit en
    Septembre 2010
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 78
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par Torshid Voir le message
    Merci beaucoup pour vos réponses! Je vais les voir de plus prêt, je vous tiens au courant.
    Edit: le code n'est pas très clair dans le lien que tu m'a donné Nollo (il y a des variables qui tombent du ciel, je comprends pas), néanmoins je crois que la méthode est la bonne. Je vais aussi tenter de faire la même chose que macumba et LittleWhite.
    Qu'est ce que tu ne comprends pas dans le lien ?

  8. #8
    Membre habitué
    Inscrit en
    Avril 2011
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 59
    Points : 154
    Points
    154
    Par défaut
    Voila la version longue. En fait quand on regarde une carte en vue iso, on voit qu'en fait c'est une bête repère carthésien de base i, j (voir image en pièce jointe). i et j sont en fait des vecteurs suivent les cotés des tiles. Et l'origine de ce répère est le magnifique point jaune sur mon dessin.





    Donc a partir des coordonnées de la souris, ils suffit d'appliquer un changement de repère du repère écran vers le repère de la carte pour connaitre le coordonées du tile cliqué.

    Donc de resoudre à peu près (*):

    1) sx = mx * i.x + my * j.x
    2) sy = mx * i.y + my * j.y


    On va partir de 1)

    sx = mx * i.x + my * j.x
    <=> mx * i.x = sx - my * j.x
    <=> mx = (sx - my * j.x)/i.x
    <=> mx = ((sx/i.x) - (my * j.x/i.x))

    On injecte ca dans 2):

    sy = ((sx/i.x) - (my * j.x/i.x)) * i.y + my * j.y
    <=> sy * i.x /i.x = (sx* i.y/i.x) - (my * j.x* i.y/i.x) + (my * j.y * i.x)/ i.x
    <=> sy * i.x = (sx* i.y) - (my * j.x* i.y) + (my * j.y * i.x)
    <=> (my * j.y * i.x) - (my * j.x* i.y) = sy * i.x - sx * i.y
    <=> my * (j.y * i.x - j.x* i.y) = sy * i.x - sx * i.y
    <=> my = (sy * i.x - sx * i.y) / (j.y * i.x - j.x* i.y)

    Voila gagné on a récupérer my à partir de donnée connues(les coordonnées écran et nos vecteurs). Donc si j'avais le courage je réinjecterais le résultat de 2) dans 1) pour avoir mx lui aussi seulement en fonction de i, j et des coordonnées de départ. Mais ca devient un peu barbare Mais on est dans un cas très générique.

    Je parlais d'une simplification due au caractéristiques des vecteurs dans mon premier message. En fait dans le cas de la vue isométrique on voit que:

    i.x = -j.x
    i.y = j.y

    On reprends le résultats de 2)

    2') my = (sy * i.x - sx * i.y) / (i.y * i.x + i.x* i.y)
    <=> my = (sy * i.x - sx * i.y) / ( 2 * i.y * i.x)
    <=> my = (sy * i.x)/ ( 2 * i.y * i.x) - (sx * i.y) / ( 2 * i.y * i.x)
    <=> my = sy / (2 * i.y) - sx / (2 * i.x)

    Ca commence a fichetrement à ressembler à:

    position.Y = (float)Math.Ceiling((y / tilesand.Height) - (x / tilesand.Width));

    Non hein?

    En le tilesand.height vient du fait que notre i.y = (tilesand.height/2) et que i.x = (tilesand.Width/2) et voila on retombe sur nos pattes.

    Voila pour l'explication longue, je vous laisse vous amuser pour trouver de la même manière mx.

    *) en fait il un petit offset de décalage a appliquer sur les coordonées écrans vu que très probablement l'origine de la carte ne sera pas sur l'origine de l'écran.

  9. #9
    Membre du Club
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    73
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 73
    Points : 47
    Points
    47
    Par défaut
    Merci beaucoup Anything, les autres aussi! J’espère que le sujet va en aider plus d'un.

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

Discussions similaires

  1. Griser un champ Texte quand on clique sur une case à cocher
    Par Robjerey dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 16/12/2014, 15h54
  2. Associer un clique et un double clique sur une listebox
    Par mcdonald dans le forum Tkinter
    Réponses: 3
    Dernier message: 10/06/2006, 16h57
  3. Réponses: 4
    Dernier message: 23/01/2006, 11h28
  4. [AS] Tester si l'utilisateur a cliqué sur une fonction
    Par PrinceMaster77 dans le forum Flash
    Réponses: 2
    Dernier message: 11/01/2006, 15h28
  5. Gestion des évènements lors d'un clique sur une image.
    Par yoghisan dans le forum Débuter
    Réponses: 7
    Dernier message: 23/06/2005, 19h04

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