IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème de scrolling infini


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 49
    Points : 27
    Points
    27
    Par défaut Problème de scrolling infini
    Bonjour à tous,
    Je suis entrain de coder une fonction qui me permet de de faire un scrolling grâce aux touche j'aimerais la transformé pour utilisé la souri

    Ça ce complique car je ne sais pas trop comment utiliser le SDL_MOUSEMOTION pour réussir mon affaire.

    Je ne sais pas non plus comment récupérer le sens de déplacement.J'avais dans l'idée de réutiliser le modulo mais c'est un peu fastidieu à organiser

    Et enfin j'aimerais éviter d'avoir un phénomène trop rapide car ca va être très gourmand en mémoire

    voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    #define SPEED 1
    #define IMX 368
    #define IMY 388
     
    SDL_Surface* ChargerBMP(const char* fic)
    {
    	SDL_Surface *res;
    	SDL_Surface* tmp = SDL_LoadBMP(fic);
    	if (tmp==NULL)
    	{
    		printf("Erreur chargement %s\n",fic);
    		exit(-1);
    	}
    	res = SDL_DisplayFormat(tmp);
    	SDL_FreeSurface(tmp);
    	return res;
    }
     
    int modulo(int x,int mod)
    {
    	if (x>=0)
    		return x%mod;
    	return (x%mod)+mod;
    }
     
    int main(int argc,char** argv)
    {
    	SDL_Surface* fond,*screen;
    	Uint8* key;
    	int x,y;
    	x=y=0;
    	SDL_Init(SDL_INIT_VIDEO);
    	screen=SDL_SetVideoMode(IMX,IMY,32,SDL_SWSURFACE|SDL_DOUBLEBUF);
    	fond=ChargerBMP("fond.bmp");
    	do
    	{
    		SDL_Rect positionfenetre;
    		key = SDL_GetKeyState(NULL);
    		SDL_PumpEvents();
     
    		if (key[SDL_MOUSEMOTION])
    			x-=SPEED;
    		if (key[SDLK_RIGHT])
    			x+=SPEED;
    		if (key[SDLK_UP])
    			y-=SPEED;
    		if (key[SDLK_DOWN])
    			y+=SPEED;
     
    		positionfenetre.x = modulo(x,IMX);
    		positionfenetre.y = modulo(y,IMY);
    		SDL_BlitSurface(fond,NULL,screen,&positionfenetre);
    		positionfenetre.x = modulo(x,IMX) - IMX;
    		positionfenetre.y = modulo(y,IMY);
    		SDL_BlitSurface(fond,NULL,screen,&positionfenetre);
    		positionfenetre.x = modulo(x,IMX) - IMX;
    		positionfenetre.y = modulo(y,IMY) - IMY;
    		SDL_BlitSurface(fond,NULL,screen,&positionfenetre);
    		positionfenetre.x = modulo(x,IMX);
    		positionfenetre.y = modulo(y,IMY) - IMY;
     
     
    		SDL_BlitSurface(fond,NULL,screen,&positionfenetre);
    		SDL_Flip(screen);
    		SDL_Delay(3);
    	}
    	while(!key[SDLK_ESCAPE]);
    	SDL_FreeSurface(fond);
    	SDL_Quit();
    	return 0;
    }

  2. #2
    Membre éprouvé
    Avatar de mitkl
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 364
    Points : 1 081
    Points
    1 081
    Par défaut
    Je n'ai pas trop regardé ton code car je ne comprends pas tout avec les histoires de modulo mais pour récupérer le sens du déplacement de la souris, as-tu pensé à enregistrer à chaque fois les coordonnées de ta souris pour les comparer avec les coordonnées actuelles ?

    Si tu mets en place un tel système, tu auras quelque chose comme :
    AnciennePosition(150, 180)
    NouvellePosition(150, 190)

    Si on soustrait les composantes de notre vecteur, on obtient un vecteur de déplacement v(150-150, 190-180)-> v(0, 10). Ici il est évident qu'on a décalé la souris de 10 pixel vers le bas. Si on multiplie chaque composante par ton scrolling (voire aussi par un facteur pour limiter la vitesse de celui-ci), on ne se déplacera jamais sur x (car 0*x = 0) et on se déplacera sur Y (d'après ton code ça donnerait schématiquement y = y * SPEED * v.x ? valeurs à ajuster bien évidemment).

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 49
    Points : 27
    Points
    27
    Par défaut
    Merci pour l'idée du vecteur.

    J'ai bossé un peu et voila ce qui est sortie.
    C'est pas encore ca mais on si approche

    J'ai le déplacement selon la direction de déplacement du curseur mais c'est tout.

    voici le code si quelqu'un à une idée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
     
    #define SPEED 1
    #define IMX 368
    #define IMY 388
     
    typedef struct
    {
    	char key[SDLK_LAST];
    	int mousex,mousey;
    	int mousexrel,mouseyrel;
    	char mousebuttons[8];
            char quit;
    } Input;
     
     
    void UpdateEvents(Input* in)
    {
    	SDL_Event event;
    	while(SDL_PollEvent(&event))
    	{
    		switch (event.type)
    		{
    		case SDL_KEYDOWN:
    			in->key[event.key.keysym.sym]=1;
    			break;
    		case SDL_KEYUP:
    			in->key[event.key.keysym.sym]=0;
    			break;
    		case SDL_MOUSEMOTION:
    			in->mousex=event.motion.x;
    			in->mousey=event.motion.y;
    			in->mousexrel=event.motion.xrel;
    			in->mouseyrel=event.motion.yrel;
    			break;
    		case SDL_MOUSEBUTTONDOWN:
    			in->mousebuttons[event.button.button]=1;
    			break;
    		case SDL_MOUSEBUTTONUP:
    			in->mousebuttons[event.button.button]=0;
    			break;
    		case SDL_QUIT:
    			in->quit = 1;
    			break;
    		default:
    			break;
    		}
    	}
    }
     
    SDL_Surface* ChargerBMP(const char* fic)
    {
    	SDL_Surface *res;
    	SDL_Surface* tmp = SDL_LoadBMP(fic);
    	if (tmp==NULL)
    	{
    		printf("Erreur chargement %s\n",fic);
    		exit(-1);
    	}
    	res = SDL_DisplayFormat(tmp);
    	SDL_FreeSurface(tmp);
    	return res;
    }
     
    int modulo(int x,int mod)
    {
    	if (x>=0)
    		return x%mod;
    	return (x%mod)+mod;
    }
     
    int main(int argc,char** argv)
    {
    	SDL_Surface* fond,*screen;
    	Uint8* key;
    	Input in;
    	memset(&in,0,sizeof(in));
    	SDL_Init(SDL_INIT_VIDEO);
    	screen=SDL_SetVideoMode(IMX,IMY,32,SDL_SWSURFACE|SDL_DOUBLEBUF);
    	fond=ChargerBMP("fond.bmp");
     
    	int tempsActuel,tempsPrecedent;
    	tempsPrecedent=tempsActuel=0;
     
        while(!in.key[SDLK_ESCAPE] && !in.quit)
        {
     
    		SDL_Rect positionfenetre;
    		key = SDL_GetKeyState(NULL);
    		SDL_PumpEvents();
     
    		int x1,y1; /* temps 1 */
    		int x2,y2; /* temps 2 */
     
    		x1=x2=y1=y2=0;
     
            tempsActuel = SDL_GetTicks();
            if (tempsActuel - tempsPrecedent > 1) /* Si 1 ms se sont écoulées */
            {
                UpdateEvents(&in);
     
                x2=in.mousexrel;
                y2=in.mouseyrel;
     
                if ((x1-x2)!=0 || (y1-y2)!=0)
                    {
    			      x1=x2;
    			      y1=y2;
                    }
            }
     
            positionfenetre.x=x1;
            positionfenetre.y=y1;
     
    		SDL_BlitSurface(fond,NULL,screen,&positionfenetre);
    		SDL_Flip(screen);
    		SDL_Delay(3);
     
            tempsPrecedent = tempsActuel;
        }
    	SDL_FreeSurface(fond);
    	SDL_Quit();
    	return 0;
    }

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 49
    Points : 27
    Points
    27
    Par défaut
    bon voila un problème pour les bon du fofo.
    SI vous trouvez, vous me sauvez ^^.

    j'ai mes coordonnées relatives de la souri mousexrel et mouseyrel donnés par MOUSEMOTION.
    voila ce que je tente de faire:
    1 2 3
    8 A 4
    7 6 5
    Je connais les coordonnées de la souris en A(x=1,y=1)
    Si je bouge ma souri en 5(x=2,y=2) j'aimerai savoir si je me suis bien déplacer en bas à droite et recentrée l'écran sur 5(x=2,y=2)
    Comme ca:
    A 4 -
    6 B -
    - - -
    J'ai tenter des testes du genre x1-x2>=0, j'ai essayer un modulo .... rien a faire.
    Avec le clavier, c'était plutôt facile, j'ai réussi à le faire mais avec la souri je m'en sors pas.
    Un élément me manque .... et bientôt tous mes cheveux si je continue à prendre la tête avec ca -_-.

    Maxime

Discussions similaires

  1. Problème de scroll/largeur
    Par Epistoliere dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 04/12/2006, 10h34
  2. [C#] Problème de scroll dans un panel
    Par snake13_71 dans le forum Windows Forms
    Réponses: 9
    Dernier message: 26/06/2006, 17h56
  3. Problème de boucle infinie...
    Par anne-so dans le forum Langage
    Réponses: 1
    Dernier message: 25/04/2006, 14h10
  4. [JText Area] problème de scroll
    Par mrshoki dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 13/03/2006, 17h22
  5. problème de scroll
    Par elfugu dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 28/11/2005, 16h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo