Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: TMX Lib  (Lu 3996 fois)

0 Membres et 1 Invité sur ce sujet

aquemy

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
    • E-mail
TMX Lib
« le: Septembre 21, 2012, 05:28:04 pm »
Bonjour à tous,

Je vous présente ici un projet qui n'est, à la base, pas directement relié à la SFML, mais dont les aboutissements concernent largement les utilisateurs de la SFML.
La présentation qui suit est largement un copié / collé de celle du SDZ, veuillez donc m'excuser pour le manque d'originalité.

Voici donc TMX Lib, une librairie pour le chargement de cartes au format TMX.

Présentation de Tile Map Editor et critique des outils existants


Tiled Map Editor, à mon sens l'éditeur le plus complet que l'on puisse trouver sur Internet. Il gère les cartes isométriques, orthogonales, autant de couches que l'on veut, des couches de "tiles" ou d'objets, avec des placements sur grille ou non. Il y a la possiblité de générer aléatoirement une carte, de créer des regroupements d'objets, des zones selons des formes géométriques prédéfinies ou des formes personnalisées ainsi qu'ajouter des propriétés à tous les éléments cités précédemment. Cerise sur le gateau, les cartes sont au format XML et les données relatives aux couches au format XML, CSV, BASE64 (avec encodage ZLIB ou GZIP).

Bref, de quoi pondre de très belles cartes. Tiled Map Editor est d'ailleurs utilisé dans bon nombre de jeux commerciaux plus ou moins connus. Citons par exemple Rope the Frog de Wendytech.

Une fois les developpeurs convaincus de l'utilité d'un tel logiciel, se pose la question de l'intégration au projet. Et oui, il faut parser le XML, le CSV et d'autres formats afin de pouvoir utiliser tout le potentiel du logiciel. C'est une tâche souvent pénible, et les bibliothèques présentes pour charger les cartes au format TMX sont souvent très incomplètes ou utilisent des dépendances discutables.

En effet, la plupart du temps, ces librairies dépendent directement d'une bibliothèque de rendu graphique (SDL voire Qt assez souvent, pour le C et C++) ou alors font des suppositions sur l'utilisation qui sera faite de telle ou telle fonctionnalité proposée et brident ainsi les possibilités de TMX Tile Editor.

(Et d'un point de vue technique, pas de système de build, pas de tests ou d'exemples, etc.)

Généralités et avancement

TMX Lib est très jeune mais propose la plupart des fonctionnalités utiles pour qu'elle soit utilisée.

Voici un résumé des possibilités ou caractéristiques :
  • Chargement des cartes au format TMX :
    • Prise en charge du XML
    • Prise en charge du CSV
       
  • Décodage Base64
  • Compression ZLIB & GZIP
  • Module CMake pour résoudre les dépendances à TMX Library en claquant des doigts
  • Accesseurs pour créer son wrapper
  • Pas de format imposé. Des champs peuvent être vide, TMX Lib épouse parfaitement la souplesse de Tiled Map Editor.

C'est ici qu'intervient TMX Lib en proposant tout ce qu'il faut pour charger n'importe quelle map, et créer très facilement son wrapper pour l'utiliser dans son propre moteur de rendu utilisant la SDL ou la SFML par exemple !

Les objectifs sont simples. Fournir une bibliothèques fiables et évolutive permettant à tous d'utiliser facilement Tiled Map Editor ou en tout cas du format TMX pour ses propres projets et ainsi gagner du temps pour se focaliser sur l'important.

La liste des tâches à faire et fonctionnalitées à ajouter :
  • Un jeu de tests exhaustifs
  • Chargement multi-thread
  • Chargement des cartes depuis un emplacement mémoire et non physique
  • Move semantic pour un wrapper sans empreinte
  • Utilisé au mieux l'héritage de conteneurs standards pour une interface intuitive
  • Fournir plus d'exemples d'utilisations, et même un wrapper avec la SDL

Pourquoi TMX Lib ?
Simplicité & flexibilité

TMX Lib est simple et flexible. Elle s'occupe simplement de charger en mémoire toutes les données relatives à la carte spécifiée.
Elle est simple dans le sens où elle propose peu de fonctionnalités et flexible car son design lui permet de facilement évoluer avec les changements du format TMX sans risque de cassage de rétrocompatibilité.

