Expeditions: Samurai veut révolutionner le RPG tactique avec une aventure entièrement jouable en coop
Salut !
Je viens d'installer CSFML et j'aimerais bien tester pour voir si ca compile bien. Je veux pas programmer avec SFML car je ne connais pas encore le C++ qui est complexe et que j'aimerais utiliser mes connaissances en C pour faire un petit jeu ou un prototype.
Je veux donc du coup compiler le tutoriel avec la balle qui est présent sur le site, pour voir si tout fonctionne bien. J'adapte donc le code en remplacant les hpp par h et en consultant la documentation pour certaines fonctions et les modifier si nécéssaire.
Voici à ce que j'arrive :
int main()
{
sfWindow * window;
sfShape * shape;
window = sfWindow_create(sfVideoMode(200, 200), "SFML works!");
shape = sfCircleShape_create(100.f);
sfShape_setFillColor(shape, sfColor sfGreen);
while (sfWindow_isOpen(window))
{
sfEvent event;
while (sfWindow_pollEvent(window, event))
{
if (sfEventType == sfEvtClosed)
sfWindow_close(window);
}
sfWindow_clear(window);
sfWindow_draw(shape);
sfRenderWindow(window);
}
return 0;
}
Malgré cela, j'obtiens énormément d'erreurs. Est ce que CSFML est fort différent de la SFML normale ? Par exemple j'ai cru comprendre que dans certaines fonctions il fallait donner plus d'arguments que celles dans la SFML normale (il faut donner le nombre de bit par pixel pour sfVideoMode par exemple). Est ce réellement nécéssaire ?
J'aimerais bien que quelqu'un de fortement expérimenté avec la CSFML corrige mon programme, après quoi je pourrais avoir au moins un bonne set up avec mon IDE et je pourrais réellement commencer à apprendre
Les erreurs du build:
main.c:5:30: error: expected expression before 'sfVideoMode'
main.c:5:30: error: too few arguments to function 'sfWindow_create'
main.c:6:5: error: too many arguments to function 'sfCircleShape_create'
main.c:7:33: error: expected expression before 'sfColor'
error: incompatible type for argument 2 of 'sfWindow_pollEvent'
error: expected expression before 'sfEventType'
error: storage size of 'window' isn't known
(PS: En fait je viens de terminer un livre sur le C avec ses exercices et j'ai également concu plusieurs programmes utilisant les différentes notions du C (structures, fichier, pointeur, adresses, tableaux) donc je voulais utiliser mes connaissances et faire un tout petit jeu vidéo (genre un personnage qui se balade, avec une detection de collision pas trop compliquée vue de haut, et qui doit par exemple résoudre des énigmes ou battre des monstres (ca deviendrait plus compliqué du coup puisqu'il faudrait du path-finding) ou alors un pong ou un snake). Bref je veux faire un petit jeu vidéo et je me disais que SDL était trop vieux et plus compliqué, et comme je ne veux pas encore apprendre le C++ (qui a également des notions compliquées (à part l'esprit POO, les vecteurs et le meta-programming ca doit un peu différer du Java (je viens du Java que j'ai appris à l'unif), je me disais que j'allais utiliser le binding C pour la SFML, si vous avez un conseil à me donner (C++ et SFML, C et SDL ou C et CSFML), je suis preneur).
Mais euh j'ai pas tout lu, mais euh... Sfml prend en charge aussi le C hein pourquoi t'embêter et prendre une dérivation alors que son original le fait excellement ?
Je demande de l'aide à des utilisateurs de CSFML expérimentés, pourquoi réponds tu ? Tu ne sais meme pas que la lib SFML "normale" ne supporte que le C++, je parle du binding officiel C, aka CSFML...
Il te donne une porte de sortie au cas où, disons, aucun utilisateur de csfml expérimenté ne se présenterait ici (et Dieu sait que c'est probable, on n'en entend jamais parler ici
)
J'en rajoute une couche en disant que le c++, lorsqu'on n'utilise pas trop ses fonctionnalités avancées, peut beaucoup ressembler au C. ![]()
Apparemment, la librairie CSFML n'est pas un port simple de la SFML pour C (càd qu'il suffit pas de créer des pointeurs sur des structures, remplacer les :: par des _, regarder la doc pour le changement de noms des fonctions (même si c'est souvent presque la meme chose) et utiliser des fonctions pour créer ces-dites structures (comme ici par exemple ici, pour créer un cercle:
sfShape * shape;
shape = sfCircleShape_create(100.f);
(à noter que c'est peut etre parce que j'utilise une adresse qui n'est pas safe (càd égale à NULL) et donc qu'il faut que je l'alloue avec malloc() mais je doute qu'on doive le faire soi meme et je pense que les fonctions gèrent ca). On dirait que le port vers le C est plus complexe et que certaines fonctions nécéssitent plus de paramètres par rapport à sa version en C++...
Quelqu'un d'expérimenté avec CSFML pour confirmer ou regler mon probleme ?
Merci d'avance
Mais c'est stupide d'utiliser une librairie C++ sans avoir appris le C++ et d'utiliser des objets de cette dite librairie dans ce langage sans rien y comprendre (même si je comprends quand même la POO puisque je viens de Java) : je veux pas faire du code hybride, à moitié avec des structures et à moitié à appeler des fonctions et des objets d'une librairie C++ (je ne veux pas me risquer à faire des classes alors que je n'y connais strictement rien !).
Une autre solution ? Je suis persuadé que le port CSFML peut bien fonctionner (j'ai trouvé des jeux fait en CSFML), j'ai juste besoin de quelqu'un qui sait peut etre mieux s'y retrouver dans la documentation (d'autres utilisateurs en ligne ont dit qu'elle était moins claire par rapport à la SFML) et voire peut etre quelle fonction ou structure j'ai mal initalisé.
J'ai jamais fait de CSFML mais la logique doit pas être bien différente de SFML. J'ai fait une petite recherche j'ai pas trouvé de doc en ligne mais j'ai vu que le projet est documenté par doxygen, un make doc devrait te générer la documentation. Sinon tu peut toujours regarder les .h.
Quelques conseils pour tes erreurs:
main.c:5:30: error: expected expression before 'sfVideoMode':
sfVideoMode est sans doute une structure, soit il existe une fonction qui en crée une soit il faut que tu déclare une variable de type sfVideoMode et remplisse les champs.
main.c:5:30: error: too few arguments to function 'sfWindow_create'
main.c:6:5: error: too many arguments to function 'sfCircleShape_create'
error: incompatible type for argument 2 of 'sfWindow_pollEvent'
Regarde la doc ou les .h pour voir ce que prends comme arguments ces fonction. Par exemple j'ai vu que sfWindow_create prends un mode, un title mais aussi un style et un settings. Contrairement au C++ il n'y a pas d'arguments par défaut en C, il faut spécifier touts les arguments.
main.c:7:33: error: expected expression before 'sfColor' :
enlève sfColor, c'est le nom du type.
error: expected expression before 'sfEventType'
ça doit être un truc comme event.type, regarde la structure sfEvent.
Sinon comme tu a déjà fait du Java la structure C++ de SFML ne devrait pas te poser trop de problèmes, ça reste assez simple et intuitif. Surement plus que la CSFML en tout cas.
"Je demande de l'aide à des utilisateurs de CSFML expérimentés, pourquoi réponds tu ?"
On voit que tu viens du forum programmation toi ...
.
Oui, j'avais pas bien lu la documentation, en même temps pas facile de s'y retrouver et pas du tout claire, de plus ce n'est pas juste un port puisqu'il a changé les fonctions et rajouté des choses etc etc (window/renderwindow, fonctions avec plus d'arguments, etc etc).
http://pastebin.com/qrCB1XHn
Dernière version du code, la seule chose qu'il me manque c'est : Comment afficher mon CircleShape SANS faire de sf Render States * ? Car je ne veux pas de Blend/Shader/Transform etc...
C'est le dernier truc à regler. Si quelqu'un a une idée..
Merci
Alors déjà, tu as bien raison de ne pas te lancer dans la SFML si tu ne connais pas bien le C++, y'a pas mal de gens qui font cette erreur et le résultat est souvent minable et font perdre du temps à plein de gens sur les forums avec des erreurs qui n'ont rien à voir avec la SFML mais avec leur manque de connaissance du C++.
Ensuite, je ne suis pas un expert de la CSFML (et ouai encore un :D ) mais utilisateur de la SFML en C++. Et si tu ne veux pas de sf::RenderState tu peux passer NULL comme argument.
sfRenderWindow_drawCircleShape(renderwindow, shape, NULL);
Tu peux aussi le faire pour les ContextSettings de la RenderWindow, car souvent OSEF.
Y'a pas de fonction _create() à la place de tes malloc ? Oublie pas de tout _destroy et de free tes malloc à la fin.
Tu peux te passer de malloc pour ton event :
sfEvent event;
while (sfRenderWindow_pollEvent(renderwindow, &event))
Et pour finir, non la SDL n'est pas trop vieille et une nouvelle version va sortir et est déjà utilisable. Je ne sais pas ce qu'il en est de la SDL 2.0 mais le problème avec CSFML c'est que ça manque de documentation, c'est juste un binding, et ça peut être pénible de traduire le code source C++ / SFML en C / CSFML. Alors que pour la SDL la plupart des tutoriaux, exemples, etc. seront déjà en C.
Enfin en tout cas CSFML a l'air un peu chiante à utiliser.
Voici le programme sans erreurs ou warning.
J'avais juste du mal à lire la documentation qui est pas hyper claire
http://pastebin.com/KmBbFKgg
Il crash encore. :/
(Pour la correction, pour le RenderStates si on utilise NULL ca crée des options par défaut (comme tu le dis) (il fallait le savoir), et j'oubliais de free() mes malloc() tellement je suis distrait.)
Oui je trouve ac très pénible et je m'attendais à pouvoir utiliser les tuto de la version C++ facilement sans encombre mais c'est bien différent et plus chiant à utiliser
Le truc c'est que SFML a l'air de tout bien gérer comme il faut et de faciliter la tache sans à devoir utiliser FMOD ou des autre lib réseau avec SDL, et tout à l'air plus optimisé et plus facile à lire.
Je pense que je vais lire un livre C++ et utiliser SFML plus tard.
Merci quand même (et si vous pouvez me dire d'ou vient le crash parce qu'avec aucune erreur/warning...) ![]()
Pas bête pour les destroy, mais même en mettant:
sfCircleShape_destroy(shape);
sfRenderWindow_destroy(renderwindow);
dans le (if event.type = sfEvtClosed), ca crashe encore ![]()
Je saurais pas te dire où ça plante, ça fait 10 ans que j'ai pas fait de C je crois. T'as mis les DLL où il faut ? Essaie de faire une exécution pas à pas.
Sinon dans le tutoriel officiel le constructeur de CircleShape, prends le radius en paramètre sinon il est = à 0, dans ton code y'a rien dans ton _create. Donc file lui un radius pour que tu vois un cercle au moins quand ça marchera. :p
Sinon y'a cet exemple sur github :
https://github.com/LaurentGomila/CSFML/blob/master/doc/mainpage.hpp
Oui j'avais oublié le radius très bien vu ! j'ai mis 100.f comme dans le tutoriel et j'ai mis mes instructions d'affichage dans la première boucle while, et mes destroy à la fin en dehors du while, mais ca marche toujours pas
http://pastebin.com/MJG5mLVc
Double post j'ai finalement réussi, pas évident, je passe direct à un livre de C++ maintenant, adieu la CSFML
Voici l'exemple du cercle en entier pour ceux que ca intéresse
(btw il faut d'abord _create PUIS _setRadius).
http://pastebin.com/3Z9jsi5k