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 :

Image qui suit le curseurs sur plusieurs écrans différents sans effacer le précédent


Sujet :

SDL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    67
    Points
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 67
    Points : 48
    Par défaut Image qui suit le curseurs sur plusieurs écrans différents sans effacer le précédent
    Bonsoir,
    j'aimerai que l'utilisateur, une fois qu'il clique à un lieu précis, puisse obtenir une image qui suit le curseur, même si il change d'écran.

    J'ai essayé avec une fonction :

    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 objetSouris (SDL_Surface* ecran)
    {
        SDL_Surface *oSouris = NULL;
        SDL_Rect positionSouris;
     
        SDL_Event event;
     
            oSouris = IMG_Load("feu.png");
     
            switch(event.type)
            {
                case SDL_MOUSEMOTION:
                    positionSouris.x = event.motion.x;
                    positionSouris.y = event.motion.y;
                break;
            }
     
            SDL_BlitSurface(oSouris,NULL,ecran,&positionSouris);
            SDL_Flip(ecran);
    }
    Mais, on dirait que ça ne suffit pas? Il faut que je renvoie une surface, mais je ne sais pas comment déclarer une fonction SDL qui renvoie une surface?

    Merci pour votre aide!


    @SoftEvans: j'ai rencontré des problèmes que je ne pensais pas rencontrer, et du coup je laisse de côtés pour le moment mon autre problème sur l'assombrissement de l'écran, mais j'essayerai dés que j'en aurai l'occasion, merci pour ton aide

  2. #2
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 080
    Points
    2 356
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 080
    Points : 2 356
    Par défaut
    Salut

    @SoftEvans: j'ai rencontré des problèmes que je ne pensais pas rencontrer, et du coup je laisse de côtés pour le moment mon autre problème sur l'assombrissement de l'écran, mais j'essayerai dés que j'en aurai l'occasion, merci pour ton aide
    Message bien compris, je peux toujours te créer un pseudo-code si tu le veux.

    Bon, pour ton probleme, je pense que tu t'y prend mal.
    D'apres ce que j'ai compris, tu veux cliquer sur un objet de ta fenetre, que celui ci se colle a ton curseur et qu'il le suive partout, meme si tu sort de la fenetre.

    Si c'est vraiment ce que tu veux faire, ton idée a du bon, mais malheureusement ce n'est pas comme ça que tu pourra sortir de ta fenêtre.
    En effet, SDL_BlitSurface ne colle ta surface qu'a l'intérieur de ta fenêtre et fais planter le programme si tu tente de blitter avec une/des coordonnées négative.

    En fait, je pense que tu peux le faire en créant ton curseur.
    Je pense que tu trouvera tou ce qu'il te faut ici
    http://jeux.developpez.com/faq/sdl/?page=curseur

    Pour la recuperation de l'image, cela ne doit poser de gros problème, car il y a peu, je t'ai répondu sur "Utiliser les coordonnées d'un objet en zone".
    La première idée que j'ai serait de faire un tableau de SDL_Rect pour chaque image. Lors du click, tu parcours ce tableau, et tu test si la position (SD_Rect) plus l'image (SDL_Surface weigh et hight) sont compris a l'endroit ou tu click.
    Si tu veux vraiment faire ma méthode mais que tu y arrive pas, essaye les liste chainée.

    En espérant avoir répondu a ta question et ne pas t'avoir embrouiller.
    Si quelqu'un d'autre a une autre solution meilleur que la mienne, je suis preneur aussi

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    67
    Points
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 67
    Points : 48
    Par défaut
    Non merci, ça ira pour le pseudo-code, merci je veux m'entraîner, donc autant en profiter
    ----------------------------

    Et hum non, mon problème ne vient pas de là (ça me parait bien compliqué de vouloir faire ça, mais c'est une bonne idée que je n'avais pas pensé!).


    En fait, si on reprend l'image de l'autre article :


    J'ai envi qu'une fois que le joueur clique sur un objet, que l'image de l'objet suive le curseur à la fois dans l'inventaire, mais aussi sur l'écran du jeux (l'écran sombre derrière l'inventaire pour cette image).

    Je sais comment faut faire pour qu'il suive que dans l'inventaire, mais pas pour l'écran et l'inventaire à la fois.

    Merci encore pour tout ton aide!

  4. #4
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 080
    Points
    2 356
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 080
    Points : 2 356
    Par défaut
    Je ne dois pas tout comprendre.
    Peut tu me donner le code ou même l'algo que tu utilise pour "faire ce que tu veux mais uniquement dans la partie clair" ?

    Car pour moi, la partie clair et la partie foncé font toute deux partie de l'écran et si tu peux le faire dans la partie clair, je ne vois pas pourquoi tu ne peux pas le faire dans la partie grise ... a moins d'une exception que tu ne nous dit pas
    (Tu fais peut être de la POO et tu n'arrive pas a faire "sortir" l'image de ton objet "partie clair" ... ).

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    67
    Points
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 67
    Points : 48
    Par défaut
    Salut!

    Je crois que copier le code serai trop long et pas très claire? (redemande moi si tu ne comprends toujours pas ce que je veux faire).


    Voici l'algo (enfin je suppose que ça s'appelle comme ça):



    et donc, par exemple:
    une fois que ouvrirInventaire et terminé, il revient à l'écran d'avant dans le lieux mais en supprimant l'image de l'inventaire (ce qui semble normal).
    Mais, j'aimerai qu'il conserve l'image (qui suit la souris dans le jeu) dans ouvrirInventaire (même si objetSouris ne "supprime" pas l'écran de l'inventaire contrairement à l'inventaire qui a FillRect pour l'écran). Et que la souris avec l'image reste aussi dans la fonction jouer.

    Voili voilo

    merci pour ton aide encore une fois

    Je me demandais aussi si il était possible qu'une fonction renvoie deux informations mais différentes? (par exemple SDL_Rect positionSouris, et SDL_Surface ?)


    ----------------------------------------------------------

    J'ai fais du changement pour avoir plus de faciliter:

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    /*
    Objets
    Feu :
    .surface *objetFeu
    .position positionOFeu
    .IMG non utilisé : feu.png
    .IMG utilisé : useFeu.png
    .Nb désigné : objet = 1
    */
     
     
     
    int ouvrirInventaire(SDL_Surface* ecran, int objet)
    {
        SDL_Surface *inventaire = NULL, *objetFeu = NULL, *oSouris = NULL;
        SDL_Rect positionInventaire, positionOFeu, positionSouris;
        SDL_Event event;
        int continuer = 1;
     
        SDL_Init(SDL_INIT_VIDEO);
     
        inventaire = IMG_Load("inventaire.jpg");  //Chargement de l'image de l'inventaire
        positionInventaire.x = ecran->w / 2 - inventaire->w / 2;
        positionInventaire.y = ecran->h / 2 - inventaire->h / 2;
     
        if(objet == 0) //Si l'objet n'a pas encore été utilisé
        {
            objetFeu = IMG_Load("feu.png");
            positionOFeu.x = 320;
            positionOFeu.y = 260;
        }
     
        else //Sinon on le grise
        {
            objetFeu = IMG_Load("useFeu.png");
            positionOFeu.x = 320;
            positionOFeu.y = 260;
        }
     
     
    while(continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_MOUSEBUTTONDOWN:
                    if((event.button.button == SDL_BUTTON_LEFT) &&(event.button.x <= 360)&&(event.button.x >= 320)&&(event.button.y <= 290)&&(event.button.y >= 260)) //Si le joueur clique à cet endroit
                        {
                            objetFeu = IMG_Load("useFeu.png");
                            objet = 1; //1 représente l'objet "feu"
                            oSouris = IMG_Load("feu.png"); //On charge l'icone feu qui va suivre la souris
                        }
     
                    if(event.button.button == SDL_BUTTON_RIGHT)
                        continuer = 0; //on quitte l'inventaire
     
     
                case SDL_MOUSEMOTION:
                    positionSouris.x = event.motion.x;
                    positionSouris.y = event.motion.y;
                break;
            }
     
     
        SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0));
        SDL_BlitSurface(inventaire,NULL,ecran,&positionInventaire);
        SDL_BlitSurface(objetFeu,NULL,ecran,&positionOFeu);
        SDL_BlitSurface(oSouris,NULL,ecran,&positionSouris);
        SDL_Flip(ecran);
     
        }
     
        SDL_FreeSurface(ecran);
        SDL_FreeSurface(inventaire);
        SDL_FreeSurface(objetFeu);
     
        return objet;
    }

    Si tu as besoin de plus de détails pour comprendre le code, n'hésite pas.

    Donc là, j'aimerai qu'une fois que l'inventaire est terminé, que l'image du feu qui suit la souris reste dans l'écran (je pensais qu'en évitant de faire SDL_FreeSurface ça marcherai... mais apparemment non).


    Avec cette modification le programme devient comme ça:



    Il manque donc plus qu'à retourner l'image qui suit la souris dans la fonction jouer qui appelle la fonction ouvrirInventaire (je vais peut-être la renommée, vu qu'elle n'a plus grand chose à voir avec le début XD).

    Merci encore!

  6. #6
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 080
    Points
    2 356
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 080
    Points : 2 356
    Par défaut
    Je n'ai pas beaucoup de temps, j'éditerai le message plus tard après que j'ai bien compris ton problème.

    Juste pour te dire qu'une fonction peut renvoyer plusieurs résultat. Il suffit que tu passe ce que tu veux en pointeur.
    si les information que tu veux renvoyer ne peuvent pas être passer par paramétre, alors fait une structure ou un objet que ta fonction renverra.

    /!\ Attention, un seul et unique SDL_Init() !!!!!!!

    Il faut que tu le mette dans le main et c'est tout.
    Je pensais que cela planterait mais apparemment non.

    Edit :

    Bon, j'ai compris ce que tu voulais faire et ton problème.
    Voila comment je te propose de le résoudre.

    Mes explication vont peut être être compliquer, regarde alors le code a la fin:

    Tout dabord :

    Dans lieu.c (que je suppose être ton main.c) tu une variable SDL_Surface initialisé a NULL (ImageInv par exemple).

    Tu modifie le type de retour de ouvrirInventaire(SDL_Surface* ecran, int objet) ( je ne sais pas a quoi correspond int objet mais si c'est l'objet qui doit suivre le curseur, tu peux l'effacer). Tu dis que ta fonction renvoie un SDL_Surface.

    Tu créé une variable nommé ImageInvRetourner de type SDL_Surface dans inventaire.c initialisé a NULL lui aussi.

    Tu modifie le retour et tu retourne ImageInvRetourner;

    Dans lieu.c, tu dis que ImageInv = ouvrirInventaire(SDL_Surface* ecran, int objet);

    Maintenant, la démarche :

    Quand on demande d'ouvrir l'inventaire, tu lance ouvrirInventaire(SDL_Surface* ecran, int objet);

    dans ta fonction, tu recupere l'evenement click et tu regarde :

    Si on a cliquer dans la partie clair ( inutile de continuer sinon )
    {
    Si on a cliquer sur la croix
    Sortie de fonction avec return ImageInvRetourner
    Sinon
    Si on a cliquer sur une de tes image
    }

    Si on a cliquer sur une de tes image, tu recupere la SDL_Surface de l'image clicker et tu la copie dans ImageInvRetourner.



    Dans lieux.c :

    if ( ImageInv != NULL )
    {
    SDL_Rect positionSouris;
    positionSouris.x = event.motion.x;
    positionSouris.y = event.motion.y;
    SDL_BlitSurface (ImageInv ,NULL,ecran,&positionSouris);

    }


    Code Source Résumé :

    IL EST FORTEMENT PROBABLE QUE CE CODE NE MARCHE PAS CAR JE NE L'AI PAS TESTER

    Ce code a pour unique but de donner la structure de ce qu'il faut faire pour mettre en œuvre ma méthode ( qui n'est pas forcement la meilleur, je vous le rappelle, merci de garder ca a l'esprit)



    Inventaire.c
    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
    53
    54
    55
    56
    57
    58
    59
    60
     
    SDL_Surface ouvrirInventaire(SDL_Surface* ecran, int objet)
    {
        SDL_Surface *inventaire = IMG_Load("inventaire.jpg"), *objetFeu = NULL;
     
        // C'est cette surface qui sera retourner
        SDL_Surface *ImageRetourner = NULL;
     
        SDL_Rect positionInventaire, positionOFeu, positionSouris;
            positionInventaire.x = ecran->w / 2 - inventaire->w / 2;
            positionInventaire.y = ecran->h / 2 - inventaire->h / 2;
            positionOFeu.x = 320;
            positionOFeu.y = 260;
     
        SDL_Event event;
     
     
        // declareration en statique pour garder en memoire son etat !
        static int objet = 1;
        if(!objet) //Si l'objet n'a pas encore été utilisé
            objetFeu = IMG_Load("feu.png");
        else //Sinon on le grise
            objetFeu = IMG_Load("useFeu.png");
     
    int continuer = 1;
    while(continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_MOUSEBUTTONDOWN:
                    if((event.button.button == SDL_BUTTON_LEFT)
                    // Tu regarde si il a cliquer sur un objet.
                          // si effectivement il a cliker sur un objet
                          ImageRetourner = Image cliquer; // Probablement une longue serie de if.
                    if(event.button.button == SDL_BUTTON_RIGHT)
                        continuer = 0; //on quitte l'inventaire
                break;
            }
     
     
        SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0));
        SDL_BlitSurface(inventaire,NULL,ecran,&positionInventaire);
        SDL_BlitSurface(objetFeu,NULL,ecran,&positionOFeu);
     
        // cette condition nous permet de blitter l'image contenue dans ImageInv au coordonne de la souris
        if ( ImageRetourner != NULL )
        {
             SDL_Rect positionSouris;
             positionSouris.x = event.motion.x;
             positionSouris.y = event.motion.y;
            SDL_BlitSurface (ImageRetourner ,NULL,ecran,&positionSouris);
        }
     
        SDL_Flip(ecran);
     
        }
     
        return ImageRetourner ;
    }


    Lieux.c
    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
     
    // initialisation SDL uniquement la et déclaration autre variable
     
    // Cette variable nous intéresse car c'est elle qui va nous permettre de résoudre le problème
    SDL_Image *ImageInv = NULL; 
     
    while ( continuer ) 
    {
        SDL_Event event;
            while (SDL_PollEvent(&event))
             {
              // Si on clique sur le déploiement de l'inventaire
              ImageInv = ouvrirInventaire(SDL_Surface* ecran, int objet);
     
             // A toi de definir l'evenement qui va faire que l'objet ne sera plus sur la souris
             ImageInv = NULL;
             }
     
        // cette condition nous permet de blitter l'image contenue dans ImageInv au coordonne de la souris
        if ( ImageInv != NULL )
        {
             SDL_Rect positionSouris;
             positionSouris.x = event.motion.x;
             positionSouris.y = event.motion.y;
            SDL_BlitSurface (ImageInv ,NULL,ecran,&positionSouris);
        }
     
    }
     
    // Sortie propre de la SDL avec FreeSurface , etc ...

    Il est probable que le retour de ouvrirInventaire soit SDL_Surface* . Je ne sais plus lequelle des retour je doit mettre, a toi de tester

    Corrigé moi et apporter vos idées d'amélioration s'il vous plait.

    J'espère avoir été assez clair.

    a toute !

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    67
    Points
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 67
    Points : 48
    Par défaut
    Salut!

    Bon alors, j'ai essayé tes solutions, mais hélas, ça ne marchait pas (je crois que c'est lié à la fonction SDL Surface, qu'on ne peut pas renvoyer une surface). Et en réfléchissant bien, je me suis dis que je me compliquais la vie à faire ça, car de toute manière, dans mon fichier lieux.c il demandera quel est l'objet sélectionner par le joueur, donc, je me suis dis, qu'il allait forcément connaître l'objet avec un if, et qu'il suffit de mettre dans la fonction lieux.c, après que la fonction ouvrirInventaire est renvoyé la valeur 1 (qui désigne l'objet "feu") d'objet. :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if(event.button.button == SDL_BUTTON_RIGHT)
                        {   objet = ouvrirInventaire(ecran, objet); //Si la valeur renvoyé par la fonction est différent de 0, c'est donc qu'on a un objet:
                            if(objet != 0)
                            {
                                if(objet == 1) //si la valeur de l'objet est de 1, alors c'est l'objet FEU qui est utilisé
                                    oSouris = IMG_Load("feu.png"); //On charge l'icone feu qui va suivre la souris
                            }
     
                        }
    Merci encore une fois pour toutes tes aides, je vais pouvoir me concentrer sur d'autres améliorations!

    (Je te rassure, je ne fais juste qu'un schéma pour voir si je peux réaliser un jeu point and click en 2D). Mais mon rêve est de faire un du style Full Trothle ou Monkey Island! Seulement, il y a de la 3D...

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

Discussions similaires

  1. DIV qui suit le scroll de l'écran sans se superposer sur les autres !
    Par Dsphinx dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 12/07/2011, 12h43
  2. [AC-2003] Contrôle qui suit le curseur sur clic
    Par Glherbier dans le forum VBA Access
    Réponses: 1
    Dernier message: 31/05/2011, 12h50
  3. icône qui suit le curseur à l'écran
    Par laurentSc dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 15/12/2009, 09h51
  4. Capture d'image et affichage sur plusieurs écran
    Par styzme dans le forum Imagerie
    Réponses: 0
    Dernier message: 18/11/2009, 09h26
  5. Un image qui se redimensionne dynamiquement sur toute la cel
    Par Furius dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 11/01/2006, 00h10

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