Savoir quel case d'un tableau bidimensionel est lié au clic de la souris

Signaler
Messages postés
23
Date d'inscription
samedi 14 mars 2009
Statut
Membre
Dernière intervention
1 février 2010
-
Messages postés
23
Date d'inscription
samedi 14 mars 2009
Statut
Membre
Dernière intervention
1 février 2010
-
bonjour j'ai un petit souci de comprehension
j'ai un tableau declaré ainsi: int tableau[3][3]; tout mes cases sont intialisé à zero à l'aide de deux boucles for qui parcours mon tableau jusqu'ici pas de soucis et je recupère les cordonné de ma souris lorsque je presse mon bouton de souris par l'evenement associé. le souci est comment savoir quel est ma case associé à mon clic de souris. le but est de savoir quel case à été coché pour changé la variable.merci beaucoup d'avence

5 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Tu es certain d'avoir besoin d'un tableau 2 dimensions ???
Avec une résolution 2000x1400 ça fera deja 11 Mo de mémoire utilisée.

ciao...
BruNews, MVP VC++
Messages postés
23
Date d'inscription
samedi 14 mars 2009
Statut
Membre
Dernière intervention
1 février 2010

re BruNews mon tableau est réalise dans une dimension de 600*600 moins de mémoire utilisé donc, mais sinon comment je pourais allegé mon tableau dans ce cas? et comment lier la case ou je clic avec la souris ( a partir des coordonnée x et y de la souris trouver les coordonnée de la case ou j'ai cliqué) merci
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Sous Windows, position du clic souris est dans un:
POINT pt;
tableau[pt.x][pt.y] = qqchose;
truc de ce genre.

ciao...
BruNews, MVP VC++
Messages postés
23
Date d'inscription
samedi 14 mars 2009
Statut
Membre
Dernière intervention
1 février 2010

j'ai créé cette fonction ci mais mon image s'affiche toujours dans la case en haut a gauche bizzare puisque j'ai créer deux boucles for donc je parcours bien mon tableau, int x et y sont les coordonnées recuperé par la souris et i j les coordonnées finale de la case à charger.

void Plateau(int x, int y )
{
SDL_Rect f ={ 0,0,0,0};
int i,j,k,h,w,l;
h= largeur/3;
l= hauteur/3;

for(k=0,i=0;i<h;i+=h,k++)
{
f.y = i;
for(j=0,l=0;j<l;j+=l,w++)
{
f.x = j;
}
}
plateau[i][j] = SDL_BlitSurface(X,NULL,screen,&f);

}
Messages postés
23
Date d'inscription
samedi 14 mars 2009
Statut
Membre
Dernière intervention
1 février 2010

voila j'ai réussi après plusieurs simulations à trouver un bon code. c'est un peu crade avec les conditions pour les coordonées du pointeurs si quelqu'un m'apporte des suggestions je suis preneur, voila topic clos ;)

#include <cstdlib>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <SDL.h>
#include 

using namespace std;

bool Initialisation();
void Plateau(int, int);
void Pause();
void Affichage();
void Probleme();
void Souris();
void Tours();



int i,j;
int const largeur = 600;
int const hauteur = 600;
int plateau[3][3];
SDL_Surface *fd, *X, *O, *screen;
SDL_Event event;
SDL_Rect r={0,0,0,0};

int main ( int argc, char** argv )
{
    SDL_Init( SDL_INIT_VIDEO);
    int done =0;


    // initialize SDL video
    if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
    {
        cout << "Probleme d initialisation" << SDL_GetError() << endl;
        Probleme();
    }

    // create a new window
    screen = SDL_SetVideoMode(largeur,hauteur, 16,SDL_HWSURFACE|SDL_DOUBLEBUF);
    SDL_WM_SetCaption("Morpion Version 1.0", NULL);

    Initialisation();

    Affichage();

    	//Boucle generale
while(!done)
{
//Traiter les evenements
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_QUIT:
done=1;
break;
case SDL_KEYUP:
if(event.key.keysym.sym==SDLK_a)
done=1;
break;
case SDL_MOUSEBUTTONUP:
                    Plateau(event.button.x,event.button.y);
break;
default:
break;
}
}

        // finally, update the screen :)

        SDL_Flip(screen);
    } // end main loop

    // free loaded bitmap
    SDL_FreeSurface(screen);

    // all is well ;)
    printf("Exited cleanly\n");
    SDL_Quit();
    return 0;
}

bool Initialisation()
{
   fd = NULL;
   X = NULL;
   O = NULL;

   //pour fd
   if( (!fd NULL) || (!X NULL) || (!O == NULL) )
   {
       SDL_FreeSurface(fd), fd= NULL;
       SDL_FreeSurface(X), X= NULL;
       SDL_FreeSurface(O), O = NULL;
       cout<< "Probleme d initialisation des images" << endl;
       Probleme();
   }

   if( (fd NULL) || (X NULL) || (O == NULL) )
   {
       cout<< "Probleme de chargement de fd, x et o" << endl;
       Probleme();
   }

   X = SDL_LoadBMP("x.bmp");
   O = SDL_LoadBMP("o.bmp");
   fd = SDL_LoadBMP("fd.bmp");




}

void Pause()
{
    int continuer = 1;
    SDL_Event event;

    while (continuer)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = 0;
        }
    }
}

void Affichage()
{
    SDL_Rect r = {0};
    SDL_BlitSurface(fd,NULL,screen,&r);
}

void Probleme()
{
    char choix;
    cout<< " Vous avez un probleme\n "<<endl;
    cout<< " Voules vous quitter? Oui ou Non :\n "<<endl;

    switch(choix)
    {
        case 'oui':
        EXIT_SUCCESS;
        break;

        case 'non':
        EXIT_FAILURE;
        break;
    }

}

void Plateau(int x, int y )
{
   int h,l,w,a,b;
   for(i=0; i<3; i++)
   for(j=0;j<3;j++)
   plateau[i][j]=0;

   //calcul de la case associé:
   i=x/(largeur/3);
   j=y/(hauteur/3);

   if(plateau[i][j]==0)
   {
   {
    //pour les x:
    if(x<200)
    {
    x=0;
    }
    else if(x<400)
    {
    x=200;
    }
    else
    {
    x=400;
    }
    //pour les y :
    if(y<200)
    {
    y=0;
    }
    else if(y<400)
    {
    y=200;
    }
    else
    {
    y=400;
    }
    r.x=x;
    r.y=y;
    }
   SDL_BlitSurface(X,NULL,screen,&r);
   }

   else if(plateau[i][j]==2)
   {
   {
    //pour les x:
    if(x<200)
    {
    x=0;
    }
    else if(x<400)
    {
    x=200;
    }
    else
    {
    x=400;
    }
    //pour les y :
    if(y<200)
    {
    y=0;
    }
    else if(y<400)
    {
    y=200;
    }
    else
    {
    y=400;
    }
    r.x=x;
    r.y=y;
    }
   SDL_BlitSurface(O,NULL,screen,&r);
   }

}