Salut à tous !
Cette fois je vais essayer de ne pas me planter en postant
Je poste ici afin de présenter un petit projet sur lequel je travaille, en amateur, sur mon temps libre. Il s’agit d’un wrapper C++ (C++14, tant qu’à faire) pour la SDL. A la base je le fais surtout pour moi, mais je me dis que d’une part, ça peut peut-être aider de le partager (sait-on jamais), et que ça me permettra de recueillir quelques avis. N’hésitez donc pas à me faire part de toute remarque. (Je ne bosse pas beaucoup dessus donc les updates seront par contre assez irréguliers)
Je précise que je me remets doucement au C++ (je dirais même au dev en général), et que par conséquent il risque d’y avoir quelques "petites" ( ) imperfections. Je n’ai pas la prétention de faire une lib révolutionnaire ou quoi hein
Bref.
L’idée est avant tout de ne pas avoir à se soucier de la gestion de la mémoire, mais accessoirement de pouvoir garder une certaine compatibilité avec la SDL C. A cet effet, la plupart des entités proposées par le wrapper est implicitement convertible vers son équivalent C. Exemple :
1 2 3 4 5 6 | void foo(SDL_Window *window){ // ... } // ... sdl::Window window{"My Window", sdl::Size{500, 500}}; foo(window); // Ok ! |
L’approche OO
GUI
Il est tout à fait possible de partir de zéro avec ce wrapper, en faisant ça en orienté objet. Pour la partie affichage, sdl::Window
peut tout à fait faire le travail :
1 2 3 4 | sdl::Window window{"My Window", sdl::Size{500, 500}}; sdl::Surface surface{sdl::load_bmp("image.bmp")}; // Lèvera une exception si problème // ... window.blit(surface, sdl::Point{50, 50}); |
Evénements
Concernant la gestion des événements, il y a une petite toolbox :
1 2 3 4 5 6 7 8 9 10 | // Gestionnaire d'événéments sdl::EventHandler handler; auto& mouse_handler = handler.get<sdl::MouseStateHandler>(); auto& keyboard_handler = handler.get<sdl::keyboardStateHandler>(); // Binding d'événements : handler.on_press(sdl::KeyCode::A, [](){ std::cout << "Key A pressed" << std::endl; }); // Et dans la main loop : handler.update(); // Va appeler sdl::MouseStateHandler::update() et sdl::KeyboardStateHandler::update() |
(Derrière tout ça il y a un ECS qui tourne, qu’il est peut-être possible d’utiliser pour d’autres choses, genre gestion de scènes par exemple ?)
Audio
Pour tout ce qui touche à l’audio… je le ferai peut-être un jour
Autres
Il reste encore la gestion du texte et plein d’autres trucs, ça sera fait quand je prendrai le temps nécessaire, je n’oublie pas
L’approche classique
Comme évoqué précédemment, certaines entités SDL ont leur équivalent dans ce wrapper :
Voici les entités disponibles façon SDL C et leur équivalent dans le wrapper :
SDL C | Wrapper |
---|---|
SDL_Color |
sdl::Color |
SDL_Point |
sdl::Point |
SDL_Rect |
sdl::Rect |
SDL_Surface* |
sdl::Surface |
SDL_Texture* |
sdl::Texture |
SDL_Window* |
sdl::Window |
Il est ainsi possible de les utiliser dans un code SDL classique, car comme évoqué précédemment, chaque classe du type sdl::Color
, sdl::Point
, … est implicitement convertible vers SDL_Color
, SDL_Point
, etc.
Conclusion
Voilà, en (très) gros l’idée du projet. C’est actuellement en plein chantier (je n’ai pas énormément de temps à y consacrer), mais je souhaiterais avoir des avis sur le code, et éventuellement (sûrement même ^^) pouvoir revoir certaines parties. N’étant pas un expert (loin de là), je suis sûr qu’il y a beaucoup à dire sur le sujet. Parallèlement à cela, j’ai espoir que ça puisse servir à ceux qui aimeraient utiliser la SDL en C++. Mais bon, je pense qu’en l’état, c’est encore un peu trop limité pour être réellement utile.
En attendant, merci d’avoir eu la patience de lire ce post !