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 :

[C] SDL_Rect et valeur negative


Sujet :

SDL

  1. #1
    Membre éclairé
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Points : 812
    Points
    812
    Par défaut [C] SDL_Rect et valeur negative
    Bien le bonsoir !

    je voulais savoir pourquoi je ne peux pas mettre de valeur negative dans ma variable SDL_Rect en coordonnée x ou y.

    Pourtant les x,y de SDL_Rect sont des Sint donc positif ou négatif et
    les w,h sont Uint donc seulement positif.

    Le soucis c'est que si je mets positionfond.x à -50, SDL me le remet à 0 automatiquement quand il l'affiche du coup c'est pas genial vu que je voulai un perso qui evolue dans une map horizontal. Y'aurait il une solution?

    Merci a vous.

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Bonsoir,

    Peux tu afficher ton source, du moins la partie concernant ton problème car je e comprend pas pourquoi tu veux avoir une position negative?
    Il me semble que les axe commence à 0 au bord gauche ( axe x ) et bord supérieur ( axe y ).

    En esperant pouvoir t'aider

  3. #3
    Membre éclairé
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Points : 812
    Points
    812
    Par défaut
    Bah si mnt un perso sors sur la droite, sa position x negative, et donc il sera offscreen, mais SDL le bloque à la position 0.
    Tout c'que j'veux faire c'est le faire bouger tout à droite, et dès qu'il est offscreen, il apparait sur la gauche...
    Voici la partie du code décrementant sa position ->

    if(--naruto.position.x<=(-48))
    naruto.position.x = ecran.w;
    naruto etant de cette structure :
    typedef struct
    {
    SDL_Rect position;
    char table_sprite[100];
    int tailleSprite,nbSprite,typeMvt,numMvt,transP[3],delai;
    } Perso;

  4. #4
    Membre du Club Avatar de Jordinateur
    Profil pro
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Points : 51
    Points
    51
    Par défaut
    En fait, tu l'as dis toi-même, les éléments d'un SDL_Rect x et y PEUVENT être négatif, mais le problème, c'est que c'est la SDL qui bloque ton personnage lorsqu'il est offscreen (seulement lorsque les données en abcisse ou en ordonnées sont negatives par contre...)

    Je n'ai pas bien compris ce que tu veux faire mais je vais te proposer la solution suivante :
    Tu fais une condition et si ton sprite est offscreen [u]entièrement[u], tu ne fais pas de blit offscreen c'est logique
    Ensuite tu blite l'image avec SDL_BlitSurface et tu donne en deuxième argument un SDL_Rect si une partie du sprite doit-être affiché dans ta fenêtre (par exemple la moitié du sprite et offscreen et l'autre non) (si tu ne comprends pas sa demande moi je t'expliquerais comment faire).

    C'est aussi simple que ça ;p


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(--naruto.position.x<=(-48))
    naruto.position.x = ecran.w;
    Je ne coomprends pas bien pourquoi tu met "--" devant naruto.position...

    EDIT : Préfère la balise CODE à la balise QUOTE pour poster du code

  5. #5
    Membre éclairé
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Points : 812
    Points
    812
    Par défaut
    Citation Envoyé par Jordinateur Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(--naruto.position.x<=(-48))
    naruto.position.x = ecran.w;
    Je ne coomprends pas bien pourquoi tu met "--" devant naruto.position...
    bah tant que la position x est superieur à -48, on decremente son abscisse,
    et si c'est inferieur, on le deplace à l'autre bout de l'ecran...

    Mais toi tu veux que j'fasse un algorithme assez complexe que si la moitié de du perso ne doit apparaitre qu'à l'ecran, il faut que je fasse un rognage du sprite...

    trop compliqué, y a pas plus simple...
    On peut pas creer notre propre structure SDL_Rect, qui peuvent contenir des abscisses et ordonnées negative?
    Quelle est la fonction qui bloque les abscisses et ordonnées à 0?
    la structure SDL_Rect, ou SDL_BlitSurface?

  6. #6
    Membre du Club Avatar de Jordinateur
    Profil pro
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Points : 51
    Points
    51
    Par défaut
    Ba je n'ai pas d'autres solutions ! En fait c'est SDL_BlitSurface qui bloque ça. Moi j'arrive a bliter une seule fois en offscreen puis après sa ne marche plus...Je ne peux pas t'en dire plus mais pour moi c'est la seule solution qui existe...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 58
    Points : 63
    Points
    63
    Par défaut
    Pas de solution miracle pour ce problème :

    -Soit rogner le sprite & jouer sur le clipping pour afficher uniquement une partie de l'image.
    -Soit blitter sur une surface plus grande que l'ecran et cliper la surface pour afficher à l'ecran

  8. #8
    Membre éclairé
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Points : 812
    Points
    812
    Par défaut
    j'comprend pas ta methode de surface plus grande

  9. #9
    Membre habitué Avatar de Polyfructol
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Avril 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Avril 2007
    Messages : 131
    Points : 157
    Points
    157
    Par défaut
    Pour blitter une face hors de l'écran (ou en partie), je passe par une "variable intermédiaire" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SDL_Rect dstrect;
    int x = -10;
    int y = 0;
     
    // dans la boucle du jeu, calcul du x et du y ... puis
    dstrect.x = x;
    dstrect.y = y;
    SDL_BlitSurface(sprite, NULL, screen, &dstrect);
    Ça marche bien mais je serais curieux de savoir pourquoi ça ne marche pas quand on manipule directement SDL_Rect.

  10. #10
    Membre éclairé
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Points : 812
    Points
    812
    Par défaut
    En effet,ta méthode fonctionne !
    Voilà la méthode miracle
    Je t'en remercie beaucoup !

  11. #11
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Ce n'est pourtant pas très difficile de faire ce que tu veux :

    -Soit rogner le sprite & jouer sur le clipping pour afficher uniquement une partie de l'image.
    Je n'ai pas vraiment testé mais cela me semble correct :
    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
     
    void SDL_MyBlitSurface(SDL_Surface *src, SDL_Rect *pr_src, SDL_Surface* dest, SDL_Rect *pr_dest)
    {
        SDL_Rect r_dest, r_src;
     
        if((src != NULL) && (dest != NULL)) {
     
            if(pr_src == NULL) {
                memset(&r_src, 0, sizeof(r_src));
                r_src.w = src->w;
                r_src.h = src->h;
            }
            else {
                r_src = *pr_src;
            }
     
            if(pr_dest == NULL) {
                memset(&r_dest, 0, sizeof(r_dest));
                r_src.w = dest->w;
                r_src.h = dest->h;
            }
            else {
                r_dest = *pr_dest;
            }
     
            /* Gestion de la position de destination */
            if(r_dest.x < 0) {
                r_src.x += (-r_dest.x);
                r_dest.x = 0;
            }
     
            if(r_dest.y < 0) {
                r_src.y += (-r_dest.y);
                r_dest.y = 0;
            }
     
            /* On regarde si on est toujours dans l'image */
            if((r_src.x < src->w) && (r_src.y < src->h)) {
                SDL_BlitSurface(src, &r_src, dest, &r_dest);
            }
        }
    }
    Jc

  12. #12
    Membre éclairé
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Points : 812
    Points
    812
    Par défaut
    J'aurai pu faire la methode de cliping, mais la methode cité ci dessus est bien plus simple, et allege beaucoup le code.

  13. #13
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par ZouBi Voir le message
    J'aurai pu faire la methode de cliping, mais la methode cité ci dessus est bien plus simple, et allege beaucoup le code.
    Cela allège le code peut-être... Je dis peut-être parce que tu as besoin d'une autre surface, il faut faire la première copie sur cette surface, ensuite il faut copier sur la surface écran...

    Côté performances, il n'y pas de discussion. La méthode clipping est largement meilleure et plus propre à bien des niveaux...

    Jc

  14. #14
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut
    je vient de tomber sur ce post, et je me permet de reposter le code de fearyourself avec quelques modifications ( ça peut toujours servir ):

    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
     
    void SDL_MyBlitSurface(SDL_Surface *src, SDL_Rect *pr_src, SDL_Surface* dest, SDL_Rect *pr_dest){
        SDL_Rect r_dest, r_src;
     
        if((src != NULL) && (dest != NULL)) {
     
            if(pr_src == NULL) {
                memset(&r_src, 0, sizeof(r_src));
                r_src.w = src->w;
                r_src.h = src->h;
            }
            else {
                r_src = *pr_src;
            }
     
            if(pr_dest == NULL) {
                memset(&r_dest, 0, sizeof(r_dest));
                r_src.w = dest->w;
                r_src.h = dest->h;
            }
            else {
                r_dest = *pr_dest;
            }
     
            /* Gestion de la position de destination */
            if(r_dest.x < 0) {
                r_src.x += (-r_dest.x);
                r_src.w -= (-r_dest.x);
                r_dest.x = 0;
            }
     
            if(r_dest.y < 0) {
                r_src.y += (-r_dest.y);
                r_src.h -= (-r_dest.y);
                r_dest.y = 0;
            }
     
            /* On regarde si on est toujours dans l'image */
            if((r_src.x + r_src.w <= src->w) && (r_src.y  + r_src.h <= src->h)) {
                SDL_BlitSurface(src, &r_src, dest, &r_dest);
            }
        }
    }
    j'ai simplement ajouté la gestion de la largeur et hauteur le l'image lorsque l'image sort de l'écran, dans le cas ou on utilise une simple image ça ne change strictement rien, mais la version de fearyourself ne ne permettait pas l'utilisation des sprites ( on pouvais voir les images d'à coté ).

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

Discussions similaires

  1. Probleme valeur negative dans OID avec TDISNMP
    Par fbalien dans le forum Web & réseau
    Réponses: 1
    Dernier message: 23/10/2014, 17h27
  2. Réponses: 2
    Dernier message: 30/11/2013, 18h22
  3. Suppression d'une valeur negative
    Par sami_rio dans le forum Excel
    Réponses: 5
    Dernier message: 25/03/2008, 22h25
  4. Réponses: 2
    Dernier message: 30/11/2007, 17h57
  5. Valeur negative qui sort des tenebres ?
    Par Battosaiii dans le forum C
    Réponses: 9
    Dernier message: 14/03/2006, 16h11

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