Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

Discussion: Scroll avec la souris

  1. #1
    Invité de passage
    Inscrit en
    avril 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : avril 2009
    Messages : 2
    Points : 1
    Points
    1

    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 :
    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 :
    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 éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2011
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mai 2011
    Messages : 254
    Points : 444
    Points
    444

    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 :
    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 :
    scrollSouris(ecran, carte, &positionCamera,event.motion.x,event.motion.y);

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •