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 ISO] Trouver la bonne tile?


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Yordarus
    Invité(e)
    Par défaut [2D ISO] Trouver la bonne tile?
    Bonjour à tous.

    Voilà je suis en train de coder un petit jeu en 2D isométrique, mais j'ai un problème. J'ai réussi à afficher mon terrain, j'ai une classe camera, des méthodes pour calculer les coordonnées écran -> iso.

    Cependant pour que ça marche, je ne dois pas bouger la camera, en effet quand le terrain est affiché à partir des coordonnées 0,0 et la camera à 0,0, pas de problème. Mais une fois la camera déplacé, plus moyen.

    Voici mon code, je pense que ça suffit pour trouver la solution. Je pense que je dois donc soustraire ou additionner la position de la camera avec autre chose, enfin un calcul ( bête sûrement ) mais je n'arrive pas à trouver lequel.

    Affichage:
    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
    int row = 1;
     for (int l = 0; l < floor.GetLength(0); l++)
                {
                    for (int h = 0; h < floor.GetLength(1); h++)
                    {
                        //map[l, h].setCoordonnes(position);
                        if (floor[l, h] == 0)
                        {
                            spriteBatch.Draw(tilesand, position, Color.White);
                        }
                        else
                        {
                            spriteBatch.Draw(tilestone, position, Color.White);
                        }
     
     
                        position.X += tilesand.Width / 2;
                        position.Y += (tilesand.Height / 2) - 4;
                    }
                    position.X = - tilesand.Width / 2 * row;
                    position.Y = (tilesand.Height - 6) / 2  * row;
                    row++;
                }
    Screen -> Iso

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                float x = Mouse.GetState().X;
                float y = Mouse.GetState().Y;
     
                Vector2 position;
     
                position.X = (float)Math.Floor((y / tile.Height) + (x / tile.Width));
                position.Y = (float)Math.Ceiling((y / tile.Height) - (x / tile.Width));
                return position;
    Et voilà ma classe camera

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
        class Camera2D : Object
        {
            protected float _zoom; // Camera Zoom
            public Matrix _transform; // Matrix Transform
            public Vector2 _pos; // Camera Position
     
            public Camera2D()
            {
                _zoom = 1.0f;
                _pos = Vector2.Zero;
            }
            public float Zoom
            {
                get { return _zoom; }
                set { _zoom = value; if (_zoom < 0.5f) _zoom = 0.5f; else if (_zoom > 1.5f) _zoom = 1.5f; } // Negative zoom will flip image
            }
     
            // Auxiliary function to move the camera
            public void Move(Vector2 amount)
            {
                _pos += amount;
            }
            // Get set position
            public Vector2 Pos
            {
                get { return _pos; }
                set { _pos = value; }
            }
     
            public Matrix get_transformation(GraphicsDevice graphicsDevice)
            {
                _transform =       // Thanks to o KB o for this solution
                  Matrix.CreateTranslation(new Vector3(-_pos.X, -_pos.Y, 0)) *
                                             Matrix.CreateScale(new Vector3(Zoom, Zoom, 0)) *
                                             Matrix.CreateTranslation(new Vector3(graphicsDevice.Viewport.Width * 0.5f, graphicsDevice.Viewport.Height * 0.5f, 0));
                return _transform;
            }
     
            public void Update(KeyboardState clavier)
            {
                if (clavier.IsKeyDown(Keys.Up))
                    this.Move(new Vector2(0.0f, -5.0f));
     
                if (clavier.IsKeyDown(Keys.Down))
                    this.Move(new Vector2(0.0f, 5.0f));
     
                if (clavier.IsKeyDown(Keys.Right))
                    this.Move(new Vector2(5.0f, 0.0f));
     
                if(clavier.IsKeyDown(Keys.Left))
                    this.Move(new Vector2(-5.0f, 0.0f));
     
                if (clavier.IsKeyDown(Keys.X))
                    this.Zoom += 0.05f;
     
                if (clavier.IsKeyDown(Keys.V))
                    this.Zoom -= 0.05f;
            }
        }
    }

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 075
    Points : 7 981
    Points
    7 981
    Par défaut
    Cependant pour que ça marche, je ne dois pas bouger la camera, en effet quand le terrain est affiché à partir des coordonnées 0,0 et la camera à 0,0, pas de problème. Mais une fois la camera déplacé, plus moyen.
    Car tu n'aurais pas addition la position de ta camera avec celle de la souris dans ta conversion screen->iso ?
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    Par défaut
    Citation Envoyé par wax78 Voir le message
    Car tu n'aurais pas addition la position de ta camera avec celle de la souris dans ta conversion screen->iso ?
    Exact: dans ta fonction screen-> iso, les deux lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    float x = Mouse.GetState().X;
    float y = Mouse.GetState().Y;
    Devraient plutôt ressembler à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    float x = decalCameraX + Mouse.GetState().X;
    float y = decalCameraY + Mouse.GetState().Y;
    Après, à toi de voir pour calculer la valeur de decalCamera en fonction de la façon dont tu exprimes la position de ta caméra (posCamera) :

    - si cette position est exprimée en pixels, decalCamera est identique à posCamera

    - si cette positin est exprimée en coordonnées dans le mode isométrique, tu devras passer par une conversion Iso=>Screen intermédiaire avec decalCamera = isoToScreen(posCamera)

    A noter que les formules pour passer des coordonnées iso vers screen et inversement sont dispo ici. On y parle d'ailleurs de 'decalPixelX' et 'decalPixelY' qui sont équivalents au 'decalCamera' de ce post.
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

  4. #4
    Yordarus
    Invité(e)
    Par défaut
    Bonjour,

    C'est ce que je pensais, mais il me semble avoir déjà essayé cette solution et cela ne marché pas. Je reessaye ce midi/cette aprem et je vous tiens au courant.

  5. #5
    Yordarus
    Invité(e)
    Par défaut
    Ca marche ! j'ai remplacé ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    float x = decalCameraX + Mouse.GetState().X;
    float y = decalCameraY + Mouse.GetState().Y;
    par ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    float x = (camera.Pos.X - Window.ClientBounds.Width / 2 ) + Mouse.GetState().X;
    float y = (camera.Pos.Y - Window.ClientBounds.Height / 2) + Mouse.GetState().Y;
    C'est étonnant car hier soir j'ai essayé cette formule dans tous les sens
    Je me suis peut être emmêlé avec la hauteur/largeur et X/Y.

    Window Client Bounds représente la hauteur et la largeur de la fenêtre.

    Merci à vous 2

  6. #6
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    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 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par Yordarus Voir le message
    Ca marche ! j'ai remplacé ça
    Si tu est arrivé à un résultat intéressant et fonctionnel tu ne peux pas le mettre dans la rubrique "Contribuez" ?
    Cela peut intéresser des personnes notamment moi

  7. #7
    Yordarus
    Invité(e)
    Par défaut
    Ouep bien sûr, si t'es pas trop pressé, je peux toujours essayé d'étoffer un peu ma technique.

    Sinon je poste tout à l'heure

  8. #8
    Yordarus
    Invité(e)
    Par défaut
    J'ai rédigé un petit truc, bon c'est beaucoup de blabla pour pas grand chose au final, mais si jamais ça t'as aidé ne serait ce qu'un petit peu ça me fait très plaisir !

    http://www.developpez.net/forums/d88...-isometriques/

  9. #9
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    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 361
    Points : 20 381
    Points
    20 381
    Par défaut
    ok merci Yordarus !

Discussions similaires

  1. Trouver les bonnes accolades fermantes !
    Par Vovo2006 dans le forum Langage
    Réponses: 12
    Dernier message: 23/12/2006, 21h07
  2. [RUP] Ou trouver une bonne introduction ?
    Par elitost dans le forum xUP
    Réponses: 3
    Dernier message: 28/11/2006, 10h17
  3. [RegEx] Trouver la bonne expression reguliere
    Par Dargos dans le forum Langage
    Réponses: 14
    Dernier message: 04/04/2006, 15h02
  4. [CR] trouver une bonne doc
    Par ina dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 17/06/2004, 17h43

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