Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1796 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Aide SDL : Problème de clic de souris... (titre modifié)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Aide SDL : Problème de clic de souris... (titre modifié)

n°1110105
Docteur_Cu​be
Posté le 06-06-2005 à 18:07:22  profilanswer
 

Salut !  
 
Je suis débutant en informatique (j'ai déjà fait (et validé ^^) un an à l'Université Joseph Fourrier de Grenoble, en Informatique). Pendant un semestre, j'ai appris le C, et j'aime bien ce langage.. Mais pendant les TP on a utilisé une librairie graphique très très basique conçue par un prof pendant sa pause café. Cette librairie ne permettait que de faire quelques figures géométriques, et d'utiliser quelques couleurs, ou encore d'obtenir les coordonnées d'un clic.  
Avec cette librairie, on devait réaliser un petit jeu.  
Le problème, c'est que c'était sur Unix, et que je n'ai pas la librairie (ils ont honte de nous la donner..). Du coup, je ne peux pas profiter de mon petit jeu chez moi, sur Windows..  
 
Est-ce que vous pourriez m'indiquer où je pourrais trouver une librairie graphique pour C, simple d'utilisation et très basique ? Et dans la foulée, pourriez-vous m'expliquer comment l'installer, sachant que j'utilise DevC++ ? (je n'ai encore jamais installé de nouvelles librairies, je ne sais donc pas faire.. Idem pour la compilation avec cette librairie : je sais faire sous Unix, mais pas pour Windows, avec DevC++).  
 
Je suis certain que pour vous ça doit paraitre super facile, mais pour moi ça ne l'est pas ^^. Ca fait un semestre que je cherche en vain une librairie graphique...  
 
Merci d'avance pour votre aide !


Message édité par Docteur_Cube le 09-06-2005 à 23:49:39
mood
Publicité
Posté le 06-06-2005 à 18:07:22  profilanswer
 

n°1110127
ritzle
Posté le 06-06-2005 à 18:25:07  profilanswer
 

SDL, c'est parfait pour toi !

n°1110152
Joel F
Real men use unique_ptr
Posté le 06-06-2005 à 18:47:33  profilanswer
 

Allegro

n°1110168
ritzle
Posté le 06-06-2005 à 19:04:28  profilanswer
 

SDL !

n°1110179
benji_100
Posté le 06-06-2005 à 19:14:11  profilanswer
 

Bah glut c'est mieux :D

n°1110236
Docteur_Cu​be
Posté le 06-06-2005 à 20:09:41  profilanswer
 

Hmm oki merci beaucoup ! Je vais chercher des infos sur les trois, et je verrai bien si j'y arrive.. Sinon, je reviendrais vous embêter un peu pour la suite ^^.

n°1110745
Docteur_Cu​be
Posté le 07-06-2005 à 11:28:15  profilanswer
 

J'ai cherché quelques infos sur SDL ! Ca a l'air pas mal, même si c'est plus compliqué que je ne le pensais... Moi je voulais juste un truc capable d'ouvrir une fenêtre graphique, tracer des rectangles, des cercles et du texte, et de récupérer les coordonnées d'un clic de souris.  
Enfin, à défaut d'un truc aussi simple, je vais devoir me lancer dans SDL (ça m'a donné envie de m'y mettre de lire tout ça ^^).  
 
Par contre, j'ai le fichier .dll, mais je ne sais pas vraiment quoi en faire, et je ne trouve pas la réponse dans la Documentation :  
- Que faire de ce fichier .dll ? (Où le mettre etc. ?)
- Comment inclure la librairie dans mes programmes C avec DevC++ ? #include "chemin d'accès\sdl.dll" ?  
- Comment compiler mon programme utilisant cette librairie avec DevC++ ?  
 
Merci beaucoup !

n°1110789
Profil sup​primé
Posté le 07-06-2005 à 11:50:56  answer
 

si je ne dis pas de betise, il doit y avoir un genre de pack plugin pour devcpp sur leur site pour avoir les libs sdl.

n°1111003
ritzle
Posté le 07-06-2005 à 13:32:07  profilanswer
 

le dll doit etre dans le dossier du prog ou dans c:\windows\ (sous windows, bien sur).
pour utiliser SDL, je copie ca dans les parametres de l'editeur de liens :  

Code :
  1. "C:\Dev-Cpp\lib\libSDL.a" "C:\Dev-Cpp\lib\libSDLmain.a"  -lmingw32 -lSDLmain -lSDL -mwindows


il faut d'abord avoir copié des fichiers dans "/lib/" et dans "/include/"
 
un programme ressemble à ceci :  

Code :
  1. if ( SDL_Init(SDL_INIT_VIDEO) < 0 )
  2.   {
  3.     exit(-1);
  4.   }
  5.  
  6.   // Attribuer une icone et un texte à la fenetre principale
  7.   SDL_WM_SetCaption( FENETRE_TITRE, FENETRE_ICONE_BMP );
  8.   SDL_WM_SetIcon( SDL_LoadBMP(FENETRE_ICONE_BMP), NULL );
  9.   // Initialiser le mode video
  10.   if( (screen = SDL_SetVideoMode( FENETRE_LARGEUR, FENETRE_HAUTEUR, FENETRE_PROFONDEUR, SDL_HWSURFACE | ((PLEIN_ECRAN==0) ? 0 : SDL_FULLSCREEN) )) == NULL )
  11.   {
  12.     FenetreLiberer();
  13.   }
  14.          //détection de touches
  15.          while( SDL_PollEvent( &event ) )
  16.          {
  17.                 switch( event.type )
  18.                 {
  19.                         //si echap, on quitte
  20.                         case SDL_KEYDOWN:
  21.                         case SDL_KEYUP:
  22.                              if( event.key.keysym.sym == SDLK_ESCAPE )
  23.                                  { quit = 1; }
  24.                              break;
  25.                        
  26.                         //test souris
  27.                         case SDL_MOUSEBUTTONDOWN:
  28.                              //clic à la position (sourisx;sourisy)
  29.                              break;
  30.                        
  31.                         //mouvement souris
  32.                         case SDL_MOUSEMOTION:
  33.                              //on enregistre les coordonnées de la souris
  34.                              get_pos_souris();
  35.                              break;
  36.                        
  37.                         //SDL_QUIT event (window close)
  38.                         case SDL_QUIT:
  39.                              quit = 1;
  40.                              break;
  41.                         default:
  42.                                 break;
  43.                 }
  44.          }

n°1111394
Docteur_Cu​be
Posté le 07-06-2005 à 16:25:47  profilanswer
 

j'ai passé l'après midi à chercher des tutoriaux et autres aides sur Internet.. Mais je n'arrive toujours pas à compiler des programmes avec SDL :  
 
J'ai collé les fichiers de SDL dans les répertoires de Dev-C++,  
j'ai crée un nouveau projet, avec par exemple l'un des programmes de test proposés dans l'archive de SDL.  
J'ai ajouté ta ligne dans les options du projet, et j'ai placé le fichier SDL.dll dans le répértoire de mon projet...  
J'ai donc normalement tout ce qu'il me faut pour compiler le programme... Mais j'obtiens toujours des erreurs :  
 

