IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Développement de jeux avec Vala et SDL


précédentsommairesuivant

II. Configuration

II-A. Création de projet

Créer un projet Vala est aussi simple que de créer un fichier Vala et de le compiler avec valac, le compilateur. Cependant, Vala est également livré avec un outil appelé vala-gen-projet qui génère un projet complet d'autotools incluant le support pour l'internationalisation via Gettext. Nous utiliserons pour débuter notre projet, Brickval, qui sera un simple casse-brique. Pour commencer, créons simplement un dossier contenant le projet, puis exécutons vala-gen-projet dans ce dernier :

 
Sélectionnez
mkdir -p ~/dev/brickval
cd ~/dev/brickval
vala-gen-project

La dernière commande va ouvrir la fenêtre de création de projet Vala. À partir de cette fenêtre, vous pouvez choisir le type d'application (GTK+ ou console), et entrer divers méta-données concernant le projet. Remplissez les champs de la fenêtre afin qu'elle ressemble à la fenêtre ci-après (le répertoire par défaut est le bon) :

Fenêtre de création de projet
Fenêtre de création de projet

En particulier, assurez-vous que le type d'application choisi est la console. Nous n'utiliserons pas GTK+ dans ce projet. Afficher les fichiers du répertoire dans la console nous montre le résultat de la commande vala-gen-project.

II-B. Configuration des outils automatique

Tant que le projet généré par vala-gen-project est fonctionnel, nous allons effectuer quelques changements supplémentaires au template fournit afin de l'adapter aux besoins de notre projet.

II-B-1. Configure.ac

Le premier fichier que nous allons éditer se nomme : configure.ac. Le code suivant montre le fichier, une fois modifié pour les besoins de notre projet.

 
Sélectionnez
AC_INIT([brickval], [0.1.0], [me@lesharris.com], [brickval])
AC_CONFIG_SRCDIR([src/Makefile.am])
AC_CONFIG_HEADER(config.h)
AM_INIT_AUTOMAKE([dist-bzip2])
AM_MAINTAINER_MODE

AC_PROG_CC
AM_PROG_CC_C_O
AC_DISABLE_STATIC
AC_PROG_LIBTOOL

AC_PATH_PROG(VALAC, valac, valac)
AC_SUBST(VALAC)

AH_TEMPLATE([GETTEXT_PACKAGE], [Package name for gettext])
GETTEXT_PACKAGE=brickval
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE")
AC_SUBST(GETTEXT_PACKAGE)
AM_GLIB_GNU_GETTEXT
IT_PROG_INTLTOOL([0.35.0])

AC_SUBST(CFLAGS)
AC_SUBST(CPPFLAGS)
AC_SUBST(LDFLAGS)

GLIB_REQUIRED=2.12.0
SDL_REQUIRED=1.2.0
GEE_REQUIRED=0.1.3

PKG_CHECK_MODULES(BRICKVAL, glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED gee-1.0 > $GEE_REQUIRED)
AC_SUBST(BRICKVAL_CFLAGS)
AC_SUBST(BRICKVAL_LIBS)

VALA_PACKAGES="--pkg gee-1.0 "
SDL_AUX_LIBS=""

PKG_CHECK_MODULES(SDL, sdl >= $SDL_REQUIRED)
AC_SUBST(SDL_CFLAGS)
AC_SUBST(SDL_LIBS)
VALA_PACKAGES="$VALA_PACKAGES--pkg sdl "

AC_CHECK_HEADERS(SDL/SDL_gfxPrimitives.h,
        SDL_AUX_LIBS="$SDL_AUX_LIBS-lSDL_gfx ",
        AC_MSG_ERROR([SDL_gfx required but not found.])
        )
VALA_PACKAGES="$VALA_PACKAGES--pkg sdl-gfx "

AC_CHECK_HEADERS(SDL/SDL_image.h,
        SDL_AUX_LIBS="$SDL_AUX_LIBS-lSDL_image ",
        AC_MSG_ERROR([SDL_image required but not found.])
        )
VALA_PACKAGES="$VALA_PACKAGES--pkg sdl-image "

AC_CHECK_HEADERS(SDL/SDL_mixer.h,
        SDL_AUX_LIBS="$SDL_AUX_LIBS-lSDL_mixer ",
        AC_MSG_ERROR([SDL_mixer required but not found.])
        )
VALA_PACKAGES="$VALA_PACKAGES--pkg sdl-mixer "

