samedi 31 janvier 2009

ULM

Une heure de plus, et voilà mon ultra-léger motorisé prêt pour le décollage!







Je suis particulièrement content de mon fuselage, qui a été finalement plutôt plus facile que prévu à rendre correctement avec un nombre suffisamment bas de polygones.

vendredi 30 janvier 2009

Une aile delta

Dans la série des appareils volants, voilà une aile delta. Cela m'a pris plus de temps que ce que je pensais, puisque mon premier essai, à partir d'un cercle que j'ai extrudé, s'est retrouvé avec une horrible bande de polygones sombres, puisque le cercle a apparemment des normales stupides.

J'ai donc recommencé en partant d'un cône à 6 faces, que j'ai profilé, puis extrudé plusieurs fois, pour en faire un bout d'aile. Copie, inversion, inversion des normales, et pouf, l'autre côté a surgi. Ensuite, un peu de chirurgie pour recoller les morceaux, et voilà l'aile complète.

La prochaine étape, c'est de rajouter un corps, et pourquoi pas une hélice qui tourne!

mardi 27 janvier 2009

lundi 26 janvier 2009

SDL, iconv, UCS-2 et UTF-8

J'avais pourtant bien cherché partout! Mais impossible de trouver confirmation que l'encodage unicode dans SDL (plus exactement dans le champ keysym.unicode) est bien de l'UCS-2. Cependant, vu que UCS-2 est le seul encodage en taille fixe à 2 octets, il semblait difficile qu'il en soit autrement.

La mauvaise nouvelle, c'est que UCS-2 ne peut pas encoder toute la plage de caractères unicode. La bonne, c'est que SDL semble être passé à l'UCS-4 (également connu sous le nom d'UTF-32) dans la version 1.3, qui sortira bientôt. D'ici là, il va falloir faire avec!

Mon problème, c'est que mon application est complètement UTF-8. Il va donc falloir convertir mon UCS-2 en UTF-8, et c'est là que les choses se gâtent. La bibliothèque iconv, appartenant à la libc la bien nommée, va donc venir à notre aide pour nous sortir de ce mauvais pas. Exemple:


extern "C"
{
#include "iconv.h"
}

std::string UcsToUtf8(Uint16 c)
{
char output[4];

char * p_input = reinterpret_cast(&c);
size_t input_size = sizeof(c);
char * p_output = output;
size_t output_size = 4;

iconv_t conv = iconv_open("UTF-8", "UCS-2");
iconv(conv, &p_input, &input_size, &p_output, &output_size);
iconv_close(conv);

std::string strout;

if(output_size < 4)
{
strout = std::string(output, 4 - output_size);
}

return strout;
}


La bibliothèque iconv étant en C pur, il va falloir jouer avec les extern "C" et les reinterpret_cast un peu partout, mais voilà en gros comment écrire une fonction qui prend un champ unicode SDL, et l'encode en UTF-8 dans une std::string standard.

dimanche 25 janvier 2009

Ornithoptère

Une petite tentative pour modéliser un ornithoptère. Étrangement, autant les normales rendent bien dans Blender, autant les ombres partent totalement en vrille lorsque l'armature est exportée, ce qui veut dire qu'il va probablement falloir que je recommence depuis le début si je veux pouvoir faire quoi que ce soit avec le modèle.

Plus tard, j'aimerais l'animer, en le faisant battre des ailes. Deux baguettes devraient pouvoir pousser sur les ailes, qu'il faudrait raccorder à deux roues au milieu de l'appareil. Un bête moteur à hamster avec un plein de carottes serait suffisamment léger et puissant pour assurer la poussée de l'engin. N'oubliez pas votre casque.



samedi 17 janvier 2009

Torus trooper

Voilà un bon jeu découvert dans le repository Debian, qui m'a vraiment scotché pour son minimalisme complètement speedé.



Les graphismes sont épurés, les contrôles réduits au minimum (avancer, gauche, droite, tirer, balancer un gros missile), et la vitesse tout simplement diabolique. Il en ressort un effet totalement psychédélique, que je conseille de joindre à de la bonne musique bien bourrin (puis-je conseiller "So, I Begin" de Galleon, et "Deeper Underground" de Jamiroquai?).



Le gameplay est également très simple, avec une petite astuce: il n'y a pas de nombre de "vies" comme dans d'autres jeux, mais un temps qui diminue. La destruction d'ennemis rapporte du temps, tandis que de faire dégommer le réduit d'un bon cran.



Ça tourne aussi sous Windows, et pour ceux qui s'intéressent au côté technique, c'est codé en D (c'est d'ailleurs le seul programme que je connaisse dans ce langage).

Voilà, un des meilleurs remèdes pour se ressourcer, mangez-en!

mardi 13 janvier 2009

Mount & Blade - Où vendre ses prisonniers

C'est apparemment une question qui turlupine nombre de joueurs, en voilà donc la réponse!

Les prisonniers se vendent auprès des marchands d'esclaves, lesquels se trouvent dans les tavernes. Il faut souvent faire plusieurs villes, ou bien revenir plus tard, car les gus se font rares!

Un seigneur prisonnier, lui, ne peuvent pas être vendus auprès du marchand d'esclave, il va donc falloir trimballer le lord jusqu'à recevoir une offre de la part d'une autre nation, avec parfois un bon paquet d'or à la clé!

mardi 6 janvier 2009

mlres - Release

mlres est dans les bacs! La seule différence depuis mon post précédent est que maintenant il est possible d'inclure toutes les variables dans un namespace (ce qui restreint évidemment le code au C++ lorsque cette option est utilisée).

Le paquet est disponible sur la page AdH de SourceForge.

Voilà les Release Notes:


PRESENTATION

mlres est un aggrégateur de ressources C/C++ écrit en ocaml. Il aggrège des ressources binaires et en génère un fichier source dans lequel les ressources sont encodées comme des tableaux de caractères. Le source peut être ensuide directement compilé avec votre programme, ce qui vous permet de distribuer vos ressources (images, sons...) au sein de l'executable, sans avoir à les fournir en des fichiers séparés.

Bien sûr, la taille de ces ressources doit rester modeste (quelques mégaoctets?).

USAGE

./mlres.run -help donne la liste des options. Un exemple d'utilisation serait:

./mlres.run -output Resources -namespace resources image.png sound.wav

qui va générer un fichier Resources.cpp et un fichier Resources.h, qui définissent deux variables "image" et "sound", dans le namespace "resources".

COMPILATION

La distribution inclut le programme compilé en bytecode, testé avec ocaml 3.10.2. Si vous desirez compiler vous-même le bytecode ou le code natif, vous aurez besoin de OMake (http://omake.metaprl.org/index.html). Pour compiler, tapez:

omake

LICENSE

mlres est distribué sous la GPL v3 ou ultérieure. Il n'y a aucune restriction sur les fichiers qui en sont générés.

PLUS D'INFORMATIONS

Plus d'informations à http://www.sf.net/projects/adh ou à http://aubedesheros.blogspot.com

dimanche 4 janvier 2009

mlres - Un aggrégateur de ressources C/C++

N'est-ce pas particulièrement ennuyeux d'avoir à fournir avec son programme quantité de petits fichiers image et son? D'abord parce que l'installation en est rendue plus complexe et le nombre de bugs potentiels dus à une mauvaise version / absence du fichier est augmentée d'autant, et ensuite parce que l'utilisateur peut aller tripatouiller de ses doigts sales (l'utilisateur a les doigts sales par définition) dans les entrailles multimédia de votre chef-d'œuvre.

Windows l'avait fait via les fichiers de ressources.

Mais wxWidgets l'avait également fait avec un petit programme répondant au doux nom de wxrc, qui empaquette les ressources dans un fichier source, que l'on peut compiler avec son programme.

C'est à une version simplifiée, et surtout indépendante du framework, que je me suis attaqué ces derniers jours. Une version très beta a vu le jour, dont vous pourrez trouver le code source sur sourceforge (le paquet verra le jour quand je serai plus confiant en la stabilité du bazar).

mlres est donc un petit programme ocaml (mon langage préféré pour écrire de petits utilitaires en ligne de commande) qui lit les fichiers passés en argument, et créé un fichier source avec les données binaires.

Démonstration.


./mlres.opt -help
mlres [options] [files list]
-output Output file base name (out)
-hext Header extension (h)
-sext Source extension (cpp)
-help Display this list of options
--help Display this list of options

Allons-y donc gaiement, et essayons d'empaqueter quelques images.

./mlres.run -output resources book16.png book24.png book36.png coin32.png

Et voyons ce qu'il y a dans resources.h

extern unsigned char coin32[1992];
extern unsigned char book36[1170];
extern unsigned char book24[812];
extern unsigned char book16[516];

et resources.cpp

#include "resources.h"

unsigned char coin32[1992] = {137,80,78,71,13,10,26,10,0,0,0,13,7,[...]};
unsigned char book36[1170] = {137,80,78,71,13,10,26,10,0,0,0,13,7,[...]};
...

Le fichier compile sans soucis, et l'on peut ensuite directement charger ses ressources à partir de leur emplacement mémoire!

Bien sûr, ce genre de manœuvre est réservée à des programmes petits, qui n'ont tout au plus que quelques mégaoctets de données. Pour quoi que ce soit de plus gros, il faudra penser soit à vivre avec un répertoire contenant les données, soit à écrire son propre format de fichiers de ressources et à charger le bon bout à la volée (voir ce très bon tutoriel).

Bonne année!



Quand je disais qu'une tablette graphique, ça change la vie?

Bonne année à tous!