Code :
  1. In file included from C:\DEV-C_~1\Include\SDL\SDL.h:39,
  2.                  from e:\jeremie\programmation\c\sdl\essai2.c:8:
  3. C:\DEV-C_~1\Include\SDL\SDL_audio.h:97: warning: `__cdecl__' attribute directive ignored


 
Ce qui m'empèche d'executer quoi que ce soit.  
 
Alors après mille essais, mille réinstallations de Dev-C++ et autres opérations, je ne sais pas quoi faire... Dans les commentaires de tutoriaux, tout le monde fait la même chose, et dit que ça marche.. Et chez moi, ça ne marche pas...

mood
Publicité
Posté le 07-06-2005 à 16:25:47  profilanswer
 

n°1111441
Tarabiscot​e
Posté le 07-06-2005 à 16:45:15  profilanswer
 

C'est un warning et pas une erreur, ensuite pourquoi tu n'utilise pas la fonction de mise à jour de Dev-Cpp (Outils -> Nouvelle version ...) qui permet d'installer SDL (Simple DirectMedia Layer) facilement.
 
PS : Mets à jour les miroirs et utilise le deuxième (devpaks.org où tu peux télécharger directement aussi) pour avoir la dernière version de SDL.


Message édité par Tarabiscote le 07-06-2005 à 16:46:42
n°1111582
Docteur_Cu​be
Posté le 07-06-2005 à 17:44:06  profilanswer
 

Tarabiscote : j'ai fait ce que tu m'as dit. Ca m'a donc installé la version 5 (Béta) de Dev-Cpp. J'ai ensuite installé SDL comme tu m'as dit de faire..  
 
Mais depuis que j'ai cette version, je ne peux plus compiler aucun programme C ! Même pour des programmes que j'ai déjà compilé mille fois sans problèmes avec l'ancienne version, j'ai la même erreur (ou plutôt Warning ^^) :  
"Warning : Le fichier source n'a pas encore été compilé"
Pourtant, je viens de le compiler, vu que j'ai cliqué sur "Compiler et Executer (F9)"... Et c'est pourtant vrai que ça ne compile pas : habituellement, l'executable se met dans le répertoire du projet ou du fichier, mais là, il n'y est pas...  
De plus, je n'arrive pas à faire afficher la numérotation des lignes...  
 
Vous n'avez pas une methode pour faire marcher cette version de Dev-C++ correctement ?  
 
Raaa j'ai l'impression que je ne vais jamais parvenir à faire des programmes avec SDL... Je suis le roi des Newbies..


Message édité par Docteur_Cube le 07-06-2005 à 17:45:29
n°1111682
Tarabiscot​e
Posté le 07-06-2005 à 18:49:32  profilanswer
 

Bizarre, essaye de supprimer devcpp.cfg et devcpp.ini dans "C:\Documents and Settings\*Utilisateur*\Local Settings\Application Data" , il a peut être gardé ceux de la version précédente.


Message édité par Tarabiscote le 07-06-2005 à 18:50:34
n°1111717
Docteur_Cu​be
Posté le 07-06-2005 à 19:12:26  profilanswer
 

Hmm J'ai essayé : ces fichiers reviennent tous seuls en quelques secondes. Et quand je relance Dev-C++, j'ai ce message :  
 
"Confirm
There doesn't seem to be GNU Make file in PATH or in Dev-C++'s Bin path. Please make sure that you have GNU Make and adjust Bin setting or system PATH environment variable and that make setting in Compiler Option containes correct filename, otherwise you will not be able to compile anithing.
"
Et j'ai le "choix" d'appuyer sur OK.  
 
En gros, je ne sais pas trop quoi faire, et je ne sais pas d'où vient ce problème étrange.  
Je vais essayer de désinstaller et de réinstaller le logiciel... Mais je doute que ça change quoi que ce soit.

n°1111756
Tarabiscot​e
Posté le 07-06-2005 à 19:41:33  profilanswer
 

Il faut peut-être réinstaller les packages de make et gcc.

n°1111890
Docteur_Cu​be
Posté le 07-06-2005 à 21:26:48  profilanswer
 

J'ai réinstallé Dev-C++, et curieusement, je peux compiler !  
Je vais m'empresser de trouver/fabriquer un programme utilisant SDL pour tenter de le compiler..  
 
Donc avec cette nouvelle version, on peut utiliser SDL rien qu'en ajoutant la ligne  
#include "SDL.h", ainsi que le fichier SDL.dll dans le répertoire du programme ?  
Il n'y a donc plus besoins de mettre cette ligne dans les options du projet ?  
"C:\Dev-Cpp\lib\libSDL.a" "C:\Dev-Cpp\lib\libSDLmain.a"  -lmingw32 -lSDLmain -lSDL -mwindows
 
Encore merci pour votre aide ! J'epsère que je touche au but là ^^.

n°1111895
Docteur_Cu​be
Posté le 07-06-2005 à 21:32:56  profilanswer
 

Hmm bon, j'ai trouvé un programme d'exemple de SDL. J'ai ajouté la ligne  
"C:\Dev-Cpp\lib\libSDL.a" "C:\Dev-Cpp\lib\libSDLmain.a"  -lmingw32 -lSDLmain -lSDL -mwindows  
Dans le champs Linker de l'onglet Parameters des options du Projet.  
Mais ça me met une cinquentaine d'erreurs, avec notamment :  
SDL.h : no such file or directory
(du coup, toutes les fonctions de SDL ne sont pas reconnues).  
 
Raaa.. Que ce passe-t-il encore ?? Je suis maudit ?!
 
Edit : Au fait, t'avais raison à propos de gcc et make : les fichiers gcc.exe et make.exe n'étaient pas présents, et ça causait des erreurs.


Message édité par Docteur_Cube le 07-06-2005 à 21:39:58
n°1112034
Tarabiscot​e
Posté le 07-06-2005 à 23:09:18  profilanswer
 

Les .h de SDL sont dans le répertoire SDL donc soit tu fais :
#include "SDL/SDL.h"
soit tu rajoutes le répertoire SDL aux répertoires d'inclusion.
 
Sinon "C:\Dev-Cpp\lib\libSDL.a" et "C:\Dev-Cpp\lib\libSDLmain.a" sont de trop (tu fais déjà -lSDLmain -lSDL)

n°1112836
Docteur_Cu​be
Posté le 08-06-2005 à 16:07:13  profilanswer
 

S'il vous plait, aidez moi :) :  
 
A première vue, SDL est bien installée chez moi : quand je compile le programme ci-dessous, ça ne pose aucun problème :  

#include <stdio.h>
#include <math.h>
#include "SDL/SDL.h"
 
int main(int argc, char *argv[])
{
  return 0;  
}


 
En sachant que j'ai placé cette ligne (dans le doute, ya des doublons) dans le linker des Options du Projet :  

"C:\Dev-Cpp\lib\libSDL.a" "C:\Dev-Cpp\lib\libSDLmain.a"  -lmingw32 -lSDLmain -lSDL -mwindows


 
 
Si je met un printf, ou quelque fonction "normale" de C, j'ai bien les sorties redirigées dans un fichier texte dans le répertoire de mon Projet.  
Mais si je modifie mon programme comme ci-dessous :  

#include <stdio.h>
#include <math.h>
#include "SDL/SDL.h"
 
int main(int argc, char *argv[])
{
   if ( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
      return 0;
   return 0;  
}


 
Là ça ne marche plus, ça me met les 20 erreurs habituelles :  
 

Compiler: Default compiler
Building Makefile: "E:\Jeremie\Programmation\C\SDL\Essais2\Makefile.win"
Executing  make...
make.exe -f "E:\Jeremie\Programmation\C\SDL\Essais2\Makefile.win" all
gcc.exe -c main.c -o main.o -I"C:/Dev-Cpp/include"    
 
gcc.exe main.o  -o "Project2.exe" -L"C:/Dev-Cpp/lib" "C:/Dev-Cpp/lib/libSDL.a" "C:/Dev-Cpp/lib/libSDLmain.a"  -lmingw32 -lSDLmain -lSDL -mwindows  
 
C:/Dev-Cpp/lib/libSDL.a(SDL_systimer.o)(.text+0x15): undefined reference to `timeBeginPeriod@4'
 