AC_CHECK_HEADERS(SDL/SDL_ttf.h,
        SDL_AUX_LIBS="$SDL_AUX_LIBS-lSDL_ttf ",
        AC_MSG_ERROR([SDL_ttf required but not found.])
        )
VALA_PACKAGES="$VALA_PACKAGES--pkg sdl-ttf "

AC_SUBST(SDL_AUX_LIBS)
AC_SUBST(VALA_PACKAGES)

AC_CONFIG_FILES([Makefile
        data/Makefile
        data/backgrounds/Makefile
        data/sprites/Makefile
        src/Makefile
        po/Makefile.in])

AC_OUTPUT

Ouvrez le fichier original configure.ac généré par vala-gen-project et comparez les deux. Le principal apport est l'ajout de modules qui sont vérifiés dans PKG_CHECK_MODULES, quelques nouveaux Makefile dans AC_CONFIG_FILES, deux nouvelles variables dans VALA_PACKAGES et SDL_AUX_LIBS ainsi qu'un tas de choses au milieu de AC_CHECK_HEADER. Si cela vous paraît alarmant, ne paniquez pas !
Souvenez-vous que vous n'avez à faire ceci que cette fois seulement, et donc, cela n'est pas aussi compliqué que cela en a l'air.

Si vous comprenez tout ce qui est expliqué ici, sentez vous libre d'allez à la partie suivante.

Pour ceux qui sont toujours là, voici ce qui se passe dans le fichier configure.ac. La plupart des distributions Linux modernes jouent avec un utilitaire nommé pkg-config qui fournit un moyen facile de rechercher les options du compilateur que requiert une bibliothèque pour être compilée. PKG_CHECK_MODULES dans votre ficher configure.ac vérifie simplement l'existence de ces bibliothèques et s'assure que vous avez les bonnes versions de ces dernières d'installées.
Il stocke ensuite les options de compilations dans BRICKVAL_CFLAGS et BRICKVAL_LIBS.

Brickval dépend aussi de bibliothèques SDL auxiliaires que la commande pkg-config ne peut vérifier, donc nous contrôlons leur existence via AC_CHECK_HEADERS. Nous faisons l'hypothèse un peu naïve que si les fichiers d'entête existent, alors la bonne version de la bibliothèque est installée. Cela est la plupart du temps le cas, mais cela peu poser un problème potentiel. Si le fichier d'entête est là, il rajoute les options de compilation pour cette bibliothèque dans SDL_AUX_LIBS, autrement, il imprime une erreur et stoppe la configuration du projet.

À ce stade, vous devriez noter que la variable VALA_PACKAGES est en réalité superflue pour ce programme puisque toutes les bibliothèques sont nécessaires et non plus facultatives. Ceci démontre un moyen de générer dynamiquement la liste des paquets requis pas valac à partir du fichier de configuration lui-même.
Si la bibliothèque est installée, alors c'est le paquet vala qui s'ajoute à la variable VALA_PACKAGES qui sera utilisée plus tard dans notre Makefile afin passer ces derniers au compilateur.

Finalement, nous avons ajouté quelques Makefile supplémentaires dans AC_CONFIG_FILES que Brickval devra utiliser. Ces ajouts concernent principalement la manière dont nous installer nos graphiques de données.
L'ajout de src/Makefile sera expliqué dans la partie suivante.

II-B-2. Makefile.am

La manière dont vala-gen-projet créé le fichier Makefile.am construit le projet d'une telle façon que l'exécutable généré est créé à la racine du répertoire du projet.
Pour Brickval, nous voulons suivre une approche plus traditionnelle et créer l'exécutable dans le sous-répertoire src.
Grâce à cela, le fichier Makefile.am peut se simplifier de la manière suivante :

 
Sélectionnez
SUBDIRS = src po data

EXTRA_DIST = \
        intltool-extract.in \
        intltool-update.in \
        intltool-merge.in

DISTCLEANFILES = \
        intltool-extract \
        intltool-update \
        intltool-merge \
        po/.intltool-merge-cache

Ceci indique aux autotools qu'il y a des Makefile supplémentaires dans les sous-répertoires src, po, et data dont ils auront besoin d'exécuter afin de pouvoir compiler le projet. Il rajoute également quelques fichiers supplémentaires qui seront distribués avec le paquet final.

II-B-3. data/Makefile.am

