Aide SDL : Problème de clic de souris... (titre modifié) - C - Programmation
Marsh Posté le 06-06-2005 à 20:09:41
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 ^^.
Marsh Posté le 07-06-2005 à 11:28:15
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 !
Marsh Posté le 07-06-2005 à 11:50:56
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.
Marsh Posté le 07-06-2005 à 13:32:07
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 :
|
il faut d'abord avoir copié des fichiers dans "/lib/" et dans "/include/"
un programme ressemble à ceci :
Code :
|
Marsh Posté le 07-06-2005 à 16:25:47
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 :
|
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...
Marsh Posté le 07-06-2005 à 16:45:15
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.
Marsh Posté le 07-06-2005 à 17:44:06
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..
Marsh Posté le 07-06-2005 à 18:49:32
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.
Marsh Posté le 07-06-2005 à 19:12:26
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.
Marsh Posté le 07-06-2005 à 19:41:33
Il faut peut-être réinstaller les packages de make et gcc.
Marsh Posté le 07-06-2005 à 21:26:48
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à ^^.
Marsh Posté le 07-06-2005 à 21:32:56
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.
Marsh Posté le 07-06-2005 à 23:09:18
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)
Marsh Posté le 08-06-2005 à 16:07:13
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> |
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> |
Là ça ne marche plus, ça me met les 20 erreurs habituelles :
Compiler: Default compiler |
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.
Marsh Posté le 08-06-2005 à 16:45:34
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.
Marsh Posté le 08-06-2005 à 17:12:28
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é !
Marsh Posté le 09-06-2005 à 14:56:59
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 !
Marsh Posté le 09-06-2005 à 15:48:55
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...
Marsh Posté le 09-06-2005 à 16:01:34
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 !
Marsh Posté le 09-06-2005 à 16:04:32
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.
Marsh Posté le 09-06-2005 à 16:10:21
Tarabiscote a écrit : T'as essayé d'utiliser SDL_UpdateRect(screen, 0, 0, 0, 0); à la place de SDL_Flip (screen); ? |
memes remarques
Marsh Posté le 09-06-2005 à 16:17:27
tes printf() dans stdout.txt c'est bien pour le debugage mais c'est lassant
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
Marsh Posté le 09-06-2005 à 16:27:36
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; |
n'est jamais utilisé donc il peut l'enlever. (il peut mettre le "done = 1; break ;" à la place de "exit(0);" sil 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.
Marsh Posté le 09-06-2005 à 17:58:22
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..
Marsh Posté le 09-06-2005 à 18:24:34
Docteur_Cube a écrit : |
tiens, je croyais justement que ca servait à ne pas faire clignoter l'écran...
Marsh Posté le 09-06-2005 à 18:25:34
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; |
Tu peux ne rafraîchir que ton carré comme ça :
SDL_UpdateRect(screen, X*60, Y*60, 60, 60); |
Marsh Posté le 06-06-2005 à 18:07:22
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