C:/Dev-Cpp/lib/libSDL.a(SDL_systimer.o)(.text+0x1d): undefined reference to `timeGetTime@0'
C:/Dev-Cpp/lib/libSDL.a(SDL_systimer.o)(.text+0xc1): undefined reference to `timeGetTime@0'
C:/Dev-Cpp/lib/libSDL.a(SDL_systimer.o)(.text+0x17e): undefined reference to `timeBeginPeriod@4'
C:/Dev-Cpp/lib/libSDL.a(SDL_systimer.o)(.text+0x1b1): undefined reference to `timeSetEvent@20'
C:/Dev-Cpp/lib/libSDL.a(SDL_systimer.o)(.text+0x217): undefined reference to `timeEndPeriod@4'
C:/Dev-Cpp/lib/libSDL.a(SDL_systimer.o)(.text+0x226): undefined reference to `timeKillEvent@4'
C:/Dev-Cpp/lib/libSDL.a(SDL_dibaudio.o)(.text+0x1e5): undefined reference to `waveOutGetErrorTextA@12'
C:/Dev-Cpp/lib/libSDL.a(SDL_dibaudio.o)(.text+0x2be): undefined reference to `waveOutWrite@12'
C:/Dev-Cpp/lib/libSDL.a(SDL_dibaudio.o)(.text+0x38b): undefined reference to `waveOutUnprepareHeader@12'
C:/Dev-Cpp/lib/libSDL.a(SDL_dibaudio.o)(.text+0x3d4): undefined reference to `waveOutClose@4'
C:/Dev-Cpp/lib/libSDL.a(SDL_dibaudio.o)(.text+0x567): undefined reference to `waveOutOpen@24'
C:/Dev-Cpp/lib/libSDL.a(SDL_dibaudio.o)(.text+0x642): undefined reference to `waveOutPrepareHeader@12'
C:/Dev-Cpp/lib/libSDL.a(SDL_mmjoystick.o)(.text+0x305): undefined reference to `joyGetNumDevs@0'
C:/Dev-Cpp/lib/libSDL.a(SDL_mmjoystick.o)(.text+0x380): undefined reference to `joyGetPosEx@8'
C:/Dev-Cpp/lib/libSDL.a(SDL_mmjoystick.o)(.text+0x3bd): undefined reference to `joyGetDevCapsA@12'
C:/Dev-Cpp/lib/libSDL.a(SDL_mmjoystick.o)(.text+0x6c4): undefined reference to `joyGetPosEx@8'
C:/Dev-Cpp/lib/libSDL.a(SDL_syscdrom.o)(.text+0x18f): undefined reference to `mciSendCommandA@16'
C:/Dev-Cpp/lib/libSDL.a(SDL_syscdrom.o)(.text+0x1bb): undefined reference to `mciGetErrorStringA@12'
collect2: ld returned 1 exit status
 
make.exe: *** [Project2.exe] Error 1
 
Execution terminated


 
Mais si j'enlève l'argument "SDL_INIT_EVERYTHING" à la fonction SDL_Init(), ça me met bien qu'il n'y a pas assez d'argument à la fonction. Donc le compilateur reconnait cette fonction ! Alors pourquoi il me met ces erreurs que je n'arrive pas à interpréter ??  
Notez que si à la place de "EVERYTHING", je met "VIDEO" ou autre, ça me met exactement les mêmes erreurs...  
 
SDL va me rendre chêêêêêêvre.

n°1112898
Tarabiscot​e
Posté le 08-06-2005 à 16:45:34  profilanswer
 

Il te manque peut-être encore le package Windows32 API.
 
Sinon le plus simple pour être sûr que c'est pas un problème de configuration, c'est encore de faire Fichier->Nouveau->Projet->onglet Multimedia : et de choisir SDL (normalement vers le bas).
 
Il devrait ainsi te créer un projet correctement configuré pour SDL.

n°1112952
Docteur_Cu​be
Posté le 08-06-2005 à 17:12:28  profilanswer
 

Lol, en effet, je ne connaissais pas cette manip. pour créer directement un projet configuré pour SDL... Et grâce à toi, ça marche ! Mille mercis !  
A première vu, il manquait un truc dans les options du projet, ce qui empèchait la compilation.. Maintenant, je ferai toujours comme ça pour configurer mes projets. Je n'ai plus qu'à tester un peu !  
 
