excercices sdl en langage C

faire revernir zozor dans l'autre sens

a marqué ce sujet comme résolu.

Pour le moment, Zozor se décale vers la droite puis disparaît de l’écran. Ce serait mieux s’il repartait dans l’autre sens une fois arrivé tout à droite, non ? Cela donnerait l’impression qu’il rebondit. Je vous conseille de créer un booléen versLaDroite qui vaut « vrai » si Zozor se déplace vers la droite (et « faux » s’il va vers la gauche). Si le booléen vaut vrai, vous décalez donc Zozor vers la droite, sinon vous le décalez vers la gauche. Surtout, n’oubliez pas de changer la valeur du booléen lorsque Zozor atteint le bord droit ou le bord gauche. Eh oui, il faut bien qu’il reparte dans l’autre sens ! Plutôt que de faire rebondir Zozor de droite à gauche, faites le rebondir en diagonale sur l’écran ! Il vous suffira de modifier positionZozor.x et positionZozor.y simultanément. Vous pouvez essayer de voir ce que ça fait si on augmente x et si on diminue y en même temps, ou bien si on augmente les deux en même temps, etc. Faites en sorte qu’un appui sur la touche P empêche Zozor de se déplacer, et qu’un nouvel appui sur la touche P relance le déplacement de Zozor. C’est un bête booléen à activer et désactiver.

jai beau essayer toujours echec si qunqu’un pouvait me filer la solution voila mon code source:

 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
#include<stdio.h>
#include<stdlib.h>
#include<SDL/SDL.h>
#include<SDL/SDL_image.h>
int main(int argc, char *argv[])
{
    SDL_Surface *ecran = NULL, *zozor = NULL;
    SDL_Rect position;
    SDL_Event event;
    int continuer = 1, tempsPrecedent = 0, tempsActuel = 0, versLaDroite = 1;
    SDL_Init(SDL_INIT_VIDEO);
    ecran = SDL_SetVideoMode(700, 400, 32, SDL_HWSURFACE);
    zozor = IMG_Load("zozor.bmp");
    SDL_WM_SetCaption("gestion des evenement", NULL);
    SDL_SetColorKey(zozor, SDL_SRCCOLORKEY, SDL_MapRGB(zozor->format, 0,0,255));
    position.x = 100;
    position.y = 100;
    SDL_EnableKeyRepeat(100,100);
    while(continuer)
    {
        SDL_PollEvent(&event);
        switch(event.type)
        {
        case SDL_QUIT:
            continuer = 0;
            break;
        case SDL_KEYDOWN:
            switch(event.key.keysym.sym)
            {
            case SDLK_ESCAPE:
                continuer = 0;
                break;
            case SDLK_RIGHT:
                position.x++;
                break;
            case SDLK_LEFT:
                position.x--;
                break;
            }
        }
        tempsActuel = SDL_GetTicks();
        if(tempsActuel - tempsPrecedent > 30)
        {
            switch(versLaDroite)
            {
            case 1:
                position.x++;
                break;
            case 2:
               if (position.x < 300)
                {versLaDroite = 0;
                   position.x--;}
                break;
            }
            tempsPrecedent = tempsActuel;
        }
        else
        {
            SDL_Delay(30 - (tempsActuel - tempsPrecedent));
        }
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
        SDL_BlitSurface(zozor, NULL, ecran, &position);
        SDL_Flip(ecran);
        }
        SDL_FreeSurface(zozor);
        SDL_FreeSurface(ecran);
        SDL_Quit();
    return EXIT_SUCCESS;
    }
+0 -0

Salut,

Je t’invite à étayer un peu plus ton problème et à mieux dissocier visuellement la citation du cours d’Openclassrooms de ta question. Notamment, quel souci rencontres-tu précisément (pour rappel, le cours n’est pas publié sur ce site, si tu ne le références pas ni le contextualise, on ne peut pas comprendre ta demande) ?

Cela étant dit, je te suggère de te poser la question suivante : « quelle valeur a la variable versLaDroite durant l’exécution de mon code » ? Je te laisse réfléchir là-dessus. ;)

+0 -0

Salut,

Tout d’abord, plutôt que d’utiliser une telle gestion des évènements, je te conseille de créer une structure pour tout gérer (et supprimer ce SDL_EnableKeyRepeat).

Ensuite, tu testes si versLaDroite vaut 1 ou 2 alors que tu lui donnes la valeur 0 à un moment. Le mieux serait d’utiliser un vrai booléen (je ne sais plus s’il y a un type pour les booléens dans la SDL 1, mais si ce n’est pas le cas, tu peux utiliser stdbool.h).

Et finalement, je t’invite à vérifier le retour des fonctions à risques (ça ne peut pas faire de mal), à faire des fonctions et à passer à la SDL 2.

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte