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 pour un RPG


Sujet :

SDL

  1. #1
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut Scrolling pour un RPG
    Salut,

    Je me pose des questions sur l'élaboration d'un scrolling dans un jeu style RPG.
    J'ai pensé à une solution, je la soumets à vos avis :

    Declarer 2 buffers :
    un de la taille de l'ecran : SDL_Surface *screen
    un beaucoup plus grand de la taille de la map entiere : SDL_Surface *map
    On blit toutes les tiles dans map.
    Puis on blit le centre de map dans screen, quelque chose dans le genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SDL_Surface *screen = SDL_setVideo....;
    SDL_Surface map = SDL_CreateRGBSurface....;
    SDL_Rect scr;
    SDL_Rect dest;
    /* on suppose que map contient toutes les tiles */
    /* on positionne screen au centre de map*/
    src.x = map->w/2;
    src.y = map->h/2;
    src.w = screen->w;
    src.h = screen->h;
    SDL_BlitSurface(map,&src,screen,NULL);
    SDL_Flip(screen);
    Ainsi quand le perso se deplace, il suffit de modifié src.x et src.y et de refaire le blit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /* Par exemple le scrolling va vers le haut avec une vitesse SPEED */
    src.x = map->w/2;
    src.y = map->h/2 - SPEED;
    src.w = screen->w;
    src.h = screen->h;
    SDL_BlitSurface(map,&src,screen,NULL);
    SDL_Flip(screen);
    voila, j'attends vos commentaires..car il y a surement mieux
    Je n'ai pas testé cette solution, c'etait juste une approche sur papier (enfin surtout dans ma tete).
    Merci pour vos réponses

    Sorry
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  2. #2
    mat.M
    Invité(e)
    Par défaut
    Oui cela semble correct.
    En fait pour faire un défilement il faut définir comme une fenêtre qui représente l'écran sa résolution; cette fenêtre laisse apparaitre une partie d'une carte large ( map)

  3. #3
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par mat.M
    Oui cela semble correct.
    En fait pour faire un défilement il faut définir comme une fenêtre qui représente l'écran sa résolution; cette fenêtre laisse apparaitre une partie d'une carte large ( map)
    OK merci, j'implemente ça de suite
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  4. #4
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par sorry60
    Citation Envoyé par mat.M
    Oui cela semble correct.
    En fait pour faire un défilement il faut définir comme une fenêtre qui représente l'écran sa résolution; cette fenêtre laisse apparaitre une partie d'une carte large ( map)
    OK merci, j'implemente ça de suite
    quand il y aura quelque chose à voir fais nous signe ...

    signé Clint

  5. #5
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 230
    Points : 122
    Points
    122
    Par défaut
    Je suis justement en train d'apprendre à faire des RPG 2D et je viens de finir la gestion de ma première map.

    Pour ce qui est de ta solution, elle est bien mais j'ai opté pour une autre que je vais essayer de t'expliquer.

    J'ai une classe CChipset qui possède une surface pointant vers le bitmap contenant tous mes tiles avec chaque tile assigné à un numéro, et une classe CMap qui contient un tableau aussi grand que le nombre de tile de la map (pour une map de 200 * 100 tiles, le tableau fera 20000 cases), chaque case ayant le numéro du tile correspondant.

    Lorsqu'il faut afficher la carte, je la centre sur le personnage (si les bords me le permettent) puis j'affiche seulement les tiles qui apparaissent en les blittants un par un.
    Mes sites :
    - Portail : http://www.azharis.fr/
    - Neuroshima Hex : http://neuroshima-hex.azharis.fr/
    - Monolith Arena : http://monolith-arena.azharis.fr/

  6. #6
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par Azharis
    Je suis justement en train d'apprendre à faire des RPG 2D et je viens de finir la gestion de ma première map.

    Pour ce qui est de ta solution, elle est bien mais j'ai opté pour une autre que je vais essayer de t'expliquer.

    J'ai une classe CChipset qui possède une surface pointant vers le bitmap contenant tous mes tiles avec chaque tile assigné à un numéro, et une classe CMap qui contient un tableau aussi grand que le nombre de tile de la map (pour une map de 200 * 100 tiles, le tableau fera 20000 cases), chaque case ayant le numéro du tile correspondant.

    Lorsqu'il faut afficher la carte, je la centre sur le personnage (si les bords me le permettent) puis j'affiche seulement les tiles qui apparaissent en les blittants un par un.
    HS : tu apprends ça à l'ecole ou pour ton plaisir ?
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  7. #7
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 230
    Points : 122
    Points
    122
    Par défaut
    Malheureusement c'est pour le plaisir, j'aurais aimer être à une école pour apprendre ça.

    Pourquoi cette question ?
    Mes sites :
    - Portail : http://www.azharis.fr/
    - Neuroshima Hex : http://neuroshima-hex.azharis.fr/
    - Monolith Arena : http://monolith-arena.azharis.fr/

  8. #8
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par Azharis
    Malheureusement c'est pour le plaisir, j'aurais aimer être à une école pour apprendre ça.

    Pourquoi cette question ?
    Justement car moi aussi j'aimerais une école pour apprendre ça
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  9. #9
    JEG
    JEG est déconnecté
    Membre éclairé
    Avatar de JEG
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 211
    Points : 727
    Points
    727
    Par défaut
    Hello, dans mon projet j'ai opté pour une solution similaire à celle d'Azharis, qui permet de garder de bonne performances quand la taille de la carte est vraiment très grande. (plus qu'énorme dans mon cas)

    en fait mon backbuffer est de la taille suivante :

    * (largeurEcran/largeurTile + 2)*largeurTile, pour la largeur
    * (hauteurEcran/HauteurTile + 2)*hauteurTile, pour la hauteur

    les "+2" servent à faire un scroll fin, ca rajoute deux colonnes de tiles à gauch e et à droite, et deux rangées en haut et en bas.

    cf le lien dans ma signature si tu veux essayer pour voir ce que ca donne.

  10. #10
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Citation Envoyé par Azharis
    Je suis justement en train d'apprendre à faire des RPG 2D et je viens de finir la gestion de ma première map.

    Pour ce qui est de ta solution, elle est bien mais j'ai opté pour une autre que je vais essayer de t'expliquer.

    J'ai une classe CChipset qui possède une surface pointant vers le bitmap contenant tous mes tiles avec chaque tile assigné à un numéro, et une classe CMap qui contient un tableau aussi grand que le nombre de tile de la map (pour une map de 200 * 100 tiles, le tableau fera 20000 cases), chaque case ayant le numéro du tile correspondant.

    Lorsqu'il faut afficher la carte, je la centre sur le personnage (si les bords me le permettent) puis j'affiche seulement les tiles qui apparaissent en les blittants un par un.
    Saufe que cette technique commence a devenir lourde quand tu a plusieures couches de titles diférents. Je prend le cas extrème ou tu a 10 couches comportant des mlenges de diférents fichiers bitmaps... Dans ce cas, il vaut mieu se raporter a l'utilisation d'une unique surface, si on veut eviter de perdre du temp avec le blit.
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  11. #11
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par Azharis
    Je suis justement en train d'apprendre à faire des RPG 2D et je viens de finir la gestion de ma première map.

    Pour ce qui est de ta solution, elle est bien mais j'ai opté pour une autre que je vais essayer de t'expliquer.

    J'ai une classe CChipset qui possède une surface pointant vers le bitmap contenant tous mes tiles avec chaque tile assigné à un numéro, et une classe CMap qui contient un tableau aussi grand que le nombre de tile de la map (pour une map de 200 * 100 tiles, le tableau fera 20000 cases), chaque case ayant le numéro du tile correspondant.

    Lorsqu'il faut afficher la carte, je la centre sur le personnage (si les bords me le permettent) puis j'affiche seulement les tiles qui apparaissent en les blittants un par un.
    je suis d'accord avec JC Master c'est trop lourd à gérer.
    Et en plus le joueur va se perdre dans une zone de jeux si grande

  12. #12
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Bonjour à tous,

    J'ai implémenté la méthode dont je parlais tout au début (les 2 buffers).
    Je la trouve nickel

    Merci pour vos avis, j'en prends note au cas où
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  13. #13
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 230
    Points : 122
    Points
    122
    Par défaut
    Par hasard vous ne sauriez pas où est-ce que l'on peut trouver des tuto (de préférence en français) sur les layer pour les map car je n'arrive pas a en trouver ?
    Mes sites :
    - Portail : http://www.azharis.fr/
    - Neuroshima Hex : http://neuroshima-hex.azharis.fr/
    - Monolith Arena : http://monolith-arena.azharis.fr/

  14. #14
    JEG
    JEG est déconnecté
    Membre éclairé
    Avatar de JEG
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 211
    Points : 727
    Points
    727
    Par défaut
    La solution 1 marche bien quand la map est statique, mais si tous les tiles sont animés, alors ca ne conviendra plus, il faudra à chaque passage réactualiser le backbuffer, donc toute la carte.

    Dans la solution 2, il faudra certes réactualiser le backbuffer, mais uniquement la portion affichée, et ensuite basculer en une seule fois le backbuffer sur l'affichage.

  15. #15
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par Azharis
    Par hasard vous ne sauriez pas où est-ce que l'on peut trouver des tuto (de préférence en français) sur les layer pour les map car je n'arrive pas a en trouver ?
    C'est quoi un layer ?
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  16. #16
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par sorry60
    C'est quoi un layer ?
    Une couche. En 2D on peut utiliser plusieurs couches pour le rendu : le décor, les entités animées, le texte, ... Ca permet de déterminer un ordre d'affichage.

  17. #17
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Bon, alors moi aussi je vais en profiter pour poser ma question sur le scroll.
    J'ai une classe MAP, qui contien des objets BLOCK contenent eux même des SPRIT.
    Chaque sprit a ses x&y.(Comme sa sa peut paraitre lourd, saufe que les sprits sont "ponctuelles". Pour ce qui est le fond, il est gèrer par un seul element qui apartient a MAP)

    Donc, j'ésite entre plusieures solution pour efectuer le scroll :
    1 : Ge génère une surface de (largeur+2*32)*(hauteur+2*32)pixels, et dedan je selectione largeur*hauteur pixels que j'afiche.
    2 : Je passe en paramêtre a la fonction BlitSurface de MAP le scrollx et le scrolly et cette fonction se débroille pour tout bliter sur une surface de largeur*hauteur pixels.

    J'ai choisi la 2, saufe que la, je ne voi pas trop comment cette fonction peut se débroiller...
    Déja, rien que pour l'afichage du fond, qui est un simple caré qui se répète, je ne sais pas exactement comment faire...

    J'aurais aimer pourvoir décaler les images a bliter, et dans ce cas j'aurais bliter (2*hauteur+2*largeur)-4 chipset de plus(corespond au bordures), seulement si Rect.x ou Rect.y voir les deux sont negatife, la partie qui devrais disparaitre se retrouve bliter de l'aure coté de l'image!

    De quels fasont me conseillez vous de procèder?
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  18. #18
    JEG
    JEG est déconnecté
    Membre éclairé
    Avatar de JEG
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 211
    Points : 727
    Points
    727
    Par défaut
    J'ai beaucoup de mal à te comprendre JC_Master, surtout sur la notion de chipset (???), mais je vais essayer de t'expliquer la méthode que j'utilise (avec laquelle j'obtiens de très bonne performances, et qui me permet d'afficher des cartes gigantesques) :

    Imaginons que ma résolution est de 1280*960, que mes tiles sont de 64*64.

    Donc à chaque instant je dois afficher au minimum 20*15 tiles à l'écran.

    Je crée donc un backbuffer (bitmap en mémoire) de la meme taille que ma résolution (1280*960).

    A chaque nécessité d'afficher, je regarde à quelle position x, y de la carte je suis et je prends tous les tiles contenues entre (x-11 et x+11) et (y-8 et y+9). Je les affiches ensuite dans le backbuffer en prenant on compte un offset (pixelsX et pixelY) qui correspond à mon scroll, et ensuite j'affiche le backbuffer sur la surface d'affichage.

    Les exemples de RPG que j'ai pu regarder font comme ca, et ca permet de gérer les sprites animés (arbres qui se balancent, herbe qui bouge).

    Dans mon jeu, la hauteur (cooredonnée z) est aussi pris en compte dans les tiles affichés, ansi que les layers (différentes couches bitmap pour un meme sprite). et j'obtiens de très bonnes performances.

    Est-ce que ca a répondu à tes interrogations ?

  19. #19
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Donc, tu prend tous les chipset(petits careaux de 64*64) de -(NbLargeur/2+1) à +(NbLargeur/2+1) et pareille en hauteur. Comme si tu prenais la bardure. Puis tu dit que tu utilise un x et y pour décaler.. Mais comment tu fait sa? Tu créer une surface de la taille de NbLargeur+2, puis tu découpe l'écran dedan, ou tu modifi les paramêtres de blit des petits careaux pour les décaler de x et y?
    Si c'est la deuxième solution(et je croi avoir comprit que c'est sa) comment te débroille tu pour que sa ne pose pas de problème avec par exemple le careau en haut a gauche qui risque d'avoir Rect.x = -3, Rect.y = -8 sachan que SDL vas blit ce qui déborde de l'autre coté de la carte?
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  20. #20
    JEG
    JEG est déconnecté
    Membre éclairé
    Avatar de JEG
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 211
    Points : 727
    Points
    727
    Par défaut
    c'est bien la deuxième solution. je dessine mes carreaux en -3 et -8.
    Et pourquoi ca ne les affiche pas de l'autre côté, c'est très simple : c'est parceque je n'utilise pas SDL ! (je programme en .Net et tout marche correctement, en GDI+ ou avec DirectX)

    Si tu veux vraiment utiliser SDL, alors je pense qu'il va te falloir effectivement créer un backbuffer de taille (NbLargeur+2)*64, tout dessiner dedans et ensuite découper dedans la portion que tu vas blitter à l'écran.

    En terme de performances, ca va revenir grosso-modo au même.

Discussions similaires

  1. Cherche avis sur une idée d'IA pour un rpg...
    Par Neolander dans le forum Intelligence artificielle
    Réponses: 12
    Dernier message: 31/03/2008, 07h19
  2. [jquery] Faire un simple scroll pour "haut de page"
    Par Tchupacabra dans le forum jQuery
    Réponses: 2
    Dernier message: 11/02/2008, 11h29
  3. UN scroll pour toute UNE fenetre ?
    Par poulette3000 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 24/04/2007, 08h15
  4. Besoin d'aide pour mon rpg en javascript
    Par CyberTwister dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 07/04/2006, 13h26
  5. Réponses: 1
    Dernier message: 16/08/2005, 04h52

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