4.2 La souris

De la même manière que pour le clavier la souris a plusieurs type d’événements possibles :

  • MOISSONNEUSE-BATTEUSE : quand on presse un bouton de la souris
  • PIEDS-DE-MOUTON : quand on relâche un bouton de la souris
  • DÉMOUSTICATION : quand on déplace la souris.

Comme pour le clavier il y a une sous-sous-variable pour trouver sur quel bouton on a appuyer : event.buttons.button

De même, la souris est livrée avec son lot de constantes :

  • SDL_BUTTON_LEFT : clic gauche
  • SDL_BUTTON_MIDDLE : clic du milieu, clic de la molette si vous préférez (mais si, j'en parle a tout ceux que je croise)
  • SDL_BUTTON_RIGHT : clic droit
  • SDL_BUTTON_WHEELUP : molette vers le haut
  • SDL_BUTTON_WHEELDOWN : molette vers le bas

On peut aussi savoir où se trouve la souris, encore une fois dans la variable d’événement, si on a un SDL_Event event :

  • event.motion.x : les abscisses de la souris
  • event.motion.y : les ordonnées de la souris

On peut aussi savoir où se trouve la souris lors d'un clic :

  • event.mouse.x : les abscisses de la souris
  • event.mouse.y : les ordonnées de la souris

ATTENTION : ce ne sont pas les mêmes variables, cela diffère suivant le type d’événement.

On peut aussi masquer ou afficher le curseur de la souris avec la fonction :

  • SDL_ShowCursor(SDL_DISABLE) : affiche le curseur (par défaut)
  • SDL_ShowCursor(SDL_ENABLE) : masque le curseur

Vous pouvez vous contentez d'appeler cette fonction qu'une fois dans votre programme.

Enfin on peut placer la souris à un endroit précis de l'écran avec :

1
void SDL_WarpMouse(Uint16 x, Uint16 y);

La souris sera à la position (x, y), dans le repère de SDL.

Pour mettre la souris au milieu de l'écran :

1
SDL_WarpMouse(ecran->w / 2, ecran->h / 2);

Petit exemple d'utilisation de la souris (encore la fonction attente, ou pause) :

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
void attente{
	SDL_Event event; //on créé un événement
	bool wait = true; //on créé un booléen pour attendre
	while(wait){
		//on attend
		SDL_WaitEvent(&event); //mise à jour des événements
		switch(event.type){
			//on regarde différents types
			case SDL_QUIT :
				//si on clique dans la croix
				wait = false; //on s'arrête
				break;
			case SDL_MOUSEBUTTONUP :
				switch(event.button.button){
					case SDL_BUTTON_LEFT :
						wait = false;
						break;
					case SDL_BUTTON_RIGHT :
						cout << "clic droit" << endl;
						break;
					default:
						break;
				}
			default:
				break;
		}
	}
}

Le clic gauche fait quitter le programme.

Comme on peut faire echap dans ce programme, vous pouvez aussi essayer de faire disparaître la bordure de la fenêtre en remplaçant la ligne :

1
ecran = SDL_SetVideoMode(800, 582, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);

par :

1
ecran = SDL_SetVideoMode(800, 582, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_NOFRAME);

Si vous voulez utilisez le mode plein écran remplacer cette ligne par :

1
ecran = SDL_SetVideoMode(800, 582, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | DL_FULLSCREEN);

Mais bien sur vous ne pourrez plus cliquer dans la croix ni déplacer la fenêtre, d'où l'importance de pourvoir quitter avec une touche.

Vous pouvez aussi utiliser SDL_RESIZABLE pour pouvoir redimensionner la fenêtre (mais il faut le gérer dans le programme), ce n'est pas grave, si vous le faite sur l'exemple précédent vous allez voir apparaître de grosses marges noir de chaque côté du dragon, et vous ne verrez quand même pas sortir le vaisseau car l’écran ne se redimensionne pas.

Pour le savoir il y a un événement de redimensionnement de la fenêtre :

  • SDL_VIDEORESIZE, c'est un event.type.

La nouvelle dimension de la fenêtre est dans :

  • event.resize.w : largeur (width)
  • event.resize.h : hauteur (height)

Pour savoir si la fenêtre change SDL_ACTIVEEVENT (event.type) :

  • le focus de la fenêtre change
  • la souris entre ou sort de la fenêtre

Vous avez deux autres variables à votre disposition :

  • event.active.gain : 1 si gain, 0 si perte
  • event.active.state : indique le type d’événements

Il y a plusieurs type d’événements :

  • SDL_APPMOUSEFOCUS : la souris vient de rentrer ou de sortir de la fenêtre. Si le gain = 1 elle est rentrée, si le gain = 0 elle est sortie
  • SDL_APPINPUTFOCUS : l'application vient de recevoir le focus du clavier (gain = 1) ou de le perdre (gain = 0)
  • SDL_APPACTIVE : l'application a été réduite dans la barre des tâches (gain = 0), ou restaurée dans son état normal (gain = 1)