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 :

Scroll avec la souris


Sujet :

SDL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Scroll avec la souris
    Bonjour
    je souhaiterai avoir de l'aide de votre part car je bloque sur un point.
    Pour mon mini-jeu, je voudrais déplacer la carte avec la souris (si la souris se trouve au maximum à 20px du borde de la fenêtre droite, alors la camera défile vers la droite).

    J'avais réussi à faire fonctionner mon code mais lorsque j'ai voulu passer à l'étape suivante du code (déplacer un personnage) je me suis rendu compte que tant que la souris est dans la zone de scroll, le programme ne s'occupe que du scroll. J'ai donc recommencé le code pour mettre a jour le positionnement de la carte dans la boucle principale.
    Le problème c'est qu'il faut constamment bouger la souris pour faire le scroll alors que je voudrais que la carte défile si le curseur est dans la zone de scroll même si la souris ne bouge pas.

    Voila mon code qui appelle la 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
    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
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
     
    #include "constantes.h"
    #include "jeu.h"
    #include "scroll.h"
     
    void jouer(SDL_Surface* ecran)
    {
        /*Déclaration des variables et des surfaces*/
        int continuer = 1;
        SDL_Surface *carte = NULL, *camera = NULL;
        int tempsPrecedent = 0, tempsActuel = 0;
        SDL_Event event;
     
        /*Positionnement des surfaces */
        SDL_Rect positionCarte, positionCamera;
        //cette position ne changera jamais
        positionCarte.x = 0;
        positionCarte.y = 0;
        //position de la camera
        positionCamera.x = 100;
        positionCamera.y = 100;
        positionCamera.h = HAUTEUR_FENETRE;
        positionCamera.w = LARGEUR_FENETRE;
     
        //chargement des images
        carte = IMG_Load("images/maps.png");
        camera = IMG_Load("images/camera.png");
     
        //répétition des touches
        SDL_EnableKeyRepeat(10, 10);
     
        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                //clique sur la croix pour quitter
                case SDL_QUIT:
                    continuer = 0;
                break;
     
                //si on appuie sur une touche du clavier
                case SDL_KEYDOWN:
                    /*scroll clavier*/
                    if(event.key.keysym.sym == SDLK_UP || event.key.keysym.sym == SDLK_DOWN || event.key.keysym.sym == SDLK_LEFT || event.key.keysym.sym == SDLK_RIGHT)
                    {
                        //scrollClavier(ecran, carte, &positionCameraActuelle, &positionCameraFinal);
                    }
     
                    else if (event.key.keysym.sym == SDLK_ESCAPE)
                    {
                        continuer = 0;
                    }
                break;
            }
     
            //on lance la fonction du scroll par la souris pour savoir si on doit changer la position de la camera
            scrollSouris(ecran, carte, &positionCamera);
     
            //mise à jour des affichages si le temps est bon
            tempsActuel = SDL_GetTicks();
            if(tempsActuel - tempsPrecedent > FPS)
            {
                //mise a jour de l'affichage
                SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); /* On efface l'écran */
                SDL_BlitSurface(carte, &positionCamera, ecran, &positionCarte);
                SDL_Flip(ecran);
            }
     
        }
     
        SDL_FreeSurface(carte);
        SDL_Quit();
    }
    et la fonction qui s'occupe du scroll:
    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
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
     
    #include "constantes.h"
    #include "jeu.h"
    #include "scroll.h"
     
    void scrollSouris(SDL_Surface *ecran, SDL_Surface *carte, SDL_Rect *positionCamera)
    {
        int continuer = 1;
        SDL_Event event;
     
        SDL_Rect positionCarte;
        positionCarte.x = 0;
        positionCarte.y = 0;
     
    while (continuer)
        {
            SDL_PollEvent(&event);
            switch(event.type)
            {
                case SDL_MOUSEMOTION:
        //haut-gauche (1)
        if(event.motion.x <= ZONE_SCROLL && event.motion.y <= ZONE_SCROLL)
        {
            positionCamera->y -= VITESSE_DEFILEMENT;
            positionCamera->x -= VITESSE_DEFILEMENT;
     
            if(positionCamera->y <= 0)
            {
                positionCamera->y = 0;
            }
     
            if(positionCamera->x <= 0)
            {
                positionCamera->x = 0;
            }
        }
     
    /* ... j'ai coupé le code pour alléger car c'est toujours pareil*/
     
        //droite-centre (8)
        else if(event.motion.y > ZONE_SCROLL && event.motion.y < HAUTEUR_FENETRE - ZONE_SCROLL && event.motion.x <= ZONE_SCROLL)
        {
            positionCamera->x -= VITESSE_DEFILEMENT;
     
            if(positionCamera->x <= 0)
            {
                positionCamera->x = 0;
            }
        }
     
     continuer = 0;
     
     
     
        break;
                }
     
     
        }
    }
    Pourriez-vous m'aider à trouver mon erreur?
    Je vous remercie

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 564
    Points
    1 564
    Par défaut
    Si je comprends bien ton problème, tu souhaiterais que si la souris se trouve entre certaines coordonnées (par exemple, entre (0,0) et (15,20)), le scroll de l'écran se fasse sans bouger la souris.

    Si c'est le cas, rien de plus simple: il suffit, dans la fonction scrollSouris(...) de supprimer le SDL_PollEvent(...) et de simplement tester si la souris se trouve dans la surface de scroll.

    Quelque chose dans le style (non testé) devrait suffire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #define SCROLLX 0
    #define SCROLLY 0
    #define SCROLLWIDTH 15
    #define SCROLLHEIGHT 20
     
    void scrollSouris(SDL_Surface *ecran, SDL_Surface *carte, SDL_Rect *positionCamera, int mouseX, int mouseY)
    {
       if(mouseX>=SCROLLX && mouseX<=SCROLLX+SCROLLWIDTH && mouseY>=SCROLLY && mouseY<=SCROLLY+SCROLLHEIGHT) {
      // Traiter le scrolling
      ...
      }
    }
    Et pour l'appel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scrollSouris(ecran, carte, &positionCamera,event.motion.x,event.motion.y);
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

Discussions similaires

  1. [XL-2013] Scroll avec souris ds ListBox
    Par Moé Kolisse dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 21/03/2013, 23h32
  2. [C#] Déplacer un composant avec la souris
    Par GéniuS77 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 07/04/2011, 23h12
  3. [Prototype] Scroll avec la molette de la souris dans un div
    Par epeichette dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 02/07/2009, 14h43
  4. Scroll avec la souris
    Par domb_st dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 18/05/2007, 18h41
  5. Déplacer un panel avec la souris
    Par Harry dans le forum Delphi
    Réponses: 14
    Dernier message: 05/06/2006, 19h18

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