Le dossier pour ce fichier Makefile.am n'existe pas encore, nous allons donc le créer ainsi que les sous-répertoires dont nous aurons besoin pour lui plus tard :

 
Sélectionnez
mkdir -p data/sprites
mkdir data/backgrounds
cd data

Maintenant, créons le fichier Makefile.am avec votre éditeur de texte préféré et placez ce qui suit dedans :

 
Sélectionnez
SUBDIRS = sprites backgrounds

Bien, puisque nous avons créé les sous-répertoires, mettons-y quelques images :

 
Sélectionnez
wget http://www.lesharris.com/valagamedev/gfx.tar.gz

Ces graphiques sont du thème Deadfish pour LBreakout2 et ont été créés par Johannes Kroll (j-kroll (at) gmx (point) de). Décompressez le fichier où vous voulez et déplacez le fichier bg.png dans le sous-répertoire background et le reste dans le sous-répertoire sprites.

Même si les données sont encore là, nous devons indiquer aux autotools que ces données doivent être installées quelque-part. Nous allons faire ça maintenant.

II-B-3-a. data/backgrounds/Makefile.am

Le Makefile.am pour les fichiers graphiques est très simple depuis qu'ils indiquent spécifiquement l'emplacement de chaque fichier. Éditez le fichier afin qu'il ressemble à cela :

 
Sélectionnez
Backgroundsdir = $(datadir)/brickval/backgrounds

Backgrounds_DATA = \
        bg.png

EXTRA_DIST = \
        $(Backgrounds_DATA)
II-B-3-b. data/sprites/Makefile.am

Maintenant, nous allons pratiquement faire la même opération dans le sous-répertoire sprites. Créez et éditez le fichier Makefile.am et copiez ceci dedans :

 
Sélectionnez
Spritesdir = $(datadir)/brickval/sprites

Sprites_DATA = \
        bricks.png \
        extras.png \
        life.png \
        paddle.png

EXTRA_DIST = \
        $(Sprites_DATA)

II-B-4. src/Makefile.am

Ouf, nous avons presque fini de créer tous les Makefile.am !
Il en reste juste un et c'est le plus complexe puisque c'est celui qui compile le code vala.
Il doit contenir ce qui suit :

 
Sélectionnez
VALA_CFLAGS = \
        --vapidir ../vapi \
        --pkg config \
        $(VALA_PACKAGES)

AM_CPPFLAGS = \
        -DDATADIR=\"$(datadir)\" \
        -DPACKAGE_DATADIR=\""$(datadir)/brickval"\" \
        -DSPRITE_DIR=\""$(datadir)/brickval/sprites"\" \
        -DBACKGROUND_DIR=\""$(datadir)/brickval/backgrounds"\" \
        -DPACKAGE_LOCALEDIR=\""$(datadir)/locale"\" \
        $(BRICKVAL_CFLAGS) \
        $(SDL_CFLAGS) \
        -include $(CONFIG_HEADER)

BUILT_SOURCES = brickval.vala.stamp

bin_PROGRAMS = brickval

brickval_VALASOURCES = \
        brickval.vala

brickval_SOURCES = \
        $(brickval_VALASOURCES:.vala=.c) \
        $(brickval_VALASOURCES:.vala=.h)

brickval.vala.stamp: $(brickval_VALASOURCES)
        $(VALAC) -C $(VALA_CFLAGS) $^
        touch $@

brickval_LDADD = \
        $(BRICKVAL_LIBS) \
        $(SDL_LIBS)     \
        $(SDL_AUX_LIBS)

La première partie de ce fichier définit les options de compilation qui seront passées au compilateur Vala, valac. Nous passerons vapidir et le paquet config dans la partie qui va suivre, mais vous noterez que c'est l'endroit où nous mettons notre variable VALA_PACKAGES que nous avons créé dans le fichier configure.ac à utiliser.
La seconde partie définie plusieurs constantes qui seront définies au moment de la compilation pour notre projet. Celles-ci, aussi, sont étroitement rattachées au mystérieux paquet config dont nous discuterons plus tard.
C'est également l'endroit où sont placés les options pour le compilateur gcc.

La majeur partie du reste de ce fichier correspond au modèle et est généré pour vous grâce à vala-gen-project (je l'ai simplement déplacé dans ce Makefile.am). Cependant, deux parties en particulier sont intéressantes pour vous. La première est brickval_VALASOURCES. C'est l'endroit où vous spécifiez tous les fichiers source qui seront utilisés pour créer l'application. Dans l'immédiat, nous n'avon que brickval.vala ici. Puisque brickval.vala n'existe pas encore, renommons le fichier main.vala en brickval.vala :

 
Sélectionnez
mv main.vala brickval.vala

C'est dorénavant bien mieux.
La dernière partie dont vous devriez être conscients est la partie brickval_LDADD. C'est l'endroit où nous plaçons les variables qui contiennent les options de compilation des bibliothèques, dans notre cas, les bibliothèques pour Brickval lui-même et SDL.

Félicitations, l'environnement de configuration est prêt !
Toutefois, nous n'avons pas encore tout à fait fini.
Il reste le mystérieux paquet vapidir ainsi que celui de configuration à traiter.

II-C. Config.vapi

Traditionnellement, les autotools créent un fichier config.h qui peut être utilisé dans un programme C ou C++ afin de préserver les différentes configurations et méta-données qui sont générées durant le processus de configuration. Ceci permet aux informations découvertes lors du processus de configuration par les autotools d'être utilisés dans le code de l'application lui-même. Ceci est vraiment utile et peut être utilisé pour de nombreuses choses.
Toutefois, puisque c'est un header C, et que nous codons en Vala, il y a problème.
À première vue, il semble nous ne pouvons pas utiliser ce fichier ou n'importe quelle constante définie en tant qu'options de compilation de notre programme !

Heureusement, il y a une solution à ce problème.
Pour rendre cette information utilisable par notre programme vala, nous devrons créer un fichier vala spécial avec l'extension : .vapi. Ces fichiers sont généralement utilisés comme une description d'une bibliothèque C et permet à la bibliothèque C d'être utilisée dans un programme vala. Pour ce cas, cependant, nous l'utiliserons simplement pour définir un ensemble de chaînes de caractères constantes et utilise un attribut pour appeler le compilateur Vala pour parcourir notre fichier config.h et utilise les valeurs qu'il trouve pour fournir les valeurs pour ces chaînes de caractères constantes.

Premièrement, nous avons besoin de créer le dossier pour notre fichier config.vapi.

 
Sélectionnez
cd ~/dev/brickval
mkdir vapi

Et maintenant nous avons besoin de créer le fichier config.vapi dans notre nouveau dossier et le remplir avec les informations suivantes:

 
Sélectionnez
[CCode (cprefix = "", lower_case_cprefix = "", cheader_filename = "config.h")]
namespace Config {
        public const string GETTEXT_PACKAGE;
        public const string SPRITE_DIR;
        public const string BACKGROUND_DIR;
        public const string PACKAGE_DATADIR;
        public const string PACKAGE_LOCALEDIR;
        public const string PACKAGE_NAME;
        public const string PACKAGE_VERSION;
        public const string VERSION;
}

Souvenez-vous dans notre fichier src/Makefile.am à qui l'on a passé un répertoire vapi supplémentaire et un paquet au compilateur vala. Maintenant vous savez ce que nous sommes en train de faire. L'option de compilation vala vapidir ajoute un répertoire supplémentaire que valac va rechercher pour les paquets et l'option de configuration --pkg indique à valac ce paquet que nous venons juste de créer.

Notez que nous avons non-seulement accès à toutes les définitions que nous voulons utiliser dans config.h, mais également accès à toutes les constantes qui sont passées à gcc directement.
C'est le cas avec les constantes BACKGROUND_DIR et SPRITE_DIR.
Nous n'allons pas exposer toutes les constantes possibles, juste les constantes que le programme utilisera couramment.
Si vous voulez utiliser une constante particulière à votre programme vala, elle doit aussi être définie dans le fichier config.vapi.

II-D. Conclusion

Bien, c'était une partie longue et difficile. C'est probablement la partie la moins amusante d'un projet Vala, sa mise en place !
Toutefois, c'est assez court et prends plus de temps à être expliqué que de le faire une fois, après, vous aurez le coup de main.
La meilleure partie du processus est que n'avez qu'à le faire qu'une fois et ensuite juste à ajouter les morceaux ou pièces manquantes au fur et à mesure que votre projet grandit.

Dans la prochaine partie, nous commencerons à écrire du code, et à la fin, vous aurez une simple démonstration graphique qui utilise les sprites.
Je pense que vous serez impressionnés de la facilité et rapidité avec laquelle Vala fait cela !


précédentsommairesuivant