Des technologies choisies

Un des problèmes que j'ai rencontré avec d'autres librairies de chargement de fichiers au format TMX est les dépendances et le choix des technologies pas très judicieux. TinyXML est lourd, peu pratique et propose une interface peu commode.

TMXLib se base au contraire sur Boost, librairie éprouvée et proche du standard, que la plupart des gens ont sur le ordinateur ou, à défaut, peuvent trouver dans les dépôts de leur distribution. Boost est également portable.
La dépendance à Boost s'effectue d'une part sur la lecture du XML, reposant elle même sur une toute petit bibliothèque très bien optimisée (dont j'ai oublié le nom :-°) et d'autre part, sur les regex, utilisés à un endroit de manière temporaire.

De manière temporaire car le choix a été fait de développer avec le nouveau standard. Ainsi TMXLib est développé en C++11, avec le lot de nouveautés que cela comprend : move semantic pour éviter la recopie d'objet lors de la création d'un wrapper, expressions régulières pour le parsage de fichiers CSV, threads standard pour un chargement multithread, etc.

Ajoutons à cela que TMXLib intègre un système de build robuste et agréable grâce à CMake (ce qui me permet de faire de l'intégration continue et de garantir une certaine qualité :-°).

Enfin, je prévoie, car Boost est tout de même une dépendance lourde, d'abstraire le parser pour permettre d'utiliser n'importe quel parseur XML. Ce n'est pas la priorité mais ça sera fait dans pas trop longtemps. :D

Licence CeCILL

C'est la partie chiante, mais ça vaut le coup de le préciser.
TMXLib est distribué sous licence CeCILL, qui est une licence logiciel libre contaminante. En cela, il est interdit d'utiliser TMXLib dans des projets à des fins commerciales et toute personne l'utilisant dans son projet ne peut le vendre et est dans l'obligation de publier son code sur demande. Voila en gros. :)

Téléchargement

GitHub

Vous pouvez trouver TMXLib à l'adresse suivante :
https://github.com/aquemy/TMXLib

Quelques statistiques sont fournies par Ohloh :
https://www.ohloh.net/p/TMXLib

Installation

J'ai eu un peu la flemme d'écrire (pour le moment) le guide d'installation. Voici donc rapidemment, en console, à partir du moment où vous être dans le repertoire racine du projet :

mkdir build && cd build
cmake ..
make


C'est tout. La librairie est dans /build/lib et vous trouverez les tests dans /build/tests et les exemples dans /build/examples. Qui a dit qu'il n'y avait qu'un test (et encore :-°) et un exemple ? Je l'avais pourtant marqué sur la TODO list, mais vous avez pas lu, avouez ! :lol:

Exemple avec la SFML
Compiler l'exemple

Les source sont disponibles dans le dépôt, dans le répertoire /examples/SFML.
Pour compiler, il vous faudra évidemment la SFML installée, ce que se charge de vérifier le fichier CMake et comme le reste du projet ne dépend pas de la SFML, il faudra également spécifier à CMake que vous voulez compiler l'example SFML.

cd build
cmake .. -DSFML_EXAMPLE=true
make -j


Utiliser l'exemple

Finalement, cet exemple s'apparente à un visualiseur basique de cartes grâce à la SFML.
Ainsi, pour visualiser une carte au format tmx, il faudra passer le chemin de la carte par l'entrée standard. L'exécutable est fourni avec une carte en exemple, et le tileset qui va avec.

cd build/examples/SFML
./tmxExample ressource/map.tmx


Voici la liste des commandes disponibles :
  •     Z Q S D : Déplacement
  •     A E : Rotation
  •    + - : Zoom et dézoom
  •    0 ... 9 : Active / Désactive la visibilité d'un calque

Quelques explications

Le code est minimal. Pas d'encapsulation par exemple. Pire, l'exemple avec la SFML ne gère que les cartes avec un unique tileset, même si je compte y reméder au plus vite. Enfin, ce n'est pas du tout optimisé au niveau de l'affichage.
C'était juste pour montrer qu'il était très simple de créer son wrapper.

Et un petit screen depuis chez moi :
http://ompldr.org/vZmt2Yw

 

anything