Documentation de la bibliothèque MLV-3.1.0

advanced/08_zone_click.c

Ce programme explique comment, si elle n'est pas utilisée pour réaliser des effets de transparence, il est possible d'utiliser la composante alpha d'une image pour réaliser des zones de selection.

Attention, si vous ouvrez les images utilisées par cette démonstration avec un éditeur d'image, vous obtiendrez une image vide. En effet, nous avons détourné la composante alpha pour un autre usage. Dans notre cas elle varie entre 0 et 4. L'image disparait donc par rapport au fond. Si vous voulez voir l'image dans votre éditeur d'image, vous devez supprimer la composante alpha.

Dans la pratique, vous n'êtes pas obligé d'utiliser la composante alpha pour réaliser une zone de selection. Vous pouvez utiliser plmusieurs images, une pour l'affichage et une pour définir les zones de selection. Ainsi, vous conservez la composante alpha pour réaliser des effets de transparence évolués.

#include <MLV/MLV_all.h>
#define DEBUG(x) fprintf( stderr, "DEBUG : %s - line : %d- file : %s \n", x, __LINE__, __FILE__ );
//
// Attention !
// Pour pouvoir compiler ce programme sous windows et sous macintosh,
// il faut, pour la déclaration du main, respecter strictement la syntaxe
// suivante :
//
int main( int argc, char *argv[] ){
MLV_Event event_type=MLV_NONE;
int width=640,height=480;
int red;
int x,y;
int w, h;
int id_country;
MLV_Image *map, *map_display, *country_layer;
//
// On associe à chaque valeur de la composante rouge du fichier map.png,
// un nom de pays.
//
#define NB_COUNTRY 5
int nb_country = NB_COUNTRY;
const char* id_to_country[ NB_COUNTRY+1 ][ 2 ] = {
{ "", "" },
{ "Espagne", "spain.png" },
{ "France", "france.png" },
{ "Grèce", "greece.png" },
{ "Italie", "italy.png" },
{ "Portugal", "portugal.png" }
};
//
// On créé la fenêtre
//
"advanced - 8 - zone click", "zone click", width, height
);
//
// On charge en mémoire deux fois la même image:
// La version chargée dans la variable map va servir à connaitre la position
// des différents pays en utilsant la valeur de la composante rouge.
// La version chargée dans la variable map_display va servir pour
// l'affichage. Pour cela, on modifie la composante rouge de l'image de
// façon qu'elle soit homogènement opaque.
//
map_display = MLV_load_image("map.png");
//
// On réajuste la taille de la fenêtre pour qu'elle soit adaptée à celle de
// l'image.
//
MLV_get_image_size( map_display, &width, &height );
MLV_change_window_size( width, height );
map = MLV_create_image( width, height );
0, 0, width, height, MLV_rgba(0,0,0,MLV_ALPHA_OPAQUE), map
);
// On créé une carte contenant tous les pays
for( id_country=1; id_country < nb_country+1; id_country++ ){
const char* file_name = id_to_country[id_country][1];
country_layer = MLV_load_image( file_name );
if( ! country_layer ){
fprintf( stderr, "Impossible de lire le fichier %s", file_name );
exit(0);
}
for( w = 0; w < width; w++ ){
for( h = 0; h < height; h++ ){
country_layer, w, h, &red, NULL, NULL, NULL
);
if( red != 0 ){
w, h, MLV_rgba(
id_country, id_country, id_country,
MLV_ALPHA_OPAQUE
), map
);
}
}
}
MLV_free_image( country_layer );
}
//
// Initialisation de l'affichage
//
MLV_draw_image( map_display, 0, 0 );
//
// Dès que l'utilisateur clique sur l'image, on affiche le nom du pays
// correspondant à la zone cliquée.
// Si l'utilisateur appuie sur une touche du clavier, on quitte
//
while( event_type!=MLV_KEY || touche != MLV_KEYBOARD_ESCAPE ){
event_type = MLV_wait_keyboard_or_mouse( &touche, NULL, NULL, &x, &y );
if( event_type == MLV_MOUSE_BUTTON ){
MLV_draw_image( map_display, 0, 0 );
MLV_get_pixel_on_image( map, x, y, &id_country, NULL, NULL, NULL );
if( 1 <= id_country && id_country <= nb_country ){
x, y, id_to_country[id_country][0], MLV_COLOR_BLACK
);
}
}
}
//
// On libère l'espace mémoire allouée aux images
//
MLV_free_image( map_display );
//
// On ferme la fenêtre
//
return 0;
}
/*
* This file is part of the MLV Library.
*
* Copyright (C) 2010,2011,2012,2013 Adrien Boussicault, Marc Zipstein
*
*
* This Library is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This Library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this Library. If not, see <http://www.gnu.org/licenses/>.
*/
MLV_draw_filled_rectangle_on_image
void MLV_draw_filled_rectangle_on_image(int x, int y, int width, int height, MLV_Color color, MLV_Image *image)
Dessine un rectangle plein dont la taille, la couleur et la position du sommet Nord-Ouest sont donnée...
MLV_create_window
void MLV_create_window(const char *window_name, const char *icone_name, unsigned int width, unsigned int height)
Créé une fenêtre dont la taille, et les différents noms sont passés en paramètres.
MLV_Event
MLV_Event
Énumère les différents types d'évènement de la bibliothèque MLV.
Definition: MLV_event.h:46
MLV_load_image
MLV_Image * MLV_load_image(const char *file_image)
Charge en mémoire une image contenue dans un fichier.
MLV_rgba
MLV_Color MLV_rgba(Uint8 red, Uint8 green, Uint8 blue, Uint8 alpha)
Raccourci vers MLV_Color MLV_get_color_from_rgba.
MLV_Keyboard_button
MLV_Keyboard_button
Énumère l'ensemble des codes des touches du clavier.
Definition: MLV_keyboard.h:50
MLV_create_image
MLV_Image * MLV_create_image(int width, int height)
Créer une image de composante alpha opaque.
MLV_NONE
@ MLV_NONE
Definition: MLV_event.h:47
MLV_free_window
void MLV_free_window()
Ferme la fenêtre de la bibliothèque MLV.
MLV_change_window_size
void MLV_change_window_size(unsigned int width, unsigned int height)
Change la taille de la fenêtre.
MLV_draw_image
void MLV_draw_image(const MLV_Image *image, int x, int y)
Dessine une image donnée à une position donnée de la fenêtre.
MLV_update_window
void MLV_update_window()
Met à jour l'affichage de la fenêtre.
MLV_draw_text
void MLV_draw_text(int x, int y, const char *text, MLV_Color color,...)
Imprime un texte donné à une position et une couleur données.
MLV_KEY
@ MLV_KEY
Definition: MLV_event.h:48
MLV_Image
struct _MLV_Image MLV_Image
Définit le type Image dans la bibliothèque MLV.
Definition: MLV_image.h:53
MLV_wait_keyboard_or_mouse
MLV_Event MLV_wait_keyboard_or_mouse(MLV_Keyboard_button *sym, MLV_Keyboard_modifier *mod, int *unicode, int *mouse_x, int *mouse_y)
Suspend l'exécution jusqu'à ce que l'utilisateur appuie sur une touche du clavier ou sur le bouton ga...
MLV_set_pixel_on_image
void MLV_set_pixel_on_image(int x, int y, MLV_Color color, MLV_Image *image)
Écrase les composantes rouge, bleue, vert et alpha d'un pixel par celles passées en paramètre de la f...
MLV_all.h
Fichier d'entête principal incluant tous les autres fichiers entêtes de la bibliothèque MLV.
MLV_get_image_size
void MLV_get_image_size(const MLV_Image *image, int *width, int *height)
Retourne la taille d'une image donnée.
MLV_MOUSE_BUTTON
@ MLV_MOUSE_BUTTON
Definition: MLV_event.h:51
MLV_free_image
void MLV_free_image(MLV_Image *image)
Libère la mémoire utilisée par l'image.
MLV_get_pixel_on_image
void MLV_get_pixel_on_image(const MLV_Image *image, int x, int y, int *red, int *green, int *blue, int *alpha)
Renvoie la couleur du pixel présent à une position donnée d'une image donnée.
MLV_COLOR_BLACK
#define MLV_COLOR_BLACK
Definition: MLV_color.h:379