Précédent   Forum du club des développeurs et IT Pro > Applications > Développement 2D, 3D et Jeux > API graphiques > SDL
SDL Forum d'entraide sur l'API SDL. Avant de poster -> FAQ SDL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 07/12/2012, 18h09   #1
majesty03
Invité de passage
 
Inscription : 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
majesty03 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2012, 01h57   #2
edgarjacobs
Membre éclairé
 
Homme
Développeur informatique
Inscription : mai 2011
Messages : 203
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 53
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mai 2011
Messages : 203
Points : 319
Points : 319
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);
edgarjacobs est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 17h38.


 
 
 
 
Partenaires

Hébergement Web