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

SDL Discussion :

Scrolling tilemapping rendercopy [SDL 2.0]


Sujet :

SDL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 83
    Points : 56
    Points
    56
    Par défaut Scrolling tilemapping rendercopy
    Bonjour, j'essaie de faire un scrolling pour ma carte chargée directement avec des rendercopy à partir de la texture du tileset. Pour le moment je parviens juste à scroller de case en case en me déplacement dans mon char* qui contient l'agencement de mes tuiles, le problème étant que ça donne un aspect saccadé(de case en case). Ça fait quelques jours que j'y réfléchi et j’arrive pas à ce que je veux. Je voudrais éviter de charger toute la carte. J'ai énormément cherché et je trouve peu de chose à ce sujet, si quelqu'un pouvait me partager sa technique j'en serais reconnaissant, merci d'avance.

    Voilà la fonction toute simple qui ne fait que bouger de tuile en tuile:
    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
    void Affiche_Carte(SDL_Renderer* renderer,texture* tabTx, s_point* cam)
    {//tabTx est juste un tableau de ma struct texture où sont stockées les texures,rectangles+2-3 trucs
      int xDecal = (*cam).x/LTILE;
      int yDecal = (*cam).y/HTILE;
     
      for(int y=0; y < H/HTILE; y++)
        {
          for(int x=0; x < L/LTILE;x++)
    	{ //map est le tableau qui contient les maps(char*) et tabTx[0] la struct texture du tileset
    	  tabTx[0].srcRect.x = (map[0][(y+yDecal)*NB_TILE_LARGEUR+(x+xDecal)]-'0')*LTILE;
    	  tabTx[0].dstRect.y = y*HTILE+HMARGE;
    	  tabTx[0].dstRect.x = x*LTILE+LMARGE;
     
    	  SDL_RenderCopy(renderer, tabTx[0].tx, &tabTx[0].srcRect, &tabTx[0].dstRect);
    	}
        }  
    }
    et ensuite la caméra bouge avec ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void Camera(texture* tabTx, s_point* cam,const Uint8* state)
    {
      if(state[SDL_SCANCODE_UP] && (*cam).y >0)
        (*cam).y-=VIT_CAM;
      if(state[SDL_SCANCODE_RIGHT] && (*cam).x < (NB_TILE_LARGEUR*LTILE-L))
        (*cam).x+=VIT_CAM;
      if(state[SDL_SCANCODE_DOWN] && (*cam).y < (NB_TILE_HAUTEUR*HTILE-H))
        (*cam).y+=VIT_CAM;
      if(state[SDL_SCANCODE_LEFT] && (*cam).x >0)
        (*cam).x-=VIT_CAM;
    }

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


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

    Est-ce que la valeur de VIT_CAM est égale à la taille d'une tuile ? Pourquoi ne pas la réduire pour avoir un scrolling plus doux ?
    Sinon, à l'affichage il suffit d'afficher que les tuiles dans le rectangle de la caméra (soit, dans une configuration de base, juste les tuiles réellement visible à l'écran) et pour les scrolling, il faut afficher les tuiles adjacentes à ce rectangle (mais sans plus) (ou alors, afficher les tuiles, même si elle sont que partiellement dans le rectangle de la caméra).
    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.

  3. #3
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 352
    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 352
    Points : 20 359
    Points
    20 359
    Par défaut
    euhhh dans le code il y a un truc qui m'interpelle dans les tableaux ( tab[] et map[] ) tu ne fais qu'accéder toujours au premier élément d'indice 0
    logiquement avec le code donnée l'affichage ne produit aucun scrolling.
    Donc il faudrait gérer un index incrémenté au besoin pour adresser les tableaux

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 83
    Points : 56
    Points
    56
    Par défaut
    Bonjour, pour répondre à mat, en fait pour map[0] c'est car j'ai pas encore fait d'autres map je passerais le num de la map en paramètre de "Affiche_Carte" par la suite et pour texture[0] c'est car le tileset est le premier élément de mon tableau de struct texture après j'ai une autre fonction "Affiche_Tx" qui charge toutes les textures du tableau(si c'est un tileset ça appelle affiche_carte sinon juste un rendercopy et d'autres petites choses).

    Ensuite VIT_CAM ne me sert pas pour le moment puisque (*cam).x et (*cam).y sont multipliées par LTILE et HTILE(edit: en fait non c'est pas pour ça). J'aimerais bien les afficher partiellement mais si je le fais il faudrait que je détermine la taille du rectangle source et rectangle destination puisque certaines tuiles seront coupées(sur les bords) et si je ne le fais pas elle dépasseront sur les bords. Mais je ne sais pas comment je pourrais faire pour connaitre la taille des tuiles ? .

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    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 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut
    Avec la SDL, du moins, la SDL 1 (mais ça doit être possible en SDL2, y a pas de raison), vous pouvez dessiner hors des bordures de l'écran (il est possible de dessiner en -500, -500). Du coup, cela peut vous aider pour simplifier la problématique.

    Mais je ne sais pas comment je pourrais faire pour connaitre la taille des tuiles ? .
    Si vous voulez vraiment répondre à cette problématique, je vous conseille le papier et le crayon. Si la tuile doit hypothétiquement démarrer -32 et qu'elle fait 64 de largeur, alors il suffit de dessiner à l'emplacement de 0 à 32, la partie de la texture entre 32 et 64. Ça se fait, normalement assez facilement, si vous avez les bonnes primitives en place.
    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.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 83
    Points : 56
    Points
    56
    Par défaut
    Le problème c'est que j'ai une marge si je prends des coordonnées négatives, la tuile apparait dans la marge.
    Je vais essayer de calculer tout ça

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 83
    Points : 56
    Points
    56
    Par défaut
    J'ai réussi à faire ce que je voulais mais c'est très laid:
    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
    void Affiche_Carte(SDL_Renderer* renderer,texture* tabTx, s_point* cam)
    {
      int xDecal = (*cam).x/LTILE;
      int yDecal = (*cam).y/HTILE;
     
      int lDecal = (*cam).x%LTILE;
      int hDecal = (*cam).y%HTILE;
     
     
      for(int y=0; y <= H/HTILE; y++)
        {
          for(int x=0; x <= L/LTILE;x++)
    	{
    	  tabTx[0].srcRect.x = (map[0][(y+yDecal)*NB_TILE_LARGEUR+(x+xDecal)]-'0')*LTILE;
    	  tabTx[0].dstRect.y = y*HTILE+HMARGE-hDecal;
    	  tabTx[0].dstRect.x = x*LTILE+LMARGE-lDecal;
    	  tabTx[0].srcRect.y = 0;
     
    	  if(x==0)
    	    {
    	      tabTx[0].srcRect.w = LTILE-lDecal;
    	      tabTx[0].dstRect.w = LTILE-lDecal;
    	      tabTx[0].srcRect.x += lDecal;
    	      tabTx[0].dstRect.x += lDecal;
    	    }
    	  else if(x==L/LTILE)
    	    {
    	      tabTx[0].srcRect.w = LTILE-(LTILE-lDecal);
    	      tabTx[0].dstRect.w = LTILE-(LTILE-lDecal);
    	    }
    	  if(y==0)
    	    {
    	      tabTx[0].srcRect.h = HTILE-hDecal;
    	      tabTx[0].dstRect.h = HTILE-hDecal;
    	      tabTx[0].srcRect.y += hDecal;
    	      tabTx[0].dstRect.y += hDecal;
    	    }
    	  else if(y==H/HTILE)
    	    {
    	      tabTx[0].srcRect.h = HTILE-(HTILE-hDecal);
    	      tabTx[0].dstRect.h = HTILE-(HTILE-hDecal);
    	    }	   
    	  SDL_RenderCopy(renderer, tabTx[0].tx, &tabTx[0].srcRect, &tabTx[0].dstRect);
     
    	  tabTx[0].srcRect.w = LTILE;
    	  tabTx[0].dstRect.w = LTILE;
    	  tabTx[0].srcRect.h = HTILE;
    	  tabTx[0].dstRect.h = HTILE;
     
    	}
        } 
    }
    ça donne ça: (faites pas attention au petit bateau je l'ai chargé dans l'interface)


    Je suis toujours preneur si quelqu'un a un meilleur moyen de faire un scrolling avec un tilemaping chargé avec rendercopy.

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

Discussions similaires

  1. problème de scrolling(tilemapping)
    Par tankerpat dans le forum XNA/Monogame
    Réponses: 10
    Dernier message: 06/10/2013, 01h23
  2. [SFML]scrolling & tilemap
    Par Bibicy dans le forum SFML
    Réponses: 4
    Dernier message: 11/02/2008, 02h27
  3. scrolling vertical et horizontal
    Par myriam dans le forum MFC
    Réponses: 2
    Dernier message: 24/01/2003, 18h06
  4. scroll dans un label
    Par Pretender dans le forum Composants VCL
    Réponses: 9
    Dernier message: 27/09/2002, 18h06

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