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 :

Problème migration 1.2 => 2.0


Sujet :

SDL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 10
    Points : 23
    Points
    23
    Par défaut Problème migration 1.2 => 2.0
    Bonjour à tous,

    Merci de prendre la peine de lire mon petit problème de noob.

    Je débute mon apprentissage de la SDL. Pour cela je m'appuie (entre autre) sur une série de tutoriels très bien fait mais, le problème c'est qu'ils sont réalisés autour de la 1.2.
    J'adapte donc le travail en 2.0.
    Jusqu'ici, ça ne m'a pas posé de problème.
    Aujourd'hui, je n'arrive pas à adapter un bout de code qui (fonctionnant très bien en 1.2 bien sur) réalise le "scrolling" d'un rect (SDL_Rect) sur une SDL_Surface de taille 960/720
    dans une fenêtre(une autre surface) qui a pour taille la moitié de la première surface.

    le code réalise un effet de scrolling (enfin un déplacement) dans une fenêtre plus petite que la taille réelle de la surface grâce à un rect mobile (aux dimensions de la fenêtre) qui met à jour
    ses coordonnées à chaque fois qu'on utilise une des touches du clavier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    // rect a pour taille la taille de display
    // Le rect change de coordonnées à chaque fois qu'on le met à jour par un event
    // SDLK_DOWN SDLK_UP ...
    // ulc = upper left corner
    rect->x = ulc_x; rect->y = ulc_y
     
     //taille de mypic = 2 * taille display
      SDL_BlitSurface (mypic, rect, display, NULL);
    Donc en appuyant sur une flèche du clavier, on fait évoluer le rectangle de gauche à droite et de bas en haut.

    Problème:
    Comment réaliser ça avec la 2.0, sachant que je travaille sur des textures et que blit a disparu?
    J'ai bien essayé de faire comme ceci:
    Voici une partie du code:

    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
     
    #define WIN_W 480
    #define WIN_H 360
     
     ulc_x = ulc_y = 0;
     rect.w = WIN_W; rect.h = WIN_H;
     rect.x =  ulc_x; rect.y =  ulc_y;
     
    // Je créé une image, une fenêtre d'affichage et un rect aux mêmes dimensions
     
    // L'image que je créée est ensuite placée dans une SDL_Surface
     I = image_create(WIN_W, WIN_H, 0xFF7F00FF);
    mypic = image_to_SDL_Surface(I);
     display = window_init("test", WIN_W, WIN_H);
    // Je créé une texture qui fait 2 fois les dimensions de l'affichage
     sdlTexture = SDL_CreateTexture(sdlRenderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STATIC, WIN_W*2, WIN_H*2);
    // je mets bien à jour la texture avec rect
     SDL_UpdateTexture(sdlTexture, rect, mypic->pixels, mypic->pitch);
     SDL_RenderClear(sdlRenderer);
     SDL_RenderCopy(sdlRenderer, sdlTexture, rect, NULL);
     SDL_RenderPresent(sdlRenderer);
    Mais à l'affichage, ça me donne une "texture" qui s'est adaptée aux dimensions de la fenêtre alors que les dimensions de la texture font de base 2 fois celles de la fenêtre!
    Donc toute mon image est affichée dans la fenêtre alors que je ne devrais voir qu'une partie de l'image (comme dans la v1.2)!
    Mais comme on ne travaille plus seulement avec des "surfaces" et que "blit" a disparu, je me mélange les pinceaux. Donc je pige pas!
    Si quelqu'un peut me venir en aide, ce sera bien sympathique,
    encore merci pour votre patience.

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


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

    J'ai du mal à saisir pourquoi vous suivez les tutoriels SDL 1.2 alors que les tutoriels SDL 2 existent. Qui plus est, il existe un guide de migration SDL 1.2 vers SDL 2 en français.
    Bref, peu importe, voyons le problème

    Maintenant, les SDL_Rect que l'on passe à SDL_RenderCopy sont bien plus efficaces. En effet, si la taille diffère entre la source et la destination, alors la source est redimensionnée pour correspondre à la destination.
    Du coup, le fait que vous dites : je dessine un rectangle de la taille de la fenêtre, fait qu'il y a redimension, car la source est plus grande. Vous devez donc définir votre rect, comme taille réelle de votre zone de rendu (là, vous avez mis à la taille de votre fenêtre ce qui est faux).
    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
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 10
    Points : 23
    Points
    23
    Par défaut
    Merci LittleWhite pour vos explications. Je comprends mieux maintenant pourquoi ça ne pouvait pas fonctionner!
    J'avais déjà consulté plusieurs fois le guide de migration sans trouver une réponse précise à ce problème.
    Je n'ai d'ailleurs pas trouvé une doc complète indiquant ce genre de changement de comportement (notamment pour les SDL_Rect et le reste).
    Peut-être il est encore trop tôt? Ou alors j'ai mal regardé?!
    (Sinon je suis ce tutoriel car il fait partie intégrante d'un vaste cours que je suis depuis longtemps et qui englobe bien d'autres choses...)

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    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 859
    Points : 218 579
    Points
    218 579
    Billets dans le blog
    120
    Par défaut
    Le SDL_Rect n'a pas changé, c'est l'utilisation faite par la fonction RenderCopy qui diffère de ce qui était fait à l'origine avec le BlitSurface. Cette modification est complètement décrite dans les présentations de la SDL 2. C'est ce qu'ils appellent le redimensionnement des sprites (avant il fallait encore une autre bibliothèque).
    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.

Discussions similaires

  1. Problème migration mdb> MySql
    Par pifane dans le forum Installation
    Réponses: 1
    Dernier message: 27/12/2006, 23h29
  2. Problèmes migration IIS5 vers IIS6
    Par Lambda7 dans le forum ASP
    Réponses: 8
    Dernier message: 13/10/2006, 09h06
  3. Problème Migration BCB5 -> BCB6
    Par Xav++ dans le forum C++Builder
    Réponses: 3
    Dernier message: 11/08/2006, 10h02
  4. Problème Migration Oracle
    Par bob_doulz dans le forum Administration
    Réponses: 4
    Dernier message: 20/04/2004, 09h56
  5. Réponses: 3
    Dernier message: 18/11/2002, 16h36

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