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 :

[C] Projet Pipopipette


Sujet :

SDL

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 7
    Points : 3
    Points
    3
    Par défaut [C] Projet Pipopipette
    Salut à tous!

    Alors voilà, pour résumer, je suis en L1 d'Informatique et j'ai un projet à rendre, et j'ai choisi de faire le jeu de la Pipopipette avec mon binôme.
    Alors le gros hic, c'est qu'on n'a jamais eu de cours de SDL, et que nos connaissances en C sont limitées. Alors oui Google est mon ami blablabla, sauf que des tutos complets sur SDL2.0 y'en n'a pas à la pelle, et les guides de migrations de la 1.2 à la 2.0 sont plus que laborieux.

    Pour le moment on n'a pas forcément trop avancer, je me cassais la tête au départ à vouloir faire une fonction de tracer de ligne avant de me rétracter et de me simplifier la tâche en utilisant uniquement des images, sauf que bon, simplifier c'est un bien grand mot pour le coup.

    J'ai été confronté à des problèmes tels que le fond qui clignote, l'image qui apparaît et qui disparaît dès qu'une autre action est faite (bouger la souris, appui sur une touche...). J'ai réussi à contourner le problème en "trichant" un peu , et j'arrive du coup à "RenderCopy" une image de ligne entre deux points (car impossible de faire fonctionner la fonction BlitSurface, je ne sais pas pourquoi), j'arrive à faire en sorte que cette image apparaisse si le clic est situé aux coordonnées de celle-ci, seulement, c'est une grille de 6x6 points, donc 36, et il y a au moins le double de lignes de traçables, horizontales et verticales...

    Je ne peux pas me permettre de faire autant de Rect, et autant de condition pour chaque lignes dans les events, ça serait interminable, sachant que je dois alterner entre joueur 1 et joueur 2 à chaque tour.

    Je requiert donc votre aide, parce-que je suis perdu et dépassé par tout ça, mon code est assez bordélique qui plus est, étant donné que je multiplie les tests etc...

    Je vous remercie d'avance pour votre attention!

    Mon 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
    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
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    #include <SDL.h>
    #include <SDL_image.h>
    #include <assert.h>
     
     
    int main() {
     
    int boucle = 1;
    SDL_Surface* ecran;
    SDL_Point mouse_position;
     
        if(SDL_Init(SDL_INIT_VIDEO) != 0) {
            printf("SDL_Init error: %s\n", SDL_GetError());
            exit(1);
        }
     
    class ligne ()
     
        SDL_Window* win = SDL_CreateWindow("Bonjour", 0, 0, 1280, 720,
                                 SDL_WINDOW_SHOWN);
        if(win == 0) {
            printf("SDL_CreateWindow: %s\n", SDL_GetError());
            SDL_Quit();
            exit(1);
        }
     
        SDL_Renderer* ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
        if (ren == NULL) {
            SDL_DestroyWindow(win);
            printf("SDL_CreateRenderer Error: %s\n", SDL_GetError());
            SDL_Quit();
            exit(1);
        }
     
    SDL_SetRenderDrawColor(ren, 255, 255, 255, 2);
     
     
     
     
        SDL_Surface* monimage;
        monimage = IMG_Load("Points.bmp");
        assert(monimage);
     
        SDL_Surface* fond;
        fond = IMG_Load("blanc.jpg");
        assert(fond);
     
        SDL_Texture* tfond;
        tfond = SDL_CreateTextureFromSurface(ren, fond);
        assert(tfond);
     
        SDL_Texture* matexture;
        matexture = SDL_CreateTextureFromSurface(ren, monimage);
        assert(matexture);
     
      SDL_FreeSurface(monimage);
     
     
    SDL_Surface* J1;
    J1 = IMG_Load("Joueur1h.bmp");
    assert(J1);
     
     
    SDL_Texture* tJ1;
    tJ1 = SDL_CreateTextureFromSurface(ren, J1);
    assert(tJ1);
     
    SDL_GetMouseState(
            &mouse_position.x,
            &mouse_position.y
        );
     
     
    //Rectangles
        SDL_Rect fene = {.x = 0, .y = 0, .w = 1280, .h = 720 };
        SDL_Rect coord = {.x = 315, .y = 35, .w = 650, .h = 650};
     
        int x = 436 || 518 || 600 || 682 || 764;
        int y = 151 || 233 || 315 || 397 || 479;
     
    //Coordonnées lignes
     
    SDL_Rect l1 = {.x = 436, .y = 151, .w = 86, .h = 12};
    SDL_Rect l2 = {.x = 518, .y = 151, .w = 86, .h = 12};
    SDL_Rect l3 = {.x = 600, .y = 151, .w = 86, .h = 12};
    SDL_Rect l4 = {.x = 682, .y = 151, .w = 86, .h = 12};
    SDL_Rect l5 = {.x = 764, .y = 151, .w = 86, .h = 12};
     
     
    //Image de fond
        SDL_RenderCopy(ren, tfond,0,&fene);
        SDL_RenderPresent(ren);
        SDL_RenderClear(ren);
     
    int ligne (int x, int y) {
    for(x=436;x<840;x+82);
    }
     
    int colonne (int x, int y) {
    for(y=151;y<558;y+82);
    }
     
     
     
    //Boucle de jeu
        while(boucle) {
            SDL_Event event;
            SDL_PollEvent(&event);
            switch (event.type)
            {
                case SDL_QUIT:
                    boucle = 0;
                    break;
                    case SDL_KEYUP:
                        switch(event.key.keysym.sym) {
     
                  }
     
                case SDL_MOUSEBUTTONUP:
                    if(event.button.button == SDL_BUTTON_LEFT) {
                      int mouseX = event.motion.x;
                      int mouseY = event.motion.y;
                      if(mouseX> l1.x && mouseX< (l1.x + l1.w) && mouseY> l1.y && mouseY< (l1.y + l1.h)){
     
                  SDL_RenderCopy(ren,tJ1,0,&l1);
     
                      break;
    }
              }
              break;
     
            }
            SDL_RenderCopy(ren, matexture,0,&coord);
            SDL_RenderPresent(ren);
          }
     
     
     
        return 0;
    }

  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
    bonjour juste une question je ne comprends pourquoi l'instruction "class ligne()" se balade toute seule..
    est-ce possible de m'en dire plus ?

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Ceci est ton vrai code ?
    Entre l'instruction class ligne() au milieu et autres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int ligne (int x, int y) {
    for(x=436;x<840;x+82);
    }
     
    int colonne (int x, int y) {
    for(y=151;y<558;y+82);
    }
    qui apparaissent soudainement... ton machin ne devrait même pas compiler
    Ensuite, soigne la lisiblité, à fortiori pour le présenter ne serait-ce qu'ici-même : les sauts de ligne aléatoires et tabulation au petit bonheur n'aident en rien à (re)lire le code.

    A quoi sert de récupérer la position de la souris pendant l'initialisation ? T'en fais (logiquement, puisque ça sert à rien) rien.
    Pourquoi le background n'est affiché que pendant l'initialisation puis plus jamais ?

    Il y a des tutoriels disponibles, sans même parler de SDL qui est plutôt simpliste à utiliser, pour commencer
    https://alexandre-laurent.developpez...boucle-de-jeu/
    https://jeux.developpez.com/tutoriel...es-2d-simples/
    Et pour tracer lignes etc : SDL_gfx
    Juste dans le menu au-dessus de ce forum https://jeux.developpez.com/faq/sdl/

    Ensuite SDL c'est, grosso merdo : empiler des images à l'écran. Tu prends une feuille blanche, puis tu empiles tes sprites avant de retourner la feuille pour la montrer au reste du monde via l'écran; c'est texto ce qu'il se passe (ou du moins devrait se passer si tu le réalises correctement) pour afficher un truc : tu clear le buffer, tu blit tes surfaces, puis tu flip l'écran (qui est maintenant via RenderPresent)

    Et pour la doc : http://wiki.libsdl.org

    Enfin, si t'es déjà dépassé avec une centaine de lignes... Pourquoi ne pas choisir un projet réalisable ?
    Repars de zéro, affiches une fenêtre et un background, puis tu batis le projet au fur et à mesure sur un truc au moins fonctionnel. Et non un brouillon avec des codes tests et autres copiés de tutos pris ci et là.
    En plus aujourd'hui il existe plein de gestionnaires de version gratuitement accessibles, donc aucune excuse de ne pas avoir un projet suivi proprement, en conservant uniquement le code correct lors des submits.
    Le projet ne se fait pas par magie via l'ordinateur, il faut qu'il soit clairement défini sur papier pour savoir quelles structures et algos utiliser.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre expérimenté Avatar de Tonton Nico
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 398
    Points : 1 320
    Points
    1 320
    Par défaut
    Salut Dylink2A,

    Déjà bienvenue sur le forum
    Sinon courage si tu fais des études d'informatique car comme tu peux le voir et surement le savoir, on est souvent bien accueilli par les compères

    Sinon vu que tu es en étude, prends bien compte des conseils que tu pourras trouver ici pour t'améliorer car il y a beaucoup de personnes d'expériences.
    Comme dirais Bousk, essaye de présenter au minimum ton code avant de le proposer ici (même si tout le monde n'a pas les même niveaux d'exigences), la réponse n'en sera que plus précise et rapide et surtout les personnes prennent de leur temps libre pour aider donc c'est toujours respectueux de faire ça propre (pour ma part j’essaye mais j'avoue que c'est compliqué LOL)


    Ceci est ton vrai code ?

    Je parie sur le fait qu'il y a plein de faute exprès pour venir tester le niveau du forum, en fait c'est le professeur qui troll

    TontonNico
    TontonNico

    On me dit souvent que je ressemble à Einstein... mais plutôt à Frank que Albert

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int ligne (int x, int y) {
    for(x=436;x<840;x+82);
    }
     
    int colonne (int x, int y) {
    for(y=151;y<558;y+82);
    }
    Si je ne dis pas de bêtise, ça devrait compiler. Sauf que, la boucle for ne fait rien (à cause et grâce au ';' suivant la boucle for). Grâce, car c'est avec celle-ci que cela compile.
    Par contre, vu comment est fait l'incrémentation, ça fait une boucle infinie.

    Pour le reste, il faut absolument suivre ce que dit Bousk.
    Et pour la SDL 2, y a quand même des tutos : https://jeux.developpez.com/tutoriel...=prog-2d#sdl-2
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Expert confirmé Avatar de yildiz-online
    Homme Profil pro
    Architecte de domaine
    Inscrit en
    Octobre 2011
    Messages
    1 444
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de domaine

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 444
    Points : 4 563
    Points
    4 563
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Si je ne dis pas de bêtise, ça devrait compiler.
    Normalement ça va juste lancer un warning à cause du return manquant, donc tant qu'il n'y a pas de -Werror ça devrait passer (malheureusement).
    PXL le retro-gaming facile: Essayez-le

    Yildiz-Engine an open-source modular game engine: Website
    Yildiz-Online a 3D MMORTS in alpha: Facebook page / Youtube page

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Tout d'abord, merci à tous pour vos réponses!

    Citation Envoyé par Mat.M Voir le message
    bonjour juste une question je ne comprends pourquoi l'instruction "class ligne()" se balade toute seule..
    est-ce possible de m'en dire plus ?
    Oui comme je l'ai dis sur le post de base c'est un code "brouillon", où j'essaie toute sorte de possibilité, je le propose ici en plus propre, mea culpa :

    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
    124
    #include <SDL.h>
    #include <SDL_image.h>
    #include <assert.h>
     
     
    int main() {
     
    //Variables
     
    int boucle = 1;
    SDL_Surface* ecran;
    SDL_Point mouse_position;
     
    //Initialisation SDL
     
        if(SDL_Init(SDL_INIT_VIDEO) != 0) {
            printf("SDL_Init error: %s\n", SDL_GetError());
            exit(1);
        }
     
        SDL_Window* win = SDL_CreateWindow("Bonjour", 0, 0, 1280, 720,
                                 SDL_WINDOW_SHOWN);
        if(win == 0) {
            printf("SDL_CreateWindow: %s\n", SDL_GetError());
            SDL_Quit();
            exit(1);
        }
     
        SDL_Renderer* ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
        if (ren == NULL) {
            SDL_DestroyWindow(win);
            printf("SDL_CreateRenderer Error: %s\n", SDL_GetError());
            SDL_Quit();
            exit(1);
        }
     
    SDL_SetRenderDrawColor(ren, 255, 255, 255, 2);
     
     
    //Les surfaces/textures
     
    SDL_Surface* monimage;
    monimage = IMG_Load("Points.bmp");
    assert(monimage);
     
    SDL_Surface* fond;
    fond = IMG_Load("blanc.jpg");
    assert(fond);
     
    SDL_Texture* tfond;
    tfond = SDL_CreateTextureFromSurface(ren, fond);
    assert(tfond);
     
    SDL_Texture* matexture;
    matexture = SDL_CreateTextureFromSurface(ren, monimage);
    assert(matexture);
     
    SDL_FreeSurface(monimage);
     
     
    SDL_Surface* J1;
    J1 = IMG_Load("Joueur1h.bmp");
    assert(J1);
     
     
    SDL_Texture* tJ1;
    tJ1 = SDL_CreateTextureFromSurface(ren, J1);
    assert(tJ1);
     
    //Rectangles
     
    SDL_Rect fene = {.x = 0, .y = 0, .w = 1280, .h = 720 };
    SDL_Rect coord = {.x = 315, .y = 35, .w = 650, .h = 650};
     
     
    //Coordonnées des lignes sur axe x ou y
     
    int x = 436 || 518 || 600 || 682 || 764;
    int y = 151 || 233 || 315 || 397 || 479;
     
    //Coordonnées lignes
     
    SDL_Rect l1 = {.x = 436, .y = 151, .w = 86, .h = 12};
    SDL_Rect l2 = {.x = 518, .y = 151, .w = 86, .h = 12};
    SDL_Rect l3 = {.x = 600, .y = 151, .w = 86, .h = 12};
    SDL_Rect l4 = {.x = 682, .y = 151, .w = 86, .h = 12};
    SDL_Rect l5 = {.x = 764, .y = 151, .w = 86, .h = 12};
     
     
    //Image de fond
    SDL_RenderCopy(ren, tfond,0,&fene);
    SDL_RenderPresent(ren);
    SDL_RenderClear(ren);
     
     
    //Boucle de jeu
    while(boucle) {
        SDL_Event event;
        SDL_PollEvent(&event);
        switch (event.type)
        {
            case SDL_QUIT:
                boucle = 0;
                break;
            case SDL_MOUSEBUTTONUP:
                if(event.button.button == SDL_BUTTON_LEFT)
                {
                  int mouseX = event.motion.x;
                  int mouseY = event.motion.y;
                  if(mouseX> l1.x && mouseX< (l1.x + l1.w) && mouseY> l1.y && mouseY< (l1.y + l1.h))
                  {
     
              SDL_RenderCopy(ren,tJ1,0,&l1);
     
                  break;
                  }
                 }
                 break;
         }
         SDL_RenderCopy(ren, matexture,0,&coord);
         SDL_RenderPresent(ren);
      }
        return 0;
      }


    Citation Envoyé par Bousk Voir le message
    ...
    Pour ce que tu cites en premier, il n'y a rien d'important, de simple tests, je gambergeais sur plusieurs idées.
    Pour le background j'ai été confronté par plusieurs problèmes de scintillements, clignotement stroboscopique etc, et c'est la seule méthode que j'ai trouvé pour stopper ce problème.
    J'ai à peu près compris que ça marchait de cette manière, empiler etc.

    Pour les tutoriels j'en ai suivi pas mal, mais encore une fois une grosse partie concerne la SDL1.2 qui est sensiblement différente de la 2, ceux sur la 2 ne m'aident pas nécessairement, encore une fois j'ai une table rase au niveau de mes connaissances de cette bibliothèque et ma connaissance du langage C est plutôt limitée.

    Pour le fait de choisir un projet réalisable, je n'ai pas le choix, je dois faire ça, en langage C et avec SDL2.0 pour la fac, malheureusement.

    C'est pour cela que je suis obligé de passer par des tests, des tutos etc et que je suis incapable de justement tout définir sur papier, parce-que je suis débutant et que je ne connais absolument pas l'environnement sur lequel je travaille, ma fac étant qui plus est bloquée par les manifestations depuis plus d'un mois maintenant, je n'ai plus du tout eu cours depuis alors bon le retard est encore plus grand...

    Ensuite je tiens à préciser que je compile avec un makefile, donné par le prof, qui ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CC=gcc
    CFLAGS=-O2 `sdl2-config --cflags`
    LINK=-O2 `sdl2-config --libs` -lSDL2_image
    SRC=exemple_sdl2.c
    OBJ=$(SRC:.c=.o)
     
    %.o:	%.c
    	$(CC) -c $(CFLAGS) $<
     
    exemple_sdl2:	$(OBJ)
    	$(CC) $(OBJ) $(LINK) -o $@
     
    clean:
    	rm *.o exemple_sdl2
    Ça pourra peut-être vous sembler invraisemblable mais j'y comprend à peine quelque chose, malgré les recherches. Il faut dire qu'une grosse partie de mon année a été de comprendre les choses par moi-mêmes parce-que les cours n'approfondissent pas toujours les concepts abordés. Comprenez donc que c'est difficile pour moi, même si pour vous, avec votre expérience, certaines choses peuvent paraître anodines.

    Pour en revenir au problème principal, la solution pourrait être la programmation par objet, qui me permettraient de créer des classes pour les "lignes", seulement encore une fois je m'aventurerais sur un terrain que j'ignore complètement...

    Si je devais faire un simple morpion la tâche aurait été beaucoup plus facile

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Je lis difficilement les makefile moi-même, les EDI les créent pour moi et fonctionnent suffisament bien pour pas que je m'en soucie trop
    Il t'a fournit un modèle qui permet de compiler les fichiers .c et lie SDL2_image, si ça marche, ça suffit.

    Faire du C n'empêche pas de faire de l'objet. Tu n'as pas de classes mais des structs, ce qui revient au final au même.. quant à l'abscence de fonctions membres, là encore ce n'est pas un problème.
    Et pour un projet aussi simple, inutile de vouloir faire une hiérarchie d'objets chiadée, va direct au but.
    - tu définies une struct Point, puis une autre struct Ligne qui contient 2 Point, et peut-être un schmilblick pour dire à quel joueur elle appartient
    - tu crées les fonctions nécessaires pour dessiner une Ligne, en utilisant SDL2_gfx éventuellement
    - tu as un nombre fini et connu de Point possibles, donc de Ligne possibles, tu prépares un simple tableau statique pour ça
    - tu définies comment créer une ligne
    > par exemple, en drag & drop
    - au click, tu enregistres le point de départ, puis au release tu regardes si t'es sur un autre point, si oui et que les 2 Point forment une ligne valide, tu as une nouvelle ligne
    > ou avec 2 clicks, avec une mini machine à état
    > ou 1 seul click sur une ligne en surbrillance valide quand t'es au-dessus d'une ligne valide
    > ou... je suis à court d'idées mais une autre option est sûrement pensable

    Et voilà tu as une structure qui devrait tenir la route. Maintenant tu charges et affiches le background, puis dessines les Ligne existantes, ajoutes les conditions de fin de partie etc, calcul des points, .... dans la boucle de jeu. Au fur et à mesure et sans casser l'existant déjà fonctionnel et validé.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Salut à tous!

    Je m'excuse pour ma réponse tardive, j'ai eu des vacances prolongées et je n'ai pas pu répondre durant cette période malheureusement.

    Tout d'abord Bousk je te remercie pour ta réponse, et j'ai saisi le plan que tu m'as proposé, ma question maintenant est la suivante :

    Parmi les solutions proposées, celle que j'envisageais le mieux (et qui me semblait sur le papier la moins compliquée), était l'option du 1 clic sur des lignes déjà prédisposées sur la grille.

    Cependant, SDL oblige, j'aimerais savoir s'il y a un autre moyen qu'utiliser les coordonnées de la souris pour savoir ce sur quoi on a cliqué?

    Car le problème resterait au final le même quelque soit la solution choisie, en drag and drop, j'aurais besoin de saisir les coordonnées de chaque point pour savoir si oui ou non je suis sur l'un d'eux, pour le clic unique, même problème.

    Le problème étant que 36 points, ou bien alors 60 lignes, ça fait beaucoup, je ne peux pas faire 36 ou 60 instructions différentes en fonction des coordonnées de tel ou tel point, ou telle ou telle ligne...

    Je vous remercie d'avance pour votre attention!

  10. #10
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Le problème étant que 36 points, ou bien alors 60 lignes, ça fait beaucoup, je ne peux pas faire 36 ou 60 instructions différentes en fonction des coordonnées de tel ou tel point, ou telle ou telle ligne...
    Alors, il faut une boucle, ou bien une opération mathématique pour transformer la donnée afin de la rendre plus facilement exploitable.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Oui c'est bien là que se situe mon problème, je ne sais absolument pas comment m'y prendre pour rendre cette donnée plus "dynamique", plus "manipulable" entre autre...

  12. #12
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Bonjour à tous!

    Je reviens vers vous pour signaler que j'ai trouvé solution à mon problème, et ce grâce à vos posts qui m'ont bien mis sur la bonne piste, au final, comme très souvent, la solution était toute bête...

    Je la poste ici, sait-on jamais si quelqu'un à l'avenir sera intéressé :

    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
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
      #include <SDL.h>
      #include <SDL_image.h>
      #include <assert.h>
     
      void joueur1 (SDL_Rect tab[], SDL_Rect t[], SDL_Renderer* ren, int x1, int y1){
        int i;
        int e;
        int d;
        int joueur;
        tab[0].x = 436;
        tab[0].y = 154;
        tab[0].w = 80;
        tab[0].h = 5;
        tab[d].y = 64;
        t[0].x= 339;
        t[0].y = 161;
        t[0].w = 5;
        t[0].h = 80;
        t[e].x = 339;
        for(i=0;i<30;i++)
         {
           if (i%5 == 0) {
             tab[i].x = 436;
             tab[d].y = tab[d].y +90;
             t[i].y = 161;
             t[e].x = t[e].x + 90;
           }
          tab[i+1].x = tab[i].x + 90;
          tab[i].y = tab[d].y;
          tab[i].w = 80;
          tab[i].h = 5;
          t[i+1].y = t[i].y + 90;
          t[i].x = t[e].x;
          t[i].w = 5;
          t[i].h = 80;
            if (x1> tab[i].x && x1< (tab[i].x + tab[i].w) && y1> (tab[i].y-5) && y1< (tab[i].y +5) + (tab[i].h)) {
              SDL_RenderDrawRect(ren, &tab[i]);
              SDL_SetRenderDrawColor(ren,255,0,0,255);
              SDL_RenderFillRect(ren,&tab[i]);
     
            }
            if (x1> (t[i].x -5) && x1< ((t[i].x +5) + t[i].w) && y1> t[i].y && y1< t[i].y + (t[i].h)) {
            SDL_RenderDrawRect(ren, &t[i]);
            SDL_SetRenderDrawColor(ren,255,0,0,255);
            SDL_RenderFillRect(ren,&t[i]);
     
          }
     
      }
      }
     
      void points(SDL_Renderer * ren)
      {
        SDL_Rect r;
        int i;
        int e;
        r.x = 336;
        r.y = 61;
        r.w = 10;
        r.h = 10;
        for(i=0;i<36;i++)
      	 {
           if (i%6==0) {
             r.x = 336;
             r.y = r.y + 90;
           }
          r.x = r.x + 90;
          SDL_RenderDrawRect(ren, &r);
          SDL_SetRenderDrawColor(ren,255,255,255,255);
      		SDL_RenderFillRect(ren,&r);
         }
       }
     
     
      int main() {
     
      //Variables
     
      int boucle = 1;
      SDL_Rect tab[100];
      SDL_Rect t[100];
      int x1;
      int y1;
      int joueur=0;
     
      //Initialisation SDL
     
          if(SDL_Init(SDL_INIT_VIDEO) != 0) {
              printf("SDL_Init error: %s\n", SDL_GetError());
              exit(1);
          }
     
          SDL_Window* win = SDL_CreateWindow("Bonjour", 0, 0, 1280, 720,
                                   SDL_WINDOW_SHOWN);
          if(win == 0) {
              printf("SDL_CreateWindow: %s\n", SDL_GetError());
              SDL_Quit();
              exit(1);
          }
     
          SDL_Renderer* ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
          if (ren == NULL) {
              SDL_DestroyWindow(win);
              printf("SDL_CreateRenderer Error: %s\n", SDL_GetError());
              SDL_Quit();
              exit(1);
          }
     
     
      //Boucle de jeu
      while(boucle) {
        points(ren);
          SDL_Event event;
          SDL_PollEvent(&event);
          switch (event.type)
          {
              case SDL_QUIT:
                  boucle = 0;
                  break;
                  case SDL_MOUSEBUTTONDOWN:
                      if(event.button.button == SDL_BUTTON_LEFT)
                      {
                        x1 = event.motion.x;
                        y1 = event.motion.y;
                        joueur1(&tab[30], &t[30], ren, x1, y1);
                      }
                        break;
     
     
      }
           SDL_RenderPresent(ren);
        }
          return 0;
        }
    Merci encore à vous tous!

  13. #13
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Cool !
    Je souhaitais apporté une réponse plus précise, mais je n'avais pas eu le temps. Par contre, je suis très content que vous ayez trouvé vous même et vous pouvez en être fier.

    Maintenant, j'ai tout de même des remarques :
    • faites attention à l'indentation de votre code ;
    • ajoutez des commentaires pour expliquer le fonctionnement (comment c'est sensé ce dérouler/fonctionner et pourquoi c'est ainsi, quelle est la logique). Toutefois, un tel commentaire est inutile
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      //Variables
       
        int boucle = 1;
      ;
    • Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      int i;
          int e;
          int d;
          int joueur;
      Une bonne pratique qui peut sauver des vies est d'initialiser les valeurs des variables au moment de leur déclarations ;
    • utiliser un meilleur nommage des variables et des fonctions (variable 'e', 'd' ?) ;
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  14. #14
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Bonjour à tous une fois de plus!

    Bon, finalement l'euphorie est passée, je me retrouve confronté à un autre problème que je ne parviens pas à résoudre...

    Bon déjà pour commencer le problème "optionnel" pour le moment, que je peux tenter de résoudre plus tard, même si le temps presse pour moi : Je ne parviens pas à faire alterner les couleurs en fonction du joueur qui clique. Enfin, sur le papier, si, ça devrait fonctionner, seulement, SDL, lors du clic, m'affiche les deux couleur simultanée (à savoir rouge et bleu, ce qui donne du rose donc), sauf lors de la fermeture de la fenêtre où dans un court laps de temps j'aperçois qu'il s'agit en réalité des bonnes couleurs correspondantes mais que SDL n'affiche pas comme il le devrait. Bref.

    Le plus gros problème principal, c'est que j'aimerais créer une fonction qui teste si les rectangles qui ont été affichés lors du clic forment bien un carré, et là je suis en total manque d'inspiration... Je me triture encore une fois l'esprit à la recherche d'une solution et je progresse pas, dû à mon manque de connaissance du langage et de la librairie, aucune solution ne me vient en tête malgré mes essais et prototype...

    Quelqu'un pourrait-il m'éclaire, me guider?

    Merci d'avance!

    Ah, je viens d'avoir une information de la part de mon prof qui chamboule un peu tout ce que j'imaginais jusqu'à maintenant...

    Il me dit qu'en réalité il attend que la logique du jeu et la représentation SDL doivent être séparées, d'un côté l'interface homme/machine, et de l'autre l'interface graphique, je dois vous avouer que je suis extrêmement perdu pour le coup...

  15. #15
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    En effet, une séparation de la logique et du graphisme est une bonne pratique. En théorie, on pourrait même aller plus loin.
    Pour votre problème, je pense que cela vient d'un traitement des événements trop rapide. En effet, pour un unique clic, la boucle principale s'exécutera plusieurs fois, provoquant le jeu des deux joueurs.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  16. #16
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Citation Envoyé par Dylink2a Voir le message
    Il me dit qu'en réalité il attend que la logique du jeu et la représentation SDL doivent être séparées, d'un côté l'interface homme/machine, et de l'autre l'interface graphique, je dois vous avouer que je suis extrêmement perdu pour le coup...
    Pourtant ton probleme vient bien de là :p
    Le code devient un bordel sans nom si tu mélange la logique du jeu et les fonction graphics , les deux partie doivent être séparer et indépendantes.

  17. #17
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Oui j'entend bien et je comprend l'idée, mais du coup j'suis réellement perdu, étant une brêle totale je sais même pas par où commencer ni comment.

    Je n'ai aucune idée de comment concevoir ou structurer un jeu, étant donné que ça fait près de 3 mois qu'on n'a plus eu de cours...

Discussions similaires

  1. Qu'est ce qu'un grand projet ?
    Par Geronimo dans le forum Débats sur le développement - Le Best Of
    Réponses: 62
    Dernier message: 04/04/2013, 14h52
  2. [Delphi] Association composants-projet
    Par Pierre Castelain dans le forum Composants VCL
    Réponses: 6
    Dernier message: 31/07/2002, 16h20
  3. Parametrage des options de projet
    Par ares7 dans le forum EDI
    Réponses: 7
    Dernier message: 22/07/2002, 15h33
  4. Réponses: 6
    Dernier message: 21/06/2002, 14h48
  5. Les fichiers d'un projet
    Par Manolo dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/05/2002, 17h51

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