Je réalise un jeu en SDL pour un projet dans mon école. J'ai commencé par le réaliser en C et maintenant je souhaite avoir une interface graphique donc j'utilise la SDL.
Cependant dans l'une de mes fenêtres lorsque j'utilise des fonctions réalisées avant, la fenêtre générée freeze et je ne peux pas rentrer les informations nécessaires à la fonction dans la console. Cela vient peut être d'un problème de boucle ou quelque chose de similaire, mais je ne vois pas.
Merci par avance.
Code:
while(launched)
{
SDL_Event evenement;
player joueur1;
player joueur2;
int tas=20;
int choix;
SDL_RenderClear(moteur);
SDL_RenderCopy(moteur, texture, NULL, &menu);
afficher_allumettes_SDL(RectangleAll, moteur, TextureAll, tas);
SDL_RenderPresent(moteur);
/* Problème freeze
initialisation_joueurs(&joueur1, &joueur2);
entree_noms_joueurs(&joueur1);
entree_noms_joueurs(&joueur2);
*/
while(SDL_PollEvent(&evenement))
{
switch(evenement.type)
{
case SDL_QUIT:
launched = SDL_FALSE;
break;
case SDL_MOUSEBUTTONUP:
if(evenement.button.button == SDL_BUTTON_LEFT)
{
Uint8 etat_souris = SDL_GetMouseState(&x, &y);
choix = choix_allumettes_SDL(tas, joueur1, joueur2, moteur, rectangle1, rectangle2, rectangle3);
printf("ValeurChoix : %i",choix);
if (rectangle4.x < x && x < rectangle4.x + rectangle4.w && rectangle4.y < y && y < rectangle4.y + rectangle4.h)
{
launched = SDL_FALSE;
break;
}
break;
}
}
}
}
SDL_DestroyRenderer(moteur);
SDL_DestroyWindow(fenetre);
SDL_Quit();
}
et voila pour les fonctions:
void initialisation_joueurs (player * joueur1, player * joueur2)
{
srand(time( NULL ));
joueur1->marqueur = rand() % 2; //reste de la division euclidienne d'un nombre aléatoire par 2
joueur1->NbVictoires = 0;
joueur2->marqueur = 1 - joueur1->marqueur;
joueur2->NbVictoires = 0;
}
void entree_noms_joueurs (player * joueur)
{
printf("\nSaisir un nom :\n");
scanf("%s",joueur->NomJoueur);
}
Salut, tu peux me montrer ton code avant la boucle ?
Ah oui, et je pense si je ne me trompe pas, la fonction "scanf" bloque le programme, ducoup si tu veux que ta fenêtre "refonctionne", tu dois finir de remplir ta saisie.
La fonction scanf() n'est clairement pas utilisable conjointement avec sdl. Il faudra trouver une autre manière d'entrer des informations avec sdl. Peut-être (jamais utilisé) avec SDL_StartTextInput() ?
Edit: un exemple ici (l'auteur fait partie de ceux qui ont développé sdl). Pas testé. Si jamais tu testes, fais un feedback.
- Edité par edgarjacobs 28 mai 2022 à 19:58:23
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Ça n'a effectivement aucun sens d'utiliser scanf dans une application graphique. Cela impliquerait d'avoir à utiliser la console et la fenêtre en même temps !
Par contre comme SDL est très barebone, tu vas devoir coder un espèce d'“input box” pour afficher et éditer le texte de l'utilisateur quand il massacre son clavier.
git is great because Linus did it, mercurial is better because he didn't.
Par contre comme SDL est très barebone, tu vas devoir coder un espèce d'“input box” pour afficher et éditer le texte de l'utilisateur quand il massacre son clavier.
Je l'ai écrit pour la version 1.x . Vraiment pas évident à gérer si on veut être complet: curseur clignotant ou non suivant mode insert ou replace, gestion des touches home / end (avec un input plus long que la fenêtre d'input), le background à afficher (colueur fixe ou transparent pour l'utilisation du background en cours), delete ou backspace, insertion du clipboard, ....
- Edité par edgarjacobs 29 mai 2022 à 19:36:56
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
En SDL 1 c'était compliqué, ça l'est un peu moins avec SDL 2 qui gère très bien les insertions unicode via les fonction StartTextInput etc, ça ouvre par exemple un clavier sur iOS/Android. Toi tu as « plus qu'à » concaténer les évènements dans un buffer et l'afficher.
git is great because Linus did it, mercurial is better because he didn't.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
git is great because Linus did it, mercurial is better because he didn't.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
git is great because Linus did it, mercurial is better because he didn't.