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 :

Console et SDL en parallèle est-ce possible en C ?


Sujet :

SDL

  1. #1
    Membre habitué

    Homme Profil pro
    Sans emploi
    Inscrit en
    Août 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emploi

    Informations forums :
    Inscription : Août 2019
    Messages : 72
    Points : 127
    Points
    127
    Par défaut Console et SDL en parallèle est-ce possible en C ?
    Bonsoir,

    J'essaie de faire une application qui utilise la console et la librairie SDL en parallèle mais ça pose des soucis. Je travaille en C. Mon but est de lancer une commande textuelle qui est capable de lancer une visionneuse d'image, mais j'aimerai que les deux processus soient captables de travailler si possible en même temps. C'est a dire garder la console active et lancer des commandes et la visionneuse en même temps sur le coté.

    Je suis arrivé à lancer une visionneuse via la console mais ça bloque l'application console jusqu'a ce qu'on éteigne la visionneuse mais aussi ça crée sous Windows des bugs graphique quand on déplace la fenêtre console par dessus la fenêtre SDL. Donc quelle solutions possible? j'aimerai que l'application soit compatible Windows et Linux d'ou l'utilisation de la SDL.

    Merci

  2. #2
    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,

    N'hésitez pas à montrer votre code. Pour moi, lire la console va mettre en "pause" l'application graphique, donc ça ne donnera pas un truc génial.
    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.

  3. #3
    Membre habitué

    Homme Profil pro
    Sans emploi
    Inscrit en
    Août 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emploi

    Informations forums :
    Inscription : Août 2019
    Messages : 72
    Points : 127
    Points
    127
    Par défaut
    Voici le code ou il en est et je pense que ça fera plaisir à certain...Et d'autre non car il est assez bordélique me semble. J'ai fait donc la commande en SDL2 ici en me basant sur des codes que j'ai trouvé en ligne que j'ai retravaillé pour correspondre à ce que je voulais et passer de surface à rendered car à la base ça marchait avec les surface.

    J'aimerai à présent créer une fonction qui représente une routine au moment ou on appuie sur une touche mais j'ai du mal car à mon avis j'aurai besoin d'utiliser des pointeur si quelqu'un pourrait me montrer la voie c'est le bienvenu.
    J'ai créé une fonction mais pour l'instant ça ne fonctionne pas hors quand je tourne sans la fonction ça fonctionne comme je l'entends...C'est à dire que là c'est un programme qui affiche un fond d'écran un petit texte et un prompt (commande texte enba de l'écran) Voici le code avec la fonction entamée mais non fonctionnelle (bien que ça se compile) Je patauge pour cette fonction.

    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
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
     
     
    #include <stdio.h>
    #include <SDL2/SDL.h>
    #include <SDL2/SDL_ttf.h>
    #include <SDL2/SDL_image.h>
     
    void Pushletter(SDL_Surface*lettre,TTF_Font *font,char *commande)
    {
        SDL_Color color = {0xff, 0xff, 0xff, 0xff};
        lettre = TTF_RenderText_Solid(font,commande,color);
        printf("alo!");
    }
     
    int main(int argc, char *argv[]) {
        SDL_Window *fenetre;
        SDL_Surface *screen, *text,*lettre;
        SDL_Rect position, cur,TextPos;
        SDL_Event ev;
        TTF_Font *font;
        int running = 1, cpt_com=0;
        char commande[41]={""};
        position.x=0;
        position.y=0;
        position.w=640;
        position.h=455;
        //Position initiale du curseur de saisie
        cur.x=0;
        cur.y=455;
        cur.w=0;
        cur.h=25;
        TextPos.x=20;
        TextPos.y=200;
        TextPos.w=620;
        TextPos.h=132;
     
        char *SAMPLETEXT =
        "Bienvenu à Agrabah cité de la magie noire\n"
        "Fiction Interactive par Kitsune.\n"
        "Histoire basée à partir de l'histoire de Disney.\n\n"
        "Entrez \"continuer\" pour débuter la partie...";
        char *letter="";
        // init SDL/TTF
        SDL_Init(SDL_INIT_VIDEO);
        //Initialise le module de police
        TTF_Init();
        // Create GUI
        fenetre = SDL_CreateWindow("Example", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
                640, 480, SDL_WINDOW_SHOWN);
     
        SDL_Renderer *renderer = SDL_CreateRenderer( fenetre, -1, SDL_RENDERER_ACCELERATED);
        SDL_Texture* texture = IMG_LoadTexture(renderer, "title.jpg");
        // Open and set up font
        font = TTF_OpenFont("cour.ttf", 22);
        if(font == NULL) {
            fprintf(stderr, "Error: Les police de caractères sont introuvables.\n");
            return 0;
        }
        TTF_SetFontStyle(font, TTF_STYLE_NORMAL);
        /*
        SDL_Surface* image = IMG_Load("title.jpg");
        if(!image)
        {
            printf("Erreur de chargement de l'image : %s",SDL_GetError());
            return 0;
        }*/
        // Grab GUI surface
        screen = SDL_GetWindowSurface(fenetre);
        // Clear screen black
      //  SDL_FillRect(screen, NULL, 0);
     /*   SDL_BlitSurface(image, NULL, screen, &position);
        SDL_FreeSurface(image);*/
        // Draw some text to screen
        SDL_Color color = {0xff, 0xff, 0xff, 0xff};
        text = TTF_RenderText_Blended_Wrapped(font, SAMPLETEXT, color,620);
        SDL_Texture* Message = SDL_CreateTextureFromSurface(renderer, text);
        lettre = TTF_RenderText_Solid(font, commande, color);
        SDL_Texture* lettre_text = SDL_CreateTextureFromSurface(renderer, lettre);
     /*   position.x=100;
        position.y=300;
        position.w=100;
        position.h=100;*/
        //On positionne le texte sur le rectangle "position"
        //SDL_BlitSurface(text, NULL, screen, &position);
     
        while(running) { // Main loop
            SDL_RenderClear(renderer);
            SDL_RenderCopy(renderer, texture, NULL, &position);
            SDL_RenderCopy(renderer, Message, NULL, &TextPos);
            SDL_RenderCopy(renderer, lettre_text, NULL, &cur);
            while(SDL_PollEvent(&ev)) {
                switch(ev.type){
                    case SDL_QUIT:
                        running = 0;
                        break;
                    case SDL_KEYDOWN:
                        if(ev.key.keysym.sym == SDLK_BACKSPACE){
                            if(cpt_com!=0){
                            cur.w-=14;
                            cpt_com--;
                            commande[cpt_com]='\0';
                            lettre = TTF_RenderText_Blended(font, commande, color);
                            lettre_text = SDL_CreateTextureFromSurface(renderer, lettre);
                            SDL_Log("Vous venez d'effacer une lettre! %s",commande);
                            SDL_FillRect(screen, &cur, 0);}
                        }
                        else if(ev.key.keysym.sym == SDLK_a){
                            if(cpt_com<40){
                                SDL_Log("Vous venez de presser la lettre A!");
                                commande[cpt_com]='a';
                                //lettre = TTF_RenderText_Solid(font, commande, color);
                                Pushletter(lettre,font,commande);
                                lettre_text = SDL_CreateTextureFromSurface(renderer, lettre);
                                cur.w+=14;
                                cpt_com++;
     
                            }
                            else
                                SDL_Log("Vous avez atteinds le nombre de lettres maximum!");
                        }
                        else if(ev.key.keysym.sym == SDLK_b){
                            if(cpt_com<40){
                                SDL_Log("Vous venez de presser la lettre B!");
                                commande[cpt_com]='b';
                                lettre = TTF_RenderText_Solid(font, commande, color);
                                lettre_text = SDL_CreateTextureFromSurface(renderer, lettre);
                                cur.w+=14;
                                cpt_com++;
                            }
                            else
                                SDL_Log("Vous avez atteinds le nombre de lettres maximum!");
                        }
                         else if(ev.key.keysym.sym == SDLK_c){
                            if(cpt_com<40){
                                SDL_Log("Vous venez de presser la lettre C!");
                                commande[cpt_com]='c';
                                lettre = TTF_RenderText_Solid(font, commande, color);
                                lettre_text = SDL_CreateTextureFromSurface(renderer, lettre);
                                cur.w+=14;
                                cpt_com++;
                            }
                            else
                                SDL_Log("Vous avez atteinds le nombre de lettres maximum!");
                        }
                         else if(ev.key.keysym.sym == SDLK_d){
                            if(cpt_com<40){
                                SDL_Log("Vous venez de presser la lettre D!");
                                commande[cpt_com]='d';
                                lettre = TTF_RenderText_Solid(font, commande, color);
                                lettre_text = SDL_CreateTextureFromSurface(renderer, lettre);
                                cur.w+=14;
                                cpt_com++;
     
                            }
                            else
                                SDL_Log("Vous avez atteinds le nombre de lettres maximum!");
                        }
                        else if(ev.key.keysym.sym == SDLK_e){
                            if(cpt_com<40){
                                SDL_Log("Vous venez de presser la lettre E!");
                                commande[cpt_com]='e';
                                lettre = TTF_RenderText_Solid(font, commande, color);
                                lettre_text = SDL_CreateTextureFromSurface(renderer, lettre);
                                cur.w+=14;
                                cpt_com++;
                            }
                            else
                                SDL_Log("Vous avez atteinds le nombre de lettres maximum!");
                        }
                        else if(ev.key.keysym.sym == SDLK_f){
                            if(cpt_com<40){
                                SDL_Log("Vous venez de presser la lettre F!");
                                commande[cpt_com]='f';
                                lettre = TTF_RenderText_Solid(font, commande, color);
                                lettre_text = SDL_CreateTextureFromSurface(renderer, lettre);
                                cur.w+=14;
                                cpt_com++;
                            }
                            else
                                SDL_Log("Vous avez atteinds le nombre de lettres maximum!");
                        }
                        else if(ev.key.keysym.sym == SDLK_g){
                            if(cpt_com<40){
                                SDL_Log("Vous venez de presser la lettre G!");
                                commande[cpt_com]='g';
                                lettre = TTF_RenderText_Solid(font, commande, color);
                                lettre_text = SDL_CreateTextureFromSurface(renderer, lettre);
                                cur.w+=14;
                                cpt_com++;
                            }
                            else
                                SDL_Log("Vous avez atteinds le nombre de lettres maximum!");
                        }
                        break;
                }
            }
     
            SDL_RenderPresent(renderer);
            //SDL_UpdateWindowSurface(fenetre); // Refresh window
            SDL_Delay(20); // Delay loop
        }
    ;
        // Destroy resources and quit
        SDL_DestroyTexture(Message);
        SDL_FreeSurface(text);
        TTF_CloseFont(font);
        TTF_Quit();
     
        SDL_FreeSurface(text);
        SDL_DestroyWindow(fenetre);
        SDL_Quit();
     
        return 0;
    }
    Comme vous voyez si vous analysez le code un schéma se répète pour chaque touche pressée (dans la boucle principale).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                      lettre = TTF_RenderText_Solid(font, commande, color);
                                lettre_text = SDL_CreateTextureFromSurface(renderer, lettre);
                                cur.w+=14;
                                cpt_com++;
    J'aimerai mettre cette parcelle de code dans une fonction mais j'ai du mal...Il m'affiche des erreurs, je ne sais pas bien ce que je dois renvoyé dans les paramètres (déclaration de fonction) j'y vais à tâtons pour l'instant. J'aimerai rester en C.
    C'est avec la lettre "a" en tapant au clavier que la fonction se lance mais pour l'instant je n'ai pas le résultat escompté...Les lettres B à G fonctionne (mais sans passer par la fonction)

    Si vous savez m'aiguillé c'est le bienvenu. Merci

  4. #4
    Inactif  
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Février 2021
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2021
    Messages : 16
    Points : 0
    Points
    0
    Par défaut
    Je sais pas si ce genre de bricolage est possible mais SDL est clairement pas conçu pour ça.

    La console ça sert juste à la debug version pour tracer tes calculs, c'est tout.

    Si tu veux faire un jeu où on tape du texte, il faut programmer tout ça dans la fenêtre SDL avec les events clavier.

  5. #5
    Membre habitué

    Homme Profil pro
    Sans emploi
    Inscrit en
    Août 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emploi

    Informations forums :
    Inscription : Août 2019
    Messages : 72
    Points : 127
    Points
    127
    Par défaut
    Justement c'est ce que je tente de faire ici...Mais je suis bloqué avec les fonctions pour l'instant comme expliqué ci plus haut. En le compilant il crée une espèce de ligne de commande en SDL ici.

  6. #6
    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 Kitsune64 Voir le message
    En le compilant il crée une espèce de ligne de commande en SDL ici.
    parce que tu compile sûrement en mode console , il faut compiler en mode GUI (sur Code Block y'a ça dans les options )

  7. #7
    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
    Tu peux peut-être intégrer imgui dans ton projet, ça va décupler tes possibilités de debug assez facilement.
    Notamment, tu pourras ajouter un champ texte, si tu veux taper des commandes. Mais traduire des commandes est pas forcément simple.
    Tu peux aussi simplement ajouter des boutons à cliquer pour lancer des actions de ton choix.
    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.

  8. #8
    Membre habitué

    Homme Profil pro
    Sans emploi
    Inscrit en
    Août 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emploi

    Informations forums :
    Inscription : Août 2019
    Messages : 72
    Points : 127
    Points
    127
    Par défaut
    Citation Envoyé par Kannagi Voir le message
    parce que tu compile sûrement en mode console , il faut compiler en mode GUI (sur Code Block y'a ça dans les options )
    Bonjour
    Oui et non plus je ne suis plus à ce stade...Je créer une ligne de commande en SDL au lieu d'utiliser la ligne de commande en console à présent...Bien que la console soit toujours présente ici effectivement mais ne me dérange pas pour l'instant.
    Donc en compilant ce projet j'ai une fenêtre SDL avec à l'intérieur de cette fenêtre une sorte de ligne de commande que j'ai sciemment créé.

    Mais ça ne réponds toujours pas à la question de passer en fonction ce bout de code dont je parlais ci plus haut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    lettre = TTF_RenderText_Solid(font, commande, color);
                                lettre_text = SDL_CreateTextureFromSurface(renderer, lettre);
                                cur.w+=14;
                                cpt_com++;
    Pour répondre à Bousk,
    ImgGUI est pour C++ a ce que je vois j'aimerai rester en C car je ne maitrise pas du tout le C++

  9. #9
    Inactif  
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Février 2021
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2021
    Messages : 16
    Points : 0
    Points
    0
    Par défaut
    Je suis pas un spécialiste de la bibliothèque SDL mais je sais qu'il faut pas trop lui en demander.

    Ca a été à la base crée par Valve pour faciliter l'intégration de leurs jeux dans les os win / mac, tout le reste est géré par direct / opengl (y compris le texte).

    Le moteur 2d sprites/texte c'était juste conçu pour que les débutants fassent l'exercice du pong mais aujourd'hui pygame fait ça bien mieux.

  10. #10
    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
    Dear IMGUI est écrit en C++, mais il faut pas plus de 1/100s pour trouver un binding C.

    Après si le problème c'est la syntaxe pour écrire une fonction...?
    Je vois pas trop ce qui pourrait bloquer.
    Tu sors ton code, et ajoutes les variables nécessaires en paramètres.
    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.

  11. #11
    Membre habitué

    Homme Profil pro
    Sans emploi
    Inscrit en
    Août 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emploi

    Informations forums :
    Inscription : Août 2019
    Messages : 72
    Points : 127
    Points
    127
    Par défaut
    Citation Envoyé par Bousk Voir le message
    ...
    Tu sors ton code, et ajoutes les variables nécessaires en paramètres.
    C'est ce que j'ai essayé de faire mais ça ne fonctionne pas comme prévu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void Pushletter(SDL_Surface*lettre,TTF_Font *font,char *commande,SDL_Surface *lettre_text,SDL_Renderer*renderer)
    {
        SDL_Color color = {0xff, 0xff, 0xff, 0xff};
        lettre = TTF_RenderText_Solid(font,commande,color);
        lettre_text = SDL_CreateTextureFromSurface(renderer, lettre);
        SDL_RenderPresent(renderer);
    }
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
                        else if(ev.key.keysym.sym == SDLK_a){
                            if(cpt_com<40){
                                SDL_Log("Vous venez de presser la lettre A!");
                                commande[cpt_com]='a';
                                //lettre = TTF_RenderText_Solid(font, commande, color);
                                Pushletter(&lettre,font,&commande,&lettre_text,renderer);
                                //lettre_text = SDL_CreateTextureFromSurface(renderer, lettre);
                                cur.w+=14;
                                cpt_com++;
     
                            }
    Ca se compile mais le résultat final ne s'affiche pas lors du lancement du programme.

Discussions similaires

  1. Le multithread SDL/OpenGL est il possible ?
    Par aliwatte dans le forum SDL
    Réponses: 1
    Dernier message: 05/03/2013, 08h18
  2. Est-ce possible : exécution parallèle ?
    Par darkwall_37 dans le forum Multithreading
    Réponses: 5
    Dernier message: 12/05/2009, 08h12
  3. Réponses: 1
    Dernier message: 30/07/2008, 15h11
  4. Oemapp console est 'il possible sur la 10G
    Par Bayoro dans le forum Oracle
    Réponses: 0
    Dernier message: 12/05/2008, 23h34
  5. Utiliser la console Windows, est-ce possible ?
    Par djfrancky dans le forum SDL
    Réponses: 4
    Dernier message: 21/08/2007, 18h15

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