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

SDL Discussion :

conseils pour mon projet SDL


Sujet :

SDL

  1. #1
    Membre habitué

    Profil pro
    Inscrit en
    Juin 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 102
    Points : 126
    Points
    126
    Par défaut conseils pour mon projet SDL
    Bonjour tout le monde, je suis nouveau sur ce forum, et j'espère apporter au fur et a mesure ma modeste pierre a l'édifice.

    Je crée ce sujet suite a un problème que je rencontre pour la réalisation d'un jeu en SDL.
    Le principe du jeu est assez simple, des chiffres apparaissent dans le désordre a l'écran, et il faut avec la souris les déplacer afin de les réordonner dans un ordre croissant.
    Je vous explique vite fait le morceau de code ci dessous, car je ne peut pas poster l'ensemble (trop long).
    Le tableau Rpos[] est un tableau de int composé de 10 chiffres (1 a 10).Je génère 2 nombres aléatoire, et je parcoure le tableau RPos[] en inversent les chiffres qui correspondent au nombres aléatoire.Je recommence l'opération plusieurs fois.
    Puis je fait un grand switch sur chaque case du tableau Rpos[], et si par exple a la case 0, le chiffre 1 est présent je Blit le chiffres 1 ect..
    J'ai aussi ajouté un bouton (surface) derrière chaque chiffres, afin de pouvoir déplacer chaque chiffre indépendemment, en fonction de leur position.
    Si la souris est dans le bouton on peut déplacer le chiffre.

    Et on arrive enfin a mon problème, les chiffres ne peuvent pas se déplacer au delà de la limite gauche du bouton, ni au delà de la limite haute du bouton.Et je n'arrive pas a trouvé comment régler ce problème.

    Voici une illustration (la Surface rouge est le bouton, la ligne verte est rajouter pour l'exple):
    [IMG][/IMG]

    On voit bien sur cet exple qu'il y a un problème car le chiffres 1 devrait être déplacé jusqu'en bas a gauche.Or sa bloque au niveau de la ligne verte.

    Le morceau de code a modifier :
    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
                  case SDL_MOUSEMOTION:
                        if(event.button.button == SDL_BUTTON_LEFT){
                            if(Rpos[0] == 1 &&
                                (event.motion.x > posRef[0].x) && (event.motion.x < posRef[0].x + posRef[0].w)&&
                                (event.motion.y > posRef[0].y) && (event.motion.y < posRef[0].y + posRef[0].h)){
                                /*  posTTF[] est la position des chiffres.
                                    posRef[] est la position du bouton. */
                                    posTTF[0].x = event.motion.x;
                                    posTTF[0].y = event.motion.y;
     
                                /* Permet de se déplacer au delà du coté droit du bouton, et en dessous */
                                    posRef[0].w = event.motion.x;
                                    posRef[0].h = event.motion.y,
     
                                    SDL_FillRect(screen, &posTTF[0], SDL_MapRGB(screen->format, 255,255,255));
     
                                    SDL_BlitSurface(background, NULL, screen, &posBackground);
     
                                    SDL_BlitSurface(texte[0], NULL, screen, &posTTF[0]);
                                    SDL_BlitSurface(Grid_1, NULL, screen, &posGrid);
                            }
    Voila je pense qu'il faut que je rajoute des lignes après:
    posRef[0].w = event.motion.x;
    posRef[0].h = event.motion.y;

    Mais je n'arrive pas trouver quoi ajouter.

    Merci d'avance pour votre aide.
    @++++

    PS: je remercie grandement le tuto de Loka sur la SDL, qui a été une aide précieuse.

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Salut à quoi cela sert-il les boucles for() en informatique ?
    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
     
    int i;
    if(event.button.button == SDL_BUTTON_LEFT){
    for ( i = 0 ; i<MAX_IMAGES; i++)
    {
                            if(Rpos[i] == 1 &&
                                (event.motion.x > posRef[i].x) && (event.motion.x < posRef[i].x + posRef[i].w)&&
                                (event.motion.y > posRef[i].y) && (event.motion.y < posRef[i].y + posRef[i].h)){
                                    posTTF[i].x = event.motion.x;
                                    posTTF[i].y = event.motion.y;
                                    posRef[i].w = event.motion.x;
                                    posRef[i].h = event.motion.y,
     
                                    SDL_FillRect(screen, &posTTF[i], SDL_MapRGB(screen->format, 255,255,255));
    }
    }
    je ne comprends pas le problème de déplacement.
    Peux-tu détailler point par point avec des paragraphes 1,2,3 ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    posRef[0].w = event.motion.x;
    posRef[0].h = event.motion.y,
    je pense que ce code fait de mauvaises affectation ; w et h pour un SDL_Rect c'est la largeur et hauteur et tu affectes un point (x,y ) comme valeur.

  3. #3
    Membre habitué

    Profil pro
    Inscrit en
    Juin 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 102
    Points : 126
    Points
    126
    Par défaut
    Effectivement j'avais pas penser a faire une boucle, merci sa va grandement alléger mon code.

    Sinon pour le problème de déplacement, prenons une partie du début:

    1- la fenêtre s'affiche avec les chiffres dans le désordre :



    2- je commence a classer les chiffres en ordre croissant.Je doit donc avec la souris prendre le chiffre 1, et aller le placer en bas a gauche.
    Mais problème le chiffre bloque a un endroit.Je ne peut pas le déplacer d'avantage.
    (au niveau de la ligne verte le chiffre ne peut plus se déplacer a gauche):



    Et ce problème est le même pour chaque chiffre.Impossible de déplacer le chiffre au delà du coté gauche de son bouton.

  4. #4
    Membre habitué

    Profil pro
    Inscrit en
    Juin 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 102
    Points : 126
    Points
    126
    Par défaut
    Ok, après avoir prit l'air toute la journée, j'ai trouvé la solution en 15 min.Comme quoi quand on a la tête dans le guidons, on a le cerveau dans les chaussettes

    S'était en fait très simple il suffisait de rajouter un else, pour dire "au délà des limites du bouton continue a blitter le chiffre"

    Après il y a un peu de "mise en page" du programme.Cad que je fait maintenant un switch sur chaque case du tableaux.Car le programme se présentait comme cela auparavant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(Rpos[0] == 1){
    /* instruction */
    }
    else if(Rpos[0] == 2){
    /* instruction */
    }
    Rajouter un else après le 1er if(), rendait évidement impossible l'utilisation d'un else if.

    Voila donc le morceaux de code qui fonctionne correctement :
    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
                    case SDL_MOUSEMOTION:
                        if(event.button.button == SDL_BUTTON_LEFT){
                            switch(Rpos[0])
                            {
                                case 1:
                                    if( (event.motion.x > posRef[0].x) && (event.motion.x < posRef[0].x + posRef[0].w)&&
                                        (event.motion.y > posRef[0].y) && (event.motion.y < posRef[0].y + posRef[0].h)){
                                    /*  posTTF[] est la position des chiffres.
                                        posRef[] est la position du bouton. */
                                        posTTF[0].x = event.motion.x;
                                        posTTF[0].y = event.motion.y;
     
                                        SDL_FillRect(screen, &posTTF[0], SDL_MapRGB(screen->format, 255,255,255));
                                        SDL_BlitSurface(background, NULL, screen, &posBackground);
                                        SDL_BlitSurface(texte[0], NULL, screen, &posTTF[0]);
                                        SDL_BlitSurface(Grid_1, NULL, screen, &posGrid);
     
                                    } else{
                                        posTTF[0].x = event.motion.x;
                                        posTTF[0].y = event.motion.y;
     
                                        SDL_FillRect(screen, &posTTF[0], SDL_MapRGB(screen->format, 255,255,255));
                                        SDL_BlitSurface(background, NULL, screen, &posBackground);
                                        SDL_BlitSurface(Grid_1, NULL, screen, &posGrid);
                                        SDL_BlitSurface(texte[0], NULL, screen, &posTTF[0]);
                                    }
                                    break;
    Voila il faut que j'arrange encore quelques petits trucs:
    - Voir si une boucle for est possible (je n'en suis pas sur du fait que les instruction dans chaque else change (on blit selon le cas un chiffre différent).
    - un defaut du esle est que maintenant on peut cliquer n'importe où sur l'écran cela blittera le chiffre. Normal c'est les même instruction que dans le if() --->

    Je met le sujet comme résolu, mais si j'ai d'autre question je re posterai dessus.

    @+++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SP-2010] Conseil pour mon projet
    Par Ogryien dans le forum SharePoint
    Réponses: 6
    Dernier message: 06/11/2012, 15h18
  2. Conseil pour mon projet
    Par fishingman dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 09/03/2010, 18h51
  3. [SGBD Libres] Conseils pour un projet de logiciel de gestion
    Par nh2 dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 30/01/2006, 08h24
  4. besoins de sujets pour mon projet
    Par Hydre dans le forum Windows
    Réponses: 2
    Dernier message: 24/08/2005, 11h37
  5. Choix d'un SGBDR pour mon projet: Interbase?
    Par super16 dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 09/07/2004, 08h15

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