
/*******************************************************************
Utilisation du clavier pour bouger un élément graphique (rectangle)
*******************************************************************/
#include <allegro.h>
int main()
{
// paramètres de l'élément à animer
int posx,posy; // coordonnées
int tx,ty; // taille (largeur et hauteur)
int depx,depy; // vecteur déplacement effectif en x et y
int deplacement; // amplitude absolu des déplacements
srand(time(NULL));
allegro_init();
install_keyboard();
set_color_depth(desktop_color_depth());
if (set_gfx_mode(GFX_AUTODETECT_WINDOWED,800,600,0,0)!=0)
{
allegro_message("prb gfx mode");
allegro_exit();
exit(EXIT_FAILURE);
}
// initialisation des variables de la forme
// tailles et position initiale au centre
tx=60;
ty=40;
posx=SCREEN_W/2-tx/2;
posy=SCREEN_H/2-ty/2;
// mouvements :
// se déplacera de 5 pixels à chaque étape
// initialement immobile
deplacement=5;
depx=0;
depy=0;
// Boucle interactive
while (!key[KEY_ESC])
{
// 1) EFFACER POSITION ACTUELLE (redessiner à la couleur du fond)
rectfill(screen,posx,posy,posx+tx,posy+ty,makecol(0,0,0));
// 2) DETERMINER NOUVELLE POSITION
// prise en compte du clavier sur le vecteur deplacement depx et depy
if (key[KEY_UP]){
depx = 0;
depy = -deplacement; // mouvement négatif en ordonnées
}
if (key[KEY_DOWN]){
depx = 0;
depy = deplacement; // mouvement positif en ordonnées
}
if (key[KEY_LEFT]){
depx = -deplacement; // mouvement négatif en abscisses
depy = 0;
}
if (key[KEY_RIGHT]){
depx = deplacement; // mouvement positif en abscisses
depy = 0;
}
// si espace alors mouvement aléatoire ...
if (key[KEY_SPACE]){
depx = rand()%(deplacement*2+1)-deplacement;
depy = rand()%(deplacement*2+1)-deplacement;
}
// contrôle des bords : ici on décide de rebondir sur les bords
if ( (posx<0 && depx<0) || (posx+tx>SCREEN_W && depx>0) )
depx=-depx;
if ( (posy<0 && depy<0) || (posy+ty>SCREEN_H && depy>0) )
depy=-depy;
// calculer nouvelle position
// nouvelle position = position actuelle + deplacement
posx=posx+depx;
posy=posy+depy;
// 3) AFFICHAGE NOUVELLE POSITION
rectfill(screen,posx,posy,posx+tx,posy+ty,makecol(255,128,128));
if (depx>=0) circlefill(screen,posx+tx-12,posy+12,6,makecol(0,128,128));
else circlefill(screen,posx+12 ,posy+12,6,makecol(0,128,128));
// 4) ON FAIT UNE PETITE PAUSE à chaque fois sinon ça va trop vite...
rest(20);
}
return 0;
}
END_OF_MAIN();