Luabind 0.9.1 adapted to lua 5.2 beta

As you may know, lua 5.2 is going to be released very soon with new interesting features. To be able to use these features and to keep using luabind at the same time, I’ve decided to hack luabind 0.9.1 so that it supports lua 5.2 beta. Here is the link to download:

http://downloads.tuxfamily.org/bluecosmos/utils/luabind-perso.zip

(I’ve suppressed some « super » related code as I don’t need it and it’s deprecated anyway)
It works fine with me but I may have introduced bugs.

I did it for fun and I don’t intend to fork luabind or whatever. I might consider adding __index/__newindex override or help another binding library. There are a few interesting around like oolua and sbl (Simple Binding).

Utiliser une chaîne de caractère comme paramètre template C++

Le jeu repose sur une machine à état où les différents états sont identifiés par une chaîne de caractère (« Options », »Menu », »Scores » etc…). Je passais ce nom via le constructeur de la class parente ( par exemple

 COptionsState() : IGameState("Options") { } 

). Pour certaines raisons (pour le fun aussi), j’ai voulu passer ce paramètre non plus au runtime mais à la compilation via un paramètre template type template <const char* ID> class IGameState {}. J’ai alors – naïvement tenté – de faire dériver l’état des options de la classe template IGameState précédente comme suit:

class COptionsState() : public IGameState<"Options"> { ... }

Avec les erreurs qui vont bien. Ceci n’est pas possible car la variable passée en paramètre doit être linké de manière  externe et non locale et ce pour s’assurer que 2 classes distinctes ne seront pas définies à partir du même template pour le même paramètre.

On doit donc déclarer une variable linkable de manière externe. Pour ceci on peut utiliser le mot clé « extern » => extern const char* Options_Str = « options »; et définir ainsi

class COptionsState() : public IGameState<Options_Str> { ... }

. Aussi apparemment il existe une différence entre const char* Str considérée comme une variable et non comme une adresse mémoire par gcc quand passée en argument. Ainsi il vaut mieux définir Options_Str sous forme de tableau:

 extern const char Options_Str[] = "options";

qui chez moi (mingw) a fait disparaitre tous les messages d’erreurs.

Note: Boost MPL a ajouté desoptions pour les strings apparemment.

Autre lien intéressant sur le sujet, la FAQ comeau

Passage à PugiXml

Bonjour,

Je viens ici faire un peu de pub pour l’excellente « librairie » C++ PugiXml. J’avais envie de la tester depuis longtemps et cette envie s’est concrétisée alors que je me heurtais aux manques de mon wrapper TinyXml (inhérents à TinyXml). Ne voulant pas réécrire (et surtout maintenir !) toute une librairie,  je l’ai donc testée (avec comme 2nd remplaçant irrXML, la librairie utilisée par irrlicht et qui existe en standalone). PugiXml = TinyXml + « tout » ce qui manque à TinyXml :

  1. La documentation est top !
  2. 1 seul fichier source ! donc encore plus compact que TinyXml
  3. des projets livrés avec l’archive
  4. On peut chainer les appels et tester le résultat final uniquement sans avoir à tester les nodes intermédiaires
    pugi::xml_node bind = config.child(L"player").child(L"bind");
     if(!bind){
     return false;
    }

    (ne plantera pas même s’il n’a pas trouvé « player » !)

  5. Quelques fonctions utiles comme as_bool(), as_int(), as_float()..
  6. Support de XPath
  7. Support de l’unicode
  8. ….

Bref l’essayer c’est l’adopter !

How to safely convert a wide string into a narrow string (and vice-versa) ?

Irrlicht relies on wide strings (irr::core::stringw / std::wstring) for the GUI system but I had to convert some of them into narrow strings (std::string for instance) for the game.
So I looked on the internet for various solutions but there didn’t seem to be a general and clean one. Snippets did always call a fixed-size buffer which I din’t want to resort to.
That’s when I discovered this very neat C++ project (just a few headers). It makes the conversion through iterators and seems robust (until now I haven’t met any problem).

Here is the code I use :

inline void
convertIntoNarrowString(const std::wstring& original, std::string& converted)
{
utf8::utf16to8(original.begin(),original.end(), std::back_inserter(converted) );
}

inline void
convertIntoWideString(const std::string& original, std::wstring& converted)
{
utf8::utf8to16(original.begin(),original.end(), std::back_inserter(converted) );
}

June release available

Voici le dernier exécutable de développement disponible toujours au même endroit : http://download.tuxfamily.org/bluecosmos/wip/ (téléchargez le zip le plus récent). Il y aurait du avoir d’autres builds disponibles les 2 mois précédents mais la flemme de zipper + uploader. J’ai donc créé un script 7zip qui crée l’archive automatiquement mais la taille croissante des archives (on est passé de 8 à 22 Mo) est gênante :

  1. Vis-à-vis de ma (petite ^^) connexion
  2. gâchis de bande passante pour tuxfamily qui est un service gratuit rappelons le
  3. D’où des releases espacées

L’idée va donc être de créer un launcher multi-plateforme Linux/Windows à même de télécharger depuis le serveur seulement les fichiers modifiés comme le launcher Qt du projet HolySpirit (dont gregouar nous a donné les sources, merci à lui).

Au sujet de cette release :

  • J’ai passé un certain temps à créer un gestionnaire d’entrée gérant la répétition des touches. Mais je n’ai pas encore implémenté la partie joystick  ce qui fait qu’inversement à il y a 2 semaines, l’input clavier marche mais le joystick non.
  • Gestionnaire de dialogue implémenté et visible (suffit d’attendre un peu lors du jeu)
  • Jauge de refroidissement
  • Un ennemi spawn (et tire)

Au programme maintenant :

  • Continuer à implémenter le gameplay (orientation des tirs etc.)
  • Gérer différentes résolutions
  • Ajouter quelques outils de debug

On continue à travailler sur le game document, notamment la partie narrative. L’histoire serait plutôt tragique pour l’instant. L’idée est aussi de développer une démo suffisamment avancé pour recruter des modeleurs 3D et des dessinateurs 2D pour la partie narrative. J’aurai sûrement besoin d’aide pour cette partie recrutement donc n’hésitez pas à me contacter si vous êtes intéressé.

Par ailleurs l’exécutable a été compilé sur une plate-forme 64bits donc si cela fonctionne sur votre machine 32bits, merci de le signaler en commentaire :)

Nb: Un tutoriel sur Qt bientôt sur le blog…