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 :

problème de scrolling(tilemapping)


Sujet :

XNA/Monogame

  1. #1
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2013
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 72
    Points : 85
    Points
    85
    Par défaut problème de scrolling(tilemapping)
    Bonjour, j'ai un soucis avec mon scrolling, j'ai mis 2 screenshot pour vous puissiez visualiser le problème .

    La première question que je me pose c'est est-ce que cela peut venir de ma méthode de chargement de mon tileset et de son découpage?Les lignes verticales sont de la couleur de la tile qui se trouve à coté.

    J'ai essayé de mettre tous mes déplacements en int, il n'y a plus de soucis, dans ma fonction draw je passais par un rectangle, alors je me suis dis que si je passais par des vector2 et que je remettais mes déplacement en float cela devrait aller, mais il se trouve que non.

    Mon scrolling se fait par le biais d'une classe camera qui déplace donc mon niveau par rapport à mon joueur comme ceci

    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
     
    public class Camera
        {
            private Matrix transform;
            public Matrix Transform
            {
                get { return transform; }
            }
     
            private Vector2 center;
            private Viewport viewport;
     
            public Camera(Viewport newViewport)
            {
                viewport = newViewport;
     
     
            }
     
            public void Update (Vector2 position, int xOffset, int yOffset)
            {
                if (position.X < viewport.Width / 2)
                {
                    center.X = viewport.Width / 2;
                }
                else if (position.X > xOffset - viewport.Width / 2)
                {
                    center.X = xOffset - viewport.Width / 2;
                }
                else
                    center.X =  position.X;
     
                if (position.Y < viewport.Height / 2)
                {
                    center.Y = viewport.Height / 2;
                }
                else if (position.Y > yOffset - viewport.Height / 2)
                {
                    center.Y = yOffset - viewport.Height / 2;
                }
                else
                    center.Y = position.Y;
     
                transform = Matrix.CreateTranslation(new Vector3(-center.X + (viewport.Width/2),-center.Y + (viewport.Height/2),.0f));
            }
        }
    Je charge mon tileset et le découpe comme ceci
    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
     
    private void LoadTileSetsolid(Texture2D solid)
            {
                noOfTilesSolidX = solid.Width / tileWidth;
                noOfTilesSolidY = solid.Height / tileHeight;
     
                //initialisation de la liste de tile
                tileSetsolide = new List<Rectangle>((noOfTilesX * noOftilesY));
     
     
                //obtenir les limites de toutes les tiles de la feuille
                for (int j = 0; j < noOfTilesSolidY; j++)
                {
                    for (int i = 0; i < noOfTilesSolidX; i++)
                    {
                        limitesSolide = new Rectangle(i * tileWidth, j * tileHeight, 32, 32);
                        tileSetsolide.Add(limitesSolide);
     
                    }
                }
            }
    et je le dessine comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if (AABBLayer.layer[x, y] !=-1)
                        { 
                            //obtenir la tile
                            limitesSolide = tileSetsolide[AABBLayer.layer[x, y] ];
     
                            //dessine la tile                       
                            spriteBatch.Draw(solid, new Vector2((((float)(x - drawOffset.X) * tileWidth)),
                            ((y /*- drawOffset.Y*/) * tileHeight)), limitesSolide, Color.White);
                            //spriteBatch.Draw(solid, new Rectangle(x*tileHeight,y*tileHeight,32,32),limites, Color.White);
                            //spriteBatch.Draw(solid, new Vector2(((x /*- drawOffset.X*/) * tileWidth),((y /*- drawOffset.Y*/) * tileHeight)), limites, Color.White, 0.0f, new Vector2(0,0), 1.0f, SpriteEffects.None, 0);
                        }
    Je vous dis que je pense que cela vient de ma fonction loadtilset parce que j'ai refait un mini code en chargeant mes tiles séparément et je n'ai plus se soucis, mais je ne sais pas comment cela se fait-il et j'aimerais continuer à utiliser mes planches de tiles.Mais je dois me tromper quelque part, et je ne vois pas où

    Je vous remercie d'avance
    Images attachées Images attachées   

  2. #2
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2013
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 72
    Points : 85
    Points
    85
    Par défaut Re-multitest
    Bon voilà j'ai refait une batterie de test, dans le nouveau programme que j'ai fais,

    je n'avais pas mis mon théorème des axes séparés ni mon intégration physique, (ne sachant plus trop quoi modifier dans mon projet initial), je ne pensais pas que cela pouvait venir de là, et effectivement cela ne vient pas de là,

    mais donc si cela vient bien du chargement des tiles, à quoi servent les list<Rectangle> dans la fonction LoadContent(fonction qui n'est chargée qu'une seule fois) si c'est pour me décaler d'un pixel sur la gauche ou sur la droite selon ma direction et de 1 pixel vers le haut à cause de ma gravité seulement lors du scrolling, je n'y comprend plus rien.Serait-ce parce que je me sert du loadContent du level?
    c-a-d :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public Player(Level level)
            {
                this.level = level;            
                LoadContent();
            }
    Donc cela ne viendrait pas de ma fonction loadtileset?!
    Merci d'avance pour vos remarques si je me fourvoie lamentablement.

  3. #3
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2013
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 72
    Points : 85
    Points
    85
    Par défaut
    Bon ben là je ne sais plus quoi faire
    J'ai chargé et dessiné directement sans stocker dans les list rectangle mais le soucis reste le même, j'ai procédé comme suit:
    drawmap()
    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
     
    int x, y, mapX, x1, x2, mapY, y1, y2, xsource, ysource, a;
     
                mapX = startX / tileWidth;
                x1 = (startX % tileWidth) * -1;
     
                x2 = x1 + mapWidth*32 + (x1 == 0 ? 0 : tileWidth);
     
                // On fait exactement pareil pour calculer y 
                mapY = startY / tileHeight;
                y1 = (startY % tileHeight) * -1;
                y2 = y1 + mapHeight*32 + (y1 == 0 ? 0 : tileHeight);
     
                //On met en place un timer pour animer la map   
     
                //Dessine la carte en commençant par startX et startY            
     
                for (y = y1; y < y2; y += tileHeight)
                {
                    // A chaque début de ligne, on réinitialise mapX qui contient la colonne
                    //(0 au début puisqu'on ne scrolle pas) 
                    mapX = startX / tileWidth;
     
                    //A chaque colonne de tile, on dessine la bonne tile en allant
                    //de x = 0 à x = 640 
                    for (x = x1; x < x2; x += tileWidth)
                    {
                        a = AABBLayer.layer[mapX,mapY];
                        ysource = a / 10 * tileHeight;
                        xsource = a % 10 * tileWidth;
                        spriteBatch.Draw(solid, new Vector2(x ,y),
                                                new Rectangle(xsource, ysource,tileWidth,tileHeight), 
                                                Color.White,0.0f,Vector2.Zero,1.0f,SpriteEffects.None,0.0f);
     
     
                        //Si la tile à dessiner n'est pas une tile vide 
     
                        //Suivant le numéro de notre tile, on découpe le tileset (a = le numéro
                        //de la tile 
                        a = TileLayer1.layer[mapY,mapX];
     
                        // Calcul pour obtenir son y (pour un tileset de 10 tiles
                        //par ligne, d'où le 10 
                        ysource = a / 10 * tileHeight;
                        // Et son x 
                        xsource = a % 10 * tileWidth;
     
                      mapX++;
                    }
     
                    mapY++;
                }
    Pas si facile de passer du C au C#.Toute aide serait grandement appréciée, là j'avance à reculons.
    Merci

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 815
    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 815
    Points : 218 179
    Points
    218 179
    Billets dans le blog
    117
    Par défaut
    Bonjour,

    Avez vous essayez de déboguer en rajoutant des points d'arrêts pour afficher les valeurs des variables ?
    Soit c'est une imprécision de calcul, soit, vous avez une erreur de calcul de un pixel (ou plus ?).
    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 régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2013
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 72
    Points : 85
    Points
    85
    Par défaut
    Bonjour,
    Merci du conseil, je n'y pense pas souvent à cet outil

    Je suppose que vous parliez des variables de ma fonction drawmap() pour regarder avec le débugger, cette fonction je l'utilise pour pour mon jeu en C/SDL, j'ai toutefois regarder(les fautes de frappes sont souvent la cause), tous mes rectangles découpés font bien 32, la map maxi fait bien 150*32= 4800= x2 ainsi que y2, la tile découpée correspond au numéro que j'attends à la postion attendue en x et en y.

    Cependant je ne suis que débutant, est-il possible de contrôler ces variables comme les printf en C, parce que je ne sais pas déplacer mon joueur en en mode débug, si toute fois cela est possible?

    J'ai oublié de mentionner que les traits horizontaux et verticaux qui correspondent à la couleur des tiles d'avant ou d'aprés selon le sens de déplacement de mon player s'estompent au bout de 6 secondes et reviennent au bout de 8 secondes.

    Merci

  6. #6
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 347
    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 347
    Points : 20 347
    Points
    20 347
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (position.X < viewport.Width / 2)
    Pourquoi la zone de défilement / 2 ?
    Sinon c'est position_X du personnage + largeur < Viewport.Width
    Il faut que tu regardes si la bitmap représentant le sprite est inscrite dans la zone de l'écran.Sinon en déduire le rectangle résultant
    C'est la technique du clipping en anglais

  7. #7
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2013
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 72
    Points : 85
    Points
    85
    Par défaut
    Bonjour et merci de prendre le temps,

    Je divise la zone de défilement par 2 pour commencer à scroller dés le milieu de l'écran afin que la caméra soit centrer sur mon player, dans le cas où je ne diviserais pas par 2, je devrais aller toucher le bord droit de l'écran et seulement après ma caméra serait centrée sur mon player.

    Sinon je ne comprend pas :
    Citation"Sinon c'est position_X du personnage + largeur < Viewport.Width"

    position.X + largeur/2<Viewport.Width que vous vouliez dire? Ce qui revient donc à viewport/2, mais j'ai tout de même essayé au cas où il y aurait eu un problème de précision à ce niveau là,mais le souci reste le même

    Pour ce qui est de la méthode dite du "clipping", je vais me renseigner voir de quoi il en retourne.

    Merci

  8. #8
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2013
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 72
    Points : 85
    Points
    85
    Par défaut
    J'ai fais un petit tour donc pour voir ce qu'il en était, si c'est bien la même chose de ce dont vous me parlez, vous voudriez que je découpe les morceaux qui ne sont pas affichés pour optimiser mes performances au niveau du temps de calcul.

    Mais ce que je ne comprend pas c'est que ma map en C (avec une vieille bécane) qui était 2 fois plus grande ne me posait pas se genre de soucis, maintenant j'ai une bête de course et XNA est bien plus puissant que la sdl 1.2.
    Faut m'arrêter si je trompe.

    Sinon sur le site utilise le terme clipping en utilisant la méthode Draw avec rectangle destination et source rectangle, il me semble que c'est la méthode employée au tout début.

    Si je me trompe n'hésitez pas.

  9. #9
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2013
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 72
    Points : 85
    Points
    85
    Par défaut
    Bon ben ma foi, encore une bidouille, je vais remettre mon scrolling en int.

    Si toute fois quelqu'un avait trouver la réponse merci de me le faire savoir ici ou par MP

  10. #10
    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 135
    Points
    10 135
    Par défaut
    une réponse a quoi a ça ?
    J'ai fais un petit tour donc pour voir ce qu'il en était, si c'est bien la même chose de ce dont vous me parlez, vous voudriez que je découpe les morceaux qui ne sont pas affichés pour optimiser mes performances au niveau du temps de calcul.

    Mais ce que je ne comprend pas c'est que ma map en C (avec une vieille bécane) qui était 2 fois plus grande ne me posait pas se genre de soucis, maintenant j'ai une bête de course et XNA est bien plus puissant que la sdl 1.2.
    Sur la SDL effectivement ce n'est pas nécessaire de faire ce genre optimisation vu que les blit de la SDL sont optimisé si tu affiche hors de écran il ne affichera tous simplement pas et ne fera aucun calcul (ça te coutera appel de la fonction).
    Avec DirectX qui fait les calcul coté hardware , tu enverra a ta carte graphique qui fera les calcul(qui les fera certes plus rapidement coté CPU) sauf que tu ne le verra pas hors de ecran et donc aucun calcul étant toujours plus rapide que en faire un (même avec DirectX) c'est probablement pour cela que il y est peut être cette différence.

  11. #11
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2013
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 72
    Points : 85
    Points
    85
    Par défaut
    Salut Kannagi, non ce n'était pas à cela que je faisais référence mais plutôt à mon scrolling, mais avec l'explication que tu m'as donné je comprends mieux pourquoi Mat.M m'a envoyé du coté du clipping.

    Mais même avec un scrolling sur 1 tile le problème est identique, mais la méthode du clipping j'essayerais de la mettre en application, car du coup à un jour ou l'autre elle me sera utile.

    Merci pour tes explications.
    Je suis sur autre voie,je vous en direz plus qu'en j'en saurais plus,merci encore.

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

Discussions similaires

  1. [D7][TTreeView] Problème de scroll
    Par jbat dans le forum Delphi
    Réponses: 2
    Dernier message: 09/02/2007, 15h49
  2. Problème de scroll/largeur
    Par Epistoliere dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 04/12/2006, 11h34
  3. [C#] Problème de scroll dans un panel
    Par snake13_71 dans le forum Windows Forms
    Réponses: 9
    Dernier message: 26/06/2006, 18h56
  4. [JText Area] problème de scroll
    Par mrshoki dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 13/03/2006, 18h22
  5. problème de scroll
    Par elfugu dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 28/11/2005, 17h40

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