Problème résolu !! (enfin, j'espère...).  
 
Je remercie tout ceux qui m'ont aidé !

n°1114086
Docteur_Cu​be
Posté le 09-06-2005 à 14:56:59  profilanswer
 

EDIT : Problème résolut !! Il manquait un "2" à un endroit, à ça faisait tout foirer ! Deux heures de recherches pour ça... Excusez moi du dérangement... lol..  
Je laisse quand même mon message, mais bon, inutile de vous lancer la comprehension de mon programme.  
Par contre, vous pouvez me répondre pour la dernière question que j'ai posé, si ça ne vous embête pas ^^. Car elle, elle reste sans réponse..

 
Haha, ça fait plaisir de pouvoir enfin faire des programmes avec SDL !  
Je trouve quand même que c'est pas facile.. La documentation officielle n'est pas abordable pour un débutant, aucun exemple n'est complet et prêt à l'emploi, et il faut beaucoup de prérequis : les rédacteurs de cette documentation supposent qu'on connait déjà d'autres librairires graphiques...  
 
Et c'est un peu la même chose sur Internet, dans les différents tutoriaux... Il n'y a rien pour les débutants, ceux qui comme moi n'ont jamais fait plus que quelques petits programmes en C mal programmés.  
Par exemple, tout le monde parle de "Threads", mais j'ai vu nul part la traduction, ou une explication de ce terme...  
 
 
Et donc, ça explique que je rame un peu...  
J'ai évidement commencé par modifier le programme de base qu'ils nous proposent dans Dev-C++, en y ajoutant deux ou trois fonctionnalités. Ceci m'a conduit à créer une grille 10*10. Jusqu'ici pas de problème..  
Mais les ennuis ont commencés quand j'ai voulu colorer les cases sur lesquelles ont a cliqué.  
J'ai donc crée un tableau 10*10, initialisé à 0. A chaque fois qu'il y a un clic de souris, je relève ses coordonnées, et je calcule les "coordonnées" en nombre de cases de la grille. De là, je met à jour mon tableau (1 dans les cases cliquées).  
Dans la fonction qui se charge de dessiner dans la fenêtre, je lis le tableau, et dès que je trouve un 1, je colore la case.  
 
Ca parait facile comme ça... Mais quand ont ne connait aucune des fonctions qu'on utilise,  
quand le fait de déplacer un peu la fonction "draw" change totalement les évènements (une case colorée suit la souris au lieu de rester en place là où on a cliqué..).  
Ou quand on clique, et que la case ne se colore pas au bon endroit, alors que le programme est juste, ça pose des problèmes...  
 
Donc je fais une fois de plus appel à votre immence savoir (je vous passe la pomade pour être certain que vous lirez mon code ^^), à propos des problèmes suivants :  
- quand on clique sur la grille, ce ne sont pas forcéments les bonnes cases qui se colorent......  
- pourquoi, si je déplace la fonction "draw" pour la mettre après le switch, une case noire suit le curseur de la souris (au ralentit..)
- pourquoi je ne peux pas faire une fonction à part, permettant de colorer les cases (pour séparer le dessin de la grille de la coloration des cases) : j'ai essayé, et ça fait bugguer l'execution... Est-ce qu'il y a une manip spéciale pour que deux fonctions puissent dessiner sur la grille ?  
 
 
Voila ! Vous trouverez le programme executable, ainsi que la source dans le lien ci-dessous.  
(Désolé pour la qualité du code, c'est vraiment brouillon, même si c'est commenté..)  
http://dr.cube.free.fr/Cubenergy/Grille.zip
Merci d'avance pour votre précieuse aide !


Message édité par Docteur_Cube le 09-06-2005 à 15:20:12
n°1114212
ritzle
Posté le 09-06-2005 à 15:48:55  profilanswer
 

moi, ca m'ouvre une fenetre avec le fond noir et c'est tout...
mais ca plante pas.
 
EDIT : Quand je clique dans la fenetre ca m'affiche ta grille, mais ca noircit pas les cases où y'a le curseur...


Message édité par ritzle le 09-06-2005 à 15:53:54
n°1114228
Docteur_Cu​be
Posté le 09-06-2005 à 16:01:34  profilanswer
 

http://dr.cube.free.fr/Cubenergy/Project3.exe
 
Tiens, voici la mise à jour de l'executable.  
Oui, au départ, ça commence avec un fond noir, parce que le programme attend un clic avant de dessiner la grille.. C'est tout simplement parce que je n'arrive pas à créer deux fonctions séparées pouvant dessiner : avec deux fonctions séparées, l'une dessinerait la grille sans se soucier des clics, et l'autre se chargerait de prendre en paramettre un clic, et de mettre à jour la coloration des cases, sans se soucier de la grille.. Dans ce cas, je ne serais pas obligé d'attendre un clic pour afficher les dessins... Mais je n'y arrive pas encore..  
 
A ce propos, il faut que je trouve comment mettre à jour seulement une partie de la fenetre, et non toute la fenetre.. J'ai lu que c'était possible, mais je ne sais pas encore comment..  
Dans le même odre d'idées, je n'arrive pas encore à afficher des images provenant d'un répertoire.. Le code que j'ai trouvé ne marchait pas, et ça affichait un fond noir seulement.. Mais bon, à force de recherches, je vais finir par y arriver !

n°1114241
Tarabiscot​e
Posté le 09-06-2005 à 16:04:32  profilanswer
 

T'as essayé d'utiliser SDL_UpdateRect(screen, 0, 0, 0, 0); à la place de SDL_Flip (screen); ?
 
(après tu peux ne l'utiliser que sur la zone que tu modifies ça permet d'aller un peu plus vite).
 
PS : Tu trouves pas que c'est redondant d'avoir deux event dont le premier qui ne sert à rien.


Message édité par Tarabiscote le 09-06-2005 à 16:07:40
n°1114254
ritzle
Posté le 09-06-2005 à 16:10:21  profilanswer
 

Tarabiscote a écrit :

T'as essayé d'utiliser SDL_UpdateRect(screen, 0, 0, 0, 0); à la place de SDL_Flip (screen); ?
 
(après tu peux ne l'utiliser que sur la zone que tu modifies ça permet d'aller un peu plus vite).
 
PS : Tu trouves pas que c'est redondant d'avoir deux event dont le premier qui ne sert à rien.


memes remarques

n°1114275
ritzle
Posté le 09-06-2005 à 16:17:27  profilanswer
 

tes printf() dans stdout.txt c'est bien pour le debugage mais c'est lassant :heink:  
 
tu mettre l'interpretation des touches dans " while (SDL_PollEvent (&event)) " et pas à l'extérieur. Et au lieu d'attendre qu'il se produise quelque chose avec "SDL_WaitEvent(&event2);" (je pense que ca sert a ca), il vaut bien mieux que tu fasse tourner la boucle principale en permanence, et qu'a chaque fois tu demande si quelque chose s'est passé (c'est ce que je ferais). ca t'éviterais aussi l'histoire du premier clic

n°1114317
Tarabiscot​e
Posté le 09-06-2005 à 16:27:36  profilanswer
 

Euh non pour la boucle, c'est bien comme ça qu'il faut faire, SDL_WaitEvent permet de ne pas occuper inutillement les ressources tant que l'on n'interagi pas avec la fenêtre.
La seule chose c'est que tout ça :

       SDL_Event event;
 
        /* Check for events */
        while (SDL_PollEvent (&event))
        {
            switch (event.type)
            {
            case SDL_KEYDOWN:
                break;
            case SDL_QUIT:
                done = 1;
                break;
            default:
                break;
            }
        }

n'est jamais utilisé donc il peut l'enlever. (il peut mettre le "done = 1; break ;" à la place de "exit(0);" s’il préfère avec le 2e event).
 
PS : Pour le premier click s'il utilise SDL_UpdateRect, et qu'il affiche la grille avant il ne devrait pas y avoir de problèmes.


Message édité par Tarabiscote le 09-06-2005 à 16:38:37
n°1114576
Docteur_Cu​be
Posté le 09-06-2005 à 17:58:22  profilanswer
 

Merci beaucoup pour ces conseils ! J'essaye tout ça d'ici ce soir !  
 
Par contre, pour le SDL_UpdateRect(screen, 0, 0, 0, 0); j'ai lu que ça ne s'utilisait qu'en buffering simple, et moi je suis en double buffering.. Donc, est-ce que je suis obligé d'utiliser SDL_Flip (screen); ?  
 
J'ai tenu compte de vos conseil, et j'ai enfin réussis à créer une autre fonction dessiant elle aussi à l'écran. J'ai donc fait une fonction DessinInit() qui dessine la grille, avant d'entrer dans la boucle principale. J'ai aussi enlevé les printf qui ne servent plus à rien.  
J'ai aussi supprimé la partie que Tarabiscote cite dans son dernier message.  
 
Prochaine étape : supprimer event, apprendre à afficher du texte et des images. Dès lors, je serai au point pour faire mon premier projet (le jeu dont je parle dans mon premier message).  
 
Par contre, en double buffering, il n'y a pas moyen de n'actualiser qu'une partie de l'écran ? On est obligé de tout libérer d'un coup, et donc de tout redessiner ? Ca peut être chiant par moments, et ça peut faire clignoter l'écran ^^. Mais j'imagine qu'en buffering simple, ça doit ramer dans l'affichage, sinon, le double buffering n'existerait pas..

n°1114609
ritzle
Posté le 09-06-2005 à 18:24:34  profilanswer
 

Docteur_Cube a écrit :


Par contre, en double buffering, il n'y a pas moyen de n'actualiser qu'une partie de l'écran ? On est obligé de tout libérer d'un coup, et donc de tout redessiner ? Ca peut être chiant par moments, et ça peut faire clignoter l'écran ^^. Mais j'imagine qu'en buffering simple, ça doit ramer dans l'affichage, sinon, le double buffering n'existerait pas..


tiens, je croyais justement que ca servait à ne pas faire clignoter l'écran...

n°1114610
Tarabiscot​e
Posté le 09-06-2005 à 18:25:34  profilanswer
 

Sinon les 4 derniers paramètres de SDL_UpdateRect servent justement à ne mettre à jour qu'une partie.
Petit exemple, si tu affiches un carré comme ça :

    rect.w = 60;
    rect.h = 60;
    rect.x = X*60;
    rect.y = Y*60;
    SDL_FillRect (screen, &rect, color);

Tu peux ne rafraîchir que ton carré comme ça :

    SDL_UpdateRect(screen, X*60, Y*60, 60, 60);


Message édité par Tarabiscote le 09-06-2005 à 18:27:24
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Aide SDL : Problème de clic de souris... (titre modifié)

 

Sujets relatifs
Aide pour un site sous SPIPprobleme avec firefox
problème dans un jeu de Pendu[HTML] Problème quand on réduit la fenêtre...
Problème de date et locale[PERL] Aide SVP pour recharger un script perl
Probleme doublon relationProblème de connexion à une base de données
probleme d'enregistrementErreur sur page PHP (besoin d'aide)
Plus de sujets relatifs à : Aide SDL : Problème de clic de souris... (titre modifié)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR