Dans le cadre d'un projet en C, je suis en train de créer un mastermind avec la bibliothèque sdl. Je crée 4 disque de couleurs différentes pour pouvoir cliquer dessus et afficher un disque de la couleur correspondante sur le plateau de jeu. Cependant lorsque je clique sur un disque, dès que je bouge ma souris le disque créé disparais, je suppose que ça a un lien avec le pollevent mais je ne vois pas comment régler ce problème.
Je vous met juste en dessous les portions de codes qui pour moi sont à problème
while (continuer)
{
SDL_PollEvent(&event);
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
break;
case SDL_MOUSEBUTTONUP:
if (event.button.button == SDL_BUTTON_LEFT)
{
int x = event.button.x;
int y = event.button.y;
if (x>0 & x<2000 & y>0 & y<2000)
{
clique_couleurs(ecran,x,y);
}
}
break;
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_ESCAPE: // Veut arrêter le jeu
continuer = 0;
break;
case SDLK_KP1: // Demande à jouer
jouer(ecran);
break;
}
break;
}
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 70,70,70));
position1.x = 1150; // Les coordonnées de la surface seront (0, 0)
position1.y = 250;
// Remplissage de la surface avec du blanc
SDL_FillRect(rectangle1, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
SDL_BlitSurface(rectangle1, NULL, ecran, &position1);
/* Blit du texte */
position.x = 0;
position.y = 0;
SDL_BlitSurface(texte_titre, NULL, ecran, &position);
afficherformes(ecran);
SDL_Flip(ecran);
}
Dans ce jeu, rien ne doit se passer si le joueur n'intervient pas (pas de nuage ou d'ennemi à déplacer p.ex.). Je te conseille donc d'utiliser SDL_WaitEvent(). Mais je ne sais pas si ça résoudra ton problème, il y a tellement peu de code.
Accessoirement (mais très conseillé), voilà 7 ou 8 ans que sdl 1.x a été remplacé par par sdl 2.x .... il serait bon de migrer tout de suite.
Edit: en C, on parle de fonction, pas de méthode.
- Edité par edgarjacobs 30 novembre 2020 à 20:44:22
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
merci de ton aide! malheuresement lorsque je remplace par wait_event il ne se passe rien même quand je clique au bon endroit.
Pour ce qui est de SDL1 je suis totalement de ton idée cependant mon enseignant s'est obstiné à nous faire des cours sur sdl1 et je ne pense pas pouvoir migrer vers sdl2.
Merci pour le vocabulaire, je confonds souvent entre chaque langage!
Voici le code complet du main et apres les codes pour créer le disque que j'appelle
#include <stdlib.h>
#include <stdio.h>
#include <SDL.h>
#include <SDL_image.h>
#include <SDL/SDL_ttf.h>
#include "jouer.h"
int main(int argc, char *argv[])
{
SDL_Surface *ecran = NULL, *texte_titre = NULL, *texte_choix1 = NULL, *texte_choix2 = NULL, *texte_choix3 = NULL, *fond = NULL,*lignes[256] = {NULL},*rectangle = NULL;
SDL_Rect position,position1;
SDL_Event event;
TTF_Font *police = NULL;
SDL_Color couleurNoire = {0, 0, 0};
SDL_Color couleurBlanc = {255, 255, 255};
SDL_Color couleurRouge = {255, 0, 0};
int continuer = 1;
int i = 0;
SDL_Init(SDL_INIT_VIDEO);
TTF_Init();
const SDL_VideoInfo* myPointer = SDL_GetVideoInfo();
ecran = SDL_SetVideoMode(myPointer->current_w, myPointer->current_h, myPointer->vfmt->BitsPerPixel, SDL_DOUBLEBUF|SDL_HWSURFACE);
SDL_WM_SetCaption("Premier test Mastermind", NULL);
for (i = 0 ; i <= 255 ; i++)
lignes[i] = SDL_CreateRGBSurface(SDL_HWSURFACE,myPointer->current_w , 3, 32, 0, 0, 0, 0);
/*fond = IMG_Load("lac_en_montagne.bmp");*/
/* Chargement de la police */
police = TTF_OpenFont("Glitch.otf", 65);
/* Écriture du texte dans la SDL_Surface texte en mode Blended (optimal) */
texte_titre = TTF_RenderText_Blended(police, "Mastermind", couleurBlanc);
texte_choix1 = TTF_RenderText_Blended(police, "Jouer", couleurBlanc);
texte_choix2 = TTF_RenderText_Blended(police, "Regles du jeu", couleurBlanc);
texte_choix3 = TTF_RenderText_Blended(police, "Quitter", couleurBlanc);
while (continuer)
{
SDL_WaitEvent(&event);
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
break;
case SDL_MOUSEBUTTONUP:
if (event.button.button == SDL_BUTTON_LEFT) /* On arrête le programme si on a fait un clic gauche */
{
int x = event.button.x;
int y = event.button.y;
if (x>450 & x<750 & y>250 & y<330)
{
jouer(ecran);
}
}
break;
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_ESCAPE: // Veut arrêter le jeu
continuer = 0;
break;
case SDLK_KP1: // Demande à jouer
jouer(ecran);
break;
}
break;
}
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
for (i = 0 ; i <= 255 ; i++)
{
position.x = 0; // Les lignes sont à gauche (abscisse de 0)
position.y = 3*i; // La position verticale dépend du numéro de la ligne
SDL_FillRect(lignes[i], NULL, SDL_MapRGB(ecran->format, 128, i, 128));
SDL_BlitSurface(lignes[i], NULL, ecran, &position);
}
/* Blit du texte */
SDL_BlitSurface(rectangle, NULL, ecran, &position1);
position.x = (myPointer->current_w)/3;
position.y = 0;
SDL_BlitSurface(texte_titre, NULL, ecran, &position);
position.x = (myPointer->current_w)/3;
position.y = (myPointer->current_h)/3;
SDL_BlitSurface(texte_choix1, NULL, ecran, &position);
position.x = (myPointer->current_w)/3;
position.y = ((myPointer->current_h)/3)+100;
SDL_BlitSurface(texte_choix2, NULL, ecran, &position);
position.x = (myPointer->current_w)/3;
position.y = ((myPointer->current_h)/3)+200;
SDL_BlitSurface(texte_choix3, NULL, ecran, &position);
SDL_Flip(ecran);
}
TTF_CloseFont(police);
TTF_Quit();
SDL_FreeSurface(texte_titre);
SDL_FreeSurface(texte_choix1);
SDL_FreeSurface(texte_choix2);
SDL_FreeSurface(texte_choix3);
SDL_Quit();
return EXIT_SUCCESS;
}
void ligneHorizontale(int x, int y, int w, Uint32 coul,SDL_Surface* ecran)
{
SDL_Rect r;
r.x = x;
r.y = y;
r.w = w;
r.h = 1;
SDL_FillRect(ecran, &r, coul);
}
void disque(int cx, int cy, int rayon, int coul,SDL_Surface* ecran)
{
int d, y, x;
d = 3 - (2 * rayon);
x = 0;
y = rayon;
while (y >= x) {
ligneHorizontale(cx - x, cy - y, 2 * x + 1, coul,ecran);
ligneHorizontale(cx - x, cy + y, 2 * x + 1, coul,ecran);
ligneHorizontale(cx - y, cy - x, 2 * y + 1, coul,ecran);
ligneHorizontale(cx - y, cy + x, 2 * y + 1, coul,ecran);
if (d < 0)
d = d + (4 * x) + 6;
else {
d = d + 4 * (x - y) + 10;
y--;
}
x++;
}
}
- Edité par GuillaumeTardy2 1 décembre 2020 à 8:14:57
Tu diras à ton enseignant de se mettre à jour ou d'arrêter d'enseigner. La SDL 1.2 est obsolète et n'est plus supportée depuis plus de 8 ans. Cela ne sert à rien d'enseigner des techniques obsolètes.
git is great because Linus did it, mercurial is better because he didn't.
Bon si quelqu'un retombe sur ce sujet, je viens de me rendre compte de mon erreur de débutant, en effet j'affiche les formes et le fond apres le switch/case qui affiche mon disque, evidemment des que je sors du cas ou j'ai afficher mon disque, l'idiot que je suis efface tout. En gros sur le premier code que j'ai envoyé de la ligne 35 à la ligne 46 il faut le mettre avant le while(continuer). Voila voila...
Probleme d'affichage de formes avec SDL en C
× 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.