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 :

Déplacer une partie d'une SDL_Surface


Sujet :

SDL

  1. #1
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut Déplacer une partie d'une SDL_Surface
    Bonjour tout le monde,

    Je début en SDL et je me heurte à un (petit?) problème.

    Il y a, dans une SDL_Surface (mettons Surf, d'une taille 500x300) différent blits qui ont été faits par diverses fonctions d'un programmme.

    Il faudrait que je puisse déplacer un rectangle de Surf d'un endroit à un autre, par exemple déplacer un rectangle 30x60 de (20,50) vers (210,65).
    Est-ce faisable? Quitte à écrire une routine qui s'en charge...

    Question subsidiare: comment retrouver l'adresse de Surf, et comment y faire des modifications?

    Cela peut sembler basique comme demande, mais une réponse positive me tirerait un solide épine du pied.

    Merci d'avance à ceux qui m'apporteront leur aide

    Edgar.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  2. #2
    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
    Salut c'est pas très compréhensible ce que tu décris..
    j'ai l'impression que tu te compliques énormément la vie..
    une SDL_Surface c'est initialisé une bonne fois pour toute au lancement du jeu sinon tu vas avoir des ralentissements dans l'affichage.
    Peux-tu décrire ce que tu affiches, des animations ?

  3. #3
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    En fait, c'est simple. Je voudrais pouvoir faire ceci:

    le rectangle noir ayant été blitté, par exemple, par une autre fonction.

    Et je souhaiterais également savoir où est stockée une surface (je suppose que l'adresse doit se trouver quelque part dans la structure SDL_Surface) et comment je peux aller y chercher/écrire une ligne ou une colonne de pixels (ou un seul pixel). Puis-je me permettre de faire, en restant à l'intérieur de la surface, un memmove ou un memcpy? De même, puis-je faire un memmove/memcpy vers une une structure de mon programme, allouée par mes soins, pour la mémoriser avant modification?

    Merci d'avance.

    Edgar.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  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 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Un déplacement de surface se fait de manière logique. Dans le sens que, en théorie, un sprite est associé à une position. Lors du rendu, ce sprite sera donc affiché à la position donnée.
    L'effet de déplacement est du au fait que nous effaçons l'écran, puis que nous affichons le sprite à une autre position.

    L'adresse d'une surface, sachant que SDL_Surface est utilisé en pointeur, l'adresse est le pointeur lui même.
    Donc utilisez le contenu de la structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SDL_Surface* pSurf = ... ;
    pSurf->pxiels; // Faire des trucs sur les pixels
    Voir http://sdl.beuc.net/sdl.wiki/SDL_Surface

    Pour lire / écrire des pixels, il est conseillé d'utiliser les fonctions données dans la documentation:
    http://sdl.beuc.net/sdl.wiki/Introdu...Video#getpixel
    http://sdl.beuc.net/sdl.wiki/Introdu...Video#putpixel
    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 expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Hello,
    Merci LittleWhite.
    J'avais déjà vu cette documentation, mais j'ai dû zapper les exemples (quand on a les yeux tafigués... )
    J'ai pris bonne note du l'url des exemples.
    Ce que je voulais savoir, c'est si un memcpy fonctionne. Comme il s'agit d'une zone mémoire, ça ne devrait poser aucun problème.
    Je teste ça dans les heures qui suivent, je te tiens au courant et clôts la discussion si ça fonctionne comme je le souhaite.

    Un grand merci à toi.
    Edgar.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  6. #6
    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 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Citation Envoyé par edgarjacobs Voir le message
    Hello,
    Merci LittleWhite.
    J'avais déjà vu cette documentation, mais j'ai dû zapper les exemples (quand on a les yeux tafigués... )
    J'ai pris bonne note du l'url des exemples.
    Ce que je voulais savoir, c'est si un memcpy fonctionne. Comme il s'agit d'une zone mémoire, ça ne devrait poser aucun problème.
    Je teste ça dans les heures qui suivent, je te tiens au courant et clôts la discussion si ça fonctionne comme je le souhaite.

    Un grand merci à toi.
    Edgar.
    memcpy a de forte chance de fonctionner sur les "pixels". Par contre, il faut bien faire attention que le format en entrée est le même que celui en sortie. De plus, il faut faire attention à bien locker la surface (je pense).
    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.

  7. #7
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Bonsoir LittleWhite,
    Après quelques tâtonnements (il a fallu que je comprenne comment surface->pixels fonctionnait), j'ai pondu ce code qui fonctionne très bien, même si source et destination se recouvrent:

    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
     
    void CopyArea(SDL_Surface *areaTo,SDL_Rect areaInfoTo,SDL_Surface *areaFrom,SDL_Rect areaInfoFrom)
    {
    	int bpp;
    	Uint8 *source,*dest;
     
    	if((bpp=areaFrom->format->BytesPerPixel)!=areaTo->format->BytesPerPixel) {
    		// Traitement d'erreur, mais je ne pense pas que cela puisse jamais arriver!
    		return;
    		}
    	source=(Uint8 *)areaFrom->pixels+areaInfoFrom.y*areaFrom->pitch+areaInfoFrom.x*bpp;
    	dest=(Uint8 *)areaTo->pixels+areaInfoTo.y*areaTo->pitch+areaInfoTo.x*bpp;
    	areaInfoTo.w*=bpp;
    	while(areaInfoTo.h) {
    		memmove(dest,source,areaInfoTo.w);
    		source+=areaFrom->pitch;
    		dest+=areaTo->pitch;
    		areaInfoTo.h--;
    		}
    }
    Appel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // Copie de (600,300) vers (10,15) sur largeur=100 et hauteur=50
    	SDL_Rect toInfo,fromInfo;
    	toInfo.x=10; toInfo.y=15; toInfo.w=100; toInfo.h=50;
    	fromInfo.x=600; fromInfo.y=300;
    	CopyArea(wnd,toInfo,wnd,fromInfo);
    	SDL_Flip(wnd);
    Il va sans dire que les surfaces de départ et d'arrivée peuvent être différentes!
    Je dois encore ajouter les lock/unlock, ils sont nécessaires d'après la doc.

    Merci pout tes !

    Edgar.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  8. #8
    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 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Au final, j'ai peut être était débile. Notamment car ce que vous faites, je pense, est exactement la fonction: SDL_BlitSurface()
    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.

  9. #9
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Hello,

    Au final, j'ai peut être était débile. Notamment car ce que vous faites, je pense, est exactement la fonction: SDL_BlitSurface()
    Pas le moins du monde. C'est sans doute ce que fait SDL_BlitSurface(), mais la partie du programme qui déplace le rectangle n'est pas censée connaître la surface qui a été blitée au départ, et donc fatalement, pas non plus le contenu blité. La seule chose qu'elle connait, c'est la destination (et sa taille), et la coordonnée de la source.

    Donc, pas si débile que ça! Y'a pas à L'aide est super! Merci.

    Edgar.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  10. #10
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Bonsoir à tous,

    Attention: la fonction montrée plus haut ne donne pas le résultat espéré dans un certain cas: si elle copie une surface sur elle-même, en copiant les lignes de bas en haut.

    Voici la fonction corrigée:

    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
     
    void CopyArea(SDL_Surface *areaTo,SDL_Rect areaInfoTo,SDL_Surface *areaFrom,SDL_Rect areaInfoFrom,int sens)
    {
    	int bpp,incr;
    	Uint8 *source,*dest;
     
     
    	if((bpp=areaFrom->format->BytesPerPixel)!=areaTo->format->BytesPerPixel) {
    		// Traitement d'erreur
    		return;
    		}
    	if(sens==0) {
    		source=(Uint8 *)areaFrom->pixels+areaInfoFrom.y*areaFrom->pitch+areaInfoFrom.x*bpp;
    		dest=(Uint8 *)areaTo->pixels+areaInfoTo.y*areaTo->pitch+areaInfoTo.x*bpp;
    		incr=1;
    		}
    	else {
    		source=(Uint8 *)areaFrom->pixels+(areaInfoFrom.y+areaInfoTo.h)*areaFrom->pitch+areaInfoFrom.x*bpp;
    		dest=(Uint8 *)areaTo->pixels+(areaInfoTo.y+areaInfoTo.h)*areaTo->pitch+areaInfoTo.x*bpp;
    		incr=-1;
    		}
    	areaInfoTo.w*=bpp;
    	while(areaInfoTo.h) {
    		memmove(dest,source,areaInfoTo.w);
    		source+=areaFrom->pitch*incr;
    		dest+=areaTo->pitch*incr;
    		areaInfoTo.h--;
    		}
    }
    Le paramètre sens vaut 0 si la copie se fait haut en bas (scroll down), !=0 pour copier de bas en haut (scroll up).

    Désolé pour ceux qui ont essuyé les plâtres de cette erreur.

    Edgar.

    PS: il est peut-être possible de se passer de ce paramètre en testant les adresses areaTo et areaFrom ainsi que les coordonnées x et y respectives, mais je n'ai pas eu le temps de m'y pencher.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

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

Discussions similaires

  1. donner une couleur a une partie d'une forme
    Par ralf91 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 04/04/2008, 17h02
  2. Réponses: 1
    Dernier message: 04/04/2008, 12h14
  3. Sélectionner seulement une partie d'une valeur d'une cellule
    Par ArthurO0O dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/08/2007, 11h05
  4. masquer une partie d'une vidéo par une banniere
    Par lezabour dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 16/10/2006, 16h47
  5. copier une partie d'une image vers une autre
    Par gregcat dans le forum Langage
    Réponses: 1
    Dernier message: 14/04/2006, 13h39

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