L'API Minecraft pour Raspberry Pi

Guide de l'API Python pour Minecraft Pi

Ce document est le guide de référence pour la bibliothèque Minecraft Python API, supportée sur l'édition Minecraft Pi et sur la version PC utilisant le plug-in RaspberryJuice.

Si vous désirez en savoir plus sur l'utilisation de l'API, voir le tutoriel Débuter avec Minecraft pour Raspberry Pi.

3 commentaires Donner une note à l'article (5)

Article lu   fois.

Les deux auteur et traducteur

Site personnel

Traducteur : Profil ProSite personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Structure de l'API

  • minecraft.py

    • Classe Minecraft - classe principale pour se connecter au jeu et interagir avec lui

      • Classe camera - changement de l'angle de vue de la caméra et de sa position
      • Classe player - obtenir et modifier la position et les caractéristiques des joueurs
      • Classe entity - obtenir et modifier la position et les caractéristiques des entités
      • Classe events - récupérer les événements qui ont eu lieu au cours du jeu
  • block.py

    • Classe Block - définition d'un bloc, en particulier de son type
  • event.py

    • Classe BlockEvent - définition d'un événement de bloc, en particulier quel événement, quel bloc et quel joueur
  • vec3.py

    • Classe Vec3 - classe générique pour gérer un vecteur de coordonnées à trois dimensions (à savoir x, y, z)
  • connection.py - module interne utilisé par l'API
  • util.py - module interne utilisé par l'API

II. Compatibilité

Les fonctions et les types de blocs ne sont pas tous disponibles sur toutes les versions de l'API. Pour chaque fonction, un logo vous indiquera si cette fonction est disponible pour votre version de l'API :

Image non disponible

Disponible sur l'édition Minecraft Pi

Image non disponible

Disponible sur RaspberryJuice

III. Le monde Minecraft : Minecraft

Minecraft est la classe principale pour interagir avec le monde Minecraft. Elle comprend les fonctions pour établir une connexion, modifier les joueurs et enregistrer les événements.

III-A. create

Image non disponible Image non disponible .create(address = "localhost", port = 4711)

Crée une connexion à Minecraft (adresse, port) => un objet Minecraft

 
Sélectionnez
# utilise les adresse et port par défaut
mc = minecraft.Minecraft.create()

# spécifie une adresse IP et un port
mc = minecraft.Minecraft.create("192.168.1.1", 4711)

# l'objet mc créé sera utilisé dans les exemples de code ci-dessous

III-B. getBlock

Image non disponible Image non disponible .getBlock(x,y,z)

Récupère l'identifiant d'un bloc (coordonnées x, y et z) => id:int

 
Sélectionnez
# récupère le type de bloc en position 0,0,0
blockType = mc.getBlock(0,0,0)

III-C. getBlocks

Image non disponible Image non disponible .getBlocks(x0,y0,z0,x1,y1,z1)

Récupère un « cuboïde » (parallélépipède rectangle) de blocs (x0,y0,z0,x1,y1,z1) => [id:int]

 
Sélectionnez
# récupère les identifiants des blocs d'un cuboïde
blocks = mc.getBlocks(-1,-1,-1,1,1,1)
for block in blocks:
    print block

III-D. getBlockWithData

Image non disponible Image non disponible .getBlockWithData(x,y,z)

Récupère un objet et ses données (x,y,z) => Block

 
Sélectionnez
# récupère l'objet block du bloc se trouvant aux coordonnées 0,0,0
blockObj = mc.getBlockWithData(0,0,0)

III-E. setBlock

Image non disponible Image non disponible .setBlock(x,y,z)

Place un bloc de type id aux coordonnées x, y, z : (x,y,z,id,[data])

 
Sélectionnez
# place un bloc d'un type particulier aux coordonnées x, y et z
mc.setBlock(0,0,0,block.DIRT.id)

# place un bloc d'un type et d'un "sous-type" particuliers
mc.setblock(0,0,0,block.WOOD.id, 1)

III-F. setBlocks

Image non disponible Image non disponible .setBlocks(x0,y0,z0,x1,y1,z1,blockType, blockData)

Remplit un « cuboïde » (parallélépipède) de blocs

 
Sélectionnez
# place plusieurs blocs d'un seul coup et remplit tout l'espace 
# entre deux ensembles de coordonnées x, y et z
mc.setBlocks(-1, -1, -1, 1, 1, 1, block.STONE.id)

III-G. getHeight

Image non disponible Image non disponible .getHeight(x,z)

Récupère l'altitude de coordonnées horizontales (x,z) => int

 
Sélectionnez
# détermine la coordonnée verticale y du point de coordonnées
# horizontales x, z représentant le bloc (autre que de l'air) 
# le plus élevé
y = mc.getHeight(0,0)

III-H. getPlayerEntityIds

Image non disponible Image non disponible .getPlayerEntityIds()

Récupère l'identifiant d'entité des joueurs connectés au jeu => [id:int]

 
Sélectionnez
# Récupère l'identifiant des joueurs connectés au jeu
entityIds = mc.getPlayerEntityIds()
for entityId in entityIds:
    print entityId

III-I. getPlayerEntityId

Image non disponible .getPlayerEntityId(playerName)

Récupère l'identifiant d'entité d'un joueur nommé => [id:int]

 
Sélectionnez
# Récupère l'identifiant d'entité du joueur appelé 'martinohanlon'
entityId = mc.getPlayerEntityId("martinohanlon")
print entityId

III-J. saveCheckpoint

Image non disponible .saveCheckpoint()

Sauvegarde un point de contrôle qui peut être utilisé pour restaurer un état du jeu

 
Sélectionnez
mc.saveCheckpoint()

III-K. restoreCheckpoint

Image non disponible .restoreCheckpoint()

Restaure l'état du jeu au moment de la sauvegarde d'un point de contrôle

 
Sélectionnez
mc.restoreCheckpoint()

III-L. postToChat

Image non disponible Image non disponible .postToChat(message)

Poste un message dans la fenêtre de message du jeu

 
Sélectionnez
# Écrit 'Hello Minecraft World' dans la fenêtre de message
mc.postToChat("Hello Minecraft World")

III-M. setting

Image non disponible .setting(setting, status)

Configure un monde (setting, status). Clefs : world_immutable, nametags_visible

 
Sélectionnez
# passe le réglage world_immutable (monde non modifiable) à Vrai
mc.setting("world_immutable", True)

# passe le réglage nametags_visible (étiquettes de noms visibles) à Faux
mc.setting("nametags_visible", False)

IV. Le joueur : Minecraft.player

IV-A. getPos

Image non disponible Image non disponible .getPos()

Récupère la position du joueur dans le monde sous la forme d'un Vec3 de nombres en virgule flottante (nombres décimaux). Si le joueur est au milieu d'un bloc, renvoie la coordonnée x.5.

 
Sélectionnez
# Récupère la position du joueur sous la forme de nombres en virgule flottante
playerPos = mc.player.getPos()

IV-B. setPos

Image non disponible Image non disponible .setPos(x,y,z)

Déplace un joueur à la position désignée par les coordonnées passées en paramètres ([x,y,z])

 
Sélectionnez
# Place le joueur à la position désignée (nombres en virgule flottante)
mc.player.setPos(0.0,0.0,0.0)

IV-C. getTilePos

Image non disponible Image non disponible .getTilePos()

Récupère la position de la « tuile » sur laquelle se trouve le joueur

 
Sélectionnez
# Récupère la position de la tuile  se trouve le joueur
playerTile = mc.player.getTilePos()

IV-D. setTilePos

Image non disponible Image non disponible .setTilePos(x,y,z)

Déplace le joueur à la position dans le monde de la tuile en passant des coordonnées ([x,y,z])

 
Sélectionnez
# Fixe la position de la tuile sur laquelle se trouve le joueur
mc.player.setTilePos(0,0,0)

IV-E. setting

Image non disponible .setting(setting, status)

Configure un joueur (setting, status). Clefs : autojump

 
Sélectionnez
# Passe le réglage autojump à Vrai
mc.player.setting("autojump", True)

IV-F. getRotation

Image non disponible .getRotation()

Récupère l'angle de rotation dans le plan horizontal (0 à 360°) du joueur => [angle:float]

 
Sélectionnez
# Récupère l'angle de rotation du joueur (azimutal)
angle = mc.player.getRotation()
print angle

IV-G. getPitch

Image non disponible .getPitch()

Récupère l'angle dans le plan vertical (-90 à 90°) du joueur => [pitch:float]

 
Sélectionnez
# Récupère l'angle vertical (inclinaison ou angle de cabrage)
pitch = mc.player.getPitch()
print pitch

IV-H. getDirection

Image non disponible .getDirection()

Récupère le vecteur unitaire des x, y, z de la direction (cap) du joueur => [Vec3]

 
Sélectionnez
# récupère la direction du joueur
direction = mc.player.getDirection()
print direction

V. Entités (autres joueurs) : Minecraft.entity

Les fonctions relatives aux entités sont utilisées de concert avec la fonction .getPlayerEntityIds() pour interagir avec une entité (les joueurs) d'un jeu. Ces fonctions sont utiles en jeu multijoueur.

Pour obtenir les identifiants d'entité des joueurs connectés au jeu :

 
Sélectionnez
# obtenir les identifiants d'entité des joueurs connectés au jeu
entityIds = mc.getPlayerEntityIds()
PremierId = entityIds[0]
SecondId  = entityIds[1]
# ...

V-A. getPos

Image non disponible Image non disponible .getPos(entityId)

Récupère la position d'une entité dans le monde, sous la forme d'un Vec3 de nombres en virgule flottante (nombres décimaux). Si une entité est au milieu d'un bloc, renvoie une valeur du type x.5.

 
Sélectionnez
# Récupère la position d'une entité (nombres en virgule flottante)
entityPos = mc.entity.getPos(entityId)

V-B. setPos

Image non disponible Image non disponible .setPos(entityId,x,y,z)

Déplace une entité à une position dans le monde, en passant les coordonnées de cette position

 
Sélectionnez
# place les joueurs aux positions désignées par les coordonnées 
# (nombres en virgule flottante)
mc.player.setPos(entityId,0.0,0.0,0.0)

V-C. getTilePos

Image non disponible Image non disponible .getTilePos(entityId)

Récupère la position de la « tuile » sur laquelle se trouve l'entité

 
Sélectionnez
# récupère la position de la tuile  se trouve l'entité
entityTile = mc.entity.getTilePos(entityId)

V-D. setTilePos

Image non disponible Image non disponible .setTilePos(entityId, x,y,z)

Déplace l'entité à une position de tuile dans le monde en passant des coordonnées ([x,y,z])

 
Sélectionnez
# fixe la position de la tuile sur laquelle se trouve l'entité
mc.player.setTilePos(entityId,0,0,0)

V-E. getRotation

Image non disponible .getRotation(entityId)

Récupère l'angle de rotation dans le plan horizontal (0 à 360°) de l'entité => [angle:float]

 
Sélectionnez
# récupère l'angle de rotation de l'entité
angle = mc.entity.getRotation(entityId)
print angle

V-F. getPitch

Image non disponible .getPitch(entityId)

Récupère l'angle dans le plan vertical (-90 à 90°) d'une entité => [pitch:float]

 
Sélectionnez
# Récupère l'angle vertical (angle de cabrage) de l'entité
pitch = mc.entity.getPitch(entityId)
print pitch

V-G. getDirection

Image non disponible .getDirection(entityId)

Récupère le vecteur unitaire des x, y, z de la direction (cap) du joueur => [Vec3]

 
Sélectionnez
# récupère la direction d'une entité
direction = mc.entity.getDirection(entityId)
print direction

VI. Caméra (Minecraft.camera)

VI-A. setNormal

Image non disponible .setNormal(entityId)

Configure la caméra en mode Minecraft normal (vision du joueur) ([entityId])

 
Sélectionnez
# Configure la caméra en mode normal pour un joueur
mc.camera.setNormal(entityId)

VI-B. setFixed

Image non disponible .setFixed()

Configure la caméra en mode vue fixe

 
Sélectionnez
# Configure la caméra en mode vue fixe 
mc.camera.setFixed()

VI-C. setFollow

Image non disponible .setFollow(entityId)

Configure la caméra en mode suivi d'une entité ([entityId])

 
Sélectionnez
# configure la caméra pour suivre un joueur spécifique
mc.camera.setFollow(entityId)

VI-D. setPos

Image non disponible .setPos(x,y,z)

Configure la position de l'entité caméra (x,y,z)

 
Sélectionnez
# place la caméra à une position spécifique de coordonnées x, y, z
mc.camera.setPos(0,0,0)

VII. Événements Minecraft (Minecraft.events)

VII-A. pollBlockHits

Image non disponible Image non disponible .pollBlockHits()

Frappes de blocs (déclenchées uniquement par l'épée) => [BlockEvent]

 
Sélectionnez
# récupère les frappes de bloc qui ont eu lieu depuis la dernière
# fois que la fonction a été exécutée
blockEvents = mc.events.pollBlockHits()
for blockEvent in blockEvents:
    print blockEvent

VII-B. clearAll

Image non disponible Image non disponible .clearAll()

Efface tous les événements anciens

 
Sélectionnez
# efface les événements anciens
mc.events.clearAll()

VIII. Block

Le tableau ci-dessous donne la définition d'un bloc dans Minecraft, utilisée pour décrire le type de bloc (pierre, air, herbe, etc.) et, le cas échéant ses données, c'est-à-dire ses propriétés supplémentaires. Il contient aussi les constantes pour les identifiants de types de blocs, par exemple BLOCK.AIR.id.

Image non disponible Image non disponible

 
Sélectionnez
# crée un bloc d'un type spécifique
blockObj = block.Block(id)

# crée un bloc d'un type spécifique et applique une donnée
blockObj = block.Block(id, data)

VIII-A. Identifiants (id)

.id

L'identifiant (id) du type d'un bloc.

Type (nom officiel)

ID

Type en français

AIR

Block(0)

Air

STONE

Block(1)

Roche

GRASS

Block(2)

Herbe

DIRT

Block(3)

Terre

COBBLESTONE

Block(4)

Pierre

WOOD_PLANKS

Block(5)

Planche

SAPLING

Block(6)

Pousse d'arbre

BEDROCK

Block(7)

Bedrock

WATER_FLOWING

Block(8)

Eau

WATER

WATER_FLOWING

Eau

WATER_STATIONARY

Block(9)

Eau stationnaire

LAVA_FLOWING

Block(10)

Lave

LAVA

LAVA_FLOWING

Lave

LAVA_STATIONARY

Block(11)

Lave stationnaire

SAND

Block(12)

Sable

GRAVEL

Block(13)

Gravier

GOLD_ORE

Block(14)

Minerai d'or

IRON_ORE

Block(15)

Minerai de fer

COAL_ORE

Block(16)

Minerai de charbon

WOOD

Block(17)

Bois

LEAVES

Block(18)

Feuillage

GLASS

Block(20)

Verre

LAPIS_LAZULI_ORE

Block(21)

Minerai de lapis-lazuli

LAPIS_LAZULI_BLOCK

Block(22)

Bloc de lapis-lazuli

SANDSTONE

Block(24)

Grès

BED

Block(26)

Lit

COBWEB

Block(30)

Toile d'araignée

GRASS_TALL

Block(31)

Herbe haute

WOOL

Block(35)

Laine

FLOWER_YELLOW

Block(37)

Pissenlit

FLOWER_CYAN

Block(38)

Fleur cyan

MUSHROOM_BROWN

Block(39)

Champignon brun

MUSHROOM_RED

Block(40)

Champignon rouge

GOLD_BLOCK

Block(41)

Bloc d'or

IRON_BLOCK

Block(42)

Bloc de fer

STONE_SLAB_DOUBLE

Block(43)

Double dalle

STONE_SLAB

Block(44)

Dalle

BRICK_BLOCK

Block(45)

Bloc de brique d'argile

TNT

Block(46)

TNT

BOOKSHELF

Block(47)

Bibliothèque

MOSS_STONE

Block(48)

Pierre moussue

OBSIDIAN

Block(49)

Obsidienne

TORCH

Block(50)

Torche

FIRE

Block(51)

Feu

STAIRS_WOOD

Block(53)

Escalier de bois

CHEST

Block(54)

Coffre

DIAMOND_ORE

Block(56)

Minerai de diamant

DIAMOND_BLOCK

Block(57)

Bloc de diamant

CRAFTING_TABLE

Block(58)

Établi

FARMLAND

Block(60)

Terre labourée

FURNACE_INACTIVE

Block(61)

Fourneau

FURNACE_ACTIVE

Block(62)

Fourneau en utilisation

DOOR_WOOD

Block(64)

Porte en bois

LADDER

Block(65)

Échelle

STAIRS_COBBLESTONE

Block(67)

Escalier de pierre

DOOR_IRON

Block(71)

Porte en fer

REDSTONE_ORE

Block(73)

Minerai de redstone

SNOW

Block(78)

Neige

ICE

Block(79)

Glace

SNOW_BLOCK

Block(80)

Bloc de neige

CACTUS

Block(81)

Cactus

CLAY

Block(82)

Bloc d'argile

SUGAR_CANE

Block(83)

Canne à sucre

FENCE

Block(85)

Barrière

GLOWSTONE_BLOCK

Block(89)

Bloc de glowstone

BEDROCK_INVISIBLE

Block(95)

Bedrock invisible

STONE_BRICK

Block(98)

Brique de pierre

GLASS_PANE

Block(102)

Vitre

MELON

Block(103)

Bloc de pastèque

FENCE_GATE

Block(107)

Portillon

GLOWING_OBSIDIAN

Block(246)

Obsidienne flamboyante

NETHER_REACTOR_CORE

Block(247)

Cœur de réacteur du Nether

VIII-B. Données

.data

Les données (sous-types ou propriétés supplémentaires) de certains types de blocs.

VIII-B-1. Couleurs des blocs de type WOOL (laine)

0 : White (blanc)
1 : Orange (orange)
2 : Magenta (magenta)
3 : Light Blue (bleu ciel)
4 : Yellow (jaune)
5 : Lime (vert clair)
6 : Pink (rose)
7 : Grey (gris)
8 : Light grey (gris clair)
9 : Cyan (cyan)
10 : Purple (violet)
11 : Blue (bleu)
12 : Brown (marron)
13 : Green (vert)
14 : Red (rouge)
15 : Black (noir)

VIII-B-2. Essences de bois des blocs de type WOOD

0 : Oak (chêne) (orienté haut-bas)
1 : Spruce (épicéa) (orienté haut-bas)
2 : Birch (bouleau) (orienté haut-bas)


Les essences ci-dessous ne sont pas disponibles sur le Pi :


3 : Jungle (orienté haut-bas)
4 : Oak (chêne) (orienté est-ouest)
5 : Spruce (épicéa) (orienté est-ouest)
6 : Birch (bouleau) (orienté est-ouest)
7 : Jungle (orienté est-ouest)
8 : Oak (chêne) (orienté nord-sud)
9 : Spruce (épicéa) (orienté nord-sud)
10 : Birch (bouleau)(orienté nord-sud)
11 : Jungle (orienté nord-sud)
12 : Oak (chêne) (écorce seule)
13 : Spruce (épicéa) (écorce seule)
14 : Birch (bouleau) (écorce seule)
15 : Jungle (écorce seule)

VIII-B-3. WOOD_PLANKS (Planches), non disponibles sur le Pi

0 : Oak (chêne)
1 : Spruce (épicéa)
2 : Birch (bouleau)
3 : Jungle

VIII-B-4. SAPLING (pousses d'arbres)

0 : Oak (chêne)
1 : Spruce (épicéa)
2 : Birch (bouleau)
3 : Jungle (jungle, pas sur le Pi)

VIII-B-5. GRASS_TALL (herbes hautes)

0 : Shrub (arbuste)
1 : Grass (herbe)
2 : Fern (fougère)
3 : Grass (couleur affectée par le biome, c'est-à-dire le type de végétation dominante de la région) (pas sur le Pi)

VIII-B-6. TORCH (torche)

1 : Pointing east (vers l'est)

2 : Pointing west (vers l'ouest)
3 : Pointing south (vers le sud)
4 : Pointing north (vers le nord)
5 : Facing up (vers le haut)

VIII-B-7. STONE_BRICK (pierres taillées)

0 : Stone brick (pierre taillée)
1 : Mossy stone brick (pierre taillée moussue)
2 : Cracked stone brick (pierre taillée craquelée)
3 : Chiseled stone brick (pierre sculptée)

VIII-B-8. STONE_SLAB / STONE_SLAB_DOUBLE (dalles, doubles dalles)


0 : Stone (roche)
1 : Sandstone (grès)
2 : Wooden (bois)
3 : Cobblestone (pierre)
4 : Brick (brique)
5 : Stone Brick (pierre taillée)

Les dalles suivantes ne sont pas disponibles sur le Pi

6 : Nether Brick (brique du Nether)
7 : Quartz (quartz)

VIII-B-9. SNOW_BLOCK (bloc de neige)

0-7 : Hauteur de la neige, 0 étant la plus faible et 7 la plus haute.

VIII-B-10. TNT

0 : Inactif
1 : Prêt à exploser

VIII-B-11. LEAVES (feuillage)

1 : Oak leaves (feuillage de chêne)
2 : Spruce leaves (feuillage d'épicéa)
3 : Birch leaves (feuillage de bouleau)

VIII-B-12. SANDSTONE (grès)

0 : Sandstone (grès)
1 : Chiseled sandstone (grès gravé)
2 : Smooth sandstone (grès poli)

VIII-B-13. STAIRS_[COBBLESTONE, WOOD] (matériaux d'escalier)

0 : Ascending east - montant vers l'est
1 : Ascending west - montant vers l'ouest
2 : Ascending south - montant vers le sud
3 : Ascending north - montant vers le nord
4 : Ascending east (upside down) - montant vers l'est (à l'envers)
5 : Ascending west (upside down) - montant vers l'ouest (à l'envers)
6 : Ascending south (upside down) - montant vers le sud (à l'envers)
7 : Ascending north (upside down) - montant vers le nord (à l'envers)

VIII-B-14. LADDERS, CHESTS, FURNACES, FENCE_GATE (échelles, coffres, fourneaux, portillon)

2 : Vers le nord
3 : Vers le sud
4 : Vers l'ouest
5 : Vers l'est

VIII-B-15. [WATER, LAVA]_STATIONARY (eau ou lave stationnaire)

0-7 : Niveau de l'eau, 0 le plus élevé, 7 le plus bas

VIII-B-16. NETHER_REACTOR_CORE (cœur du réacteur du Nether)

0 : Non utilisé
1 : Actif
2 : Arrêté/en fin de vie

IX. Événement de bloc (BlockEvent)

La définition d'un Blockevent dans Minecreaft, utilisé pour décrire les événements affectant les blocs ; renvoyé par la méthode Minecraft.events.pollBlockHits().

 
Sélectionnez
blockEvent = mc.events.pollBlockHits()

IX-A. type

Image non disponible Image non disponible .type

Type d'événement de bloc. Il n'y a qu'un seul type d'événement défini pour l'instant : BlockEvent.HIT

 
Sélectionnez
blockEventType = blockEvent.type

IX-A-1. Types d'événements 

0 : BlockEvent.HIT

IX-B. pos

Image non disponible Image non disponible .pos

La position du bloc où l'événement a eu lieu, c'est-à-dire le bloc qui a été frappé. .pos renvoie un objet Vec3 de coordonnées x, y et z.

 
Sélectionnez
blockEventPos = BlockEvent.pos

IX-C. face

Image non disponible Image non disponible .face

La face du bloc où l'événement a eu lieu.

 
Sélectionnez
blockEventFace = BlockEvent.face

IX-D. entityId

Image non disponible Image non disponible .entityId

Identifiant d'entité du joueur à l'origine de l'événement de bloc, autrement dit le joueur qui a frappé le bloc.

 
Sélectionnez
blockEventPlayer - BlockEvent.entityId

X. Vec3

La définition d'un vecteur de trois valeurs dans Minecraft. Il s'agit d'un ensemble de trois coordonnées x, y et z. Les coordonnées x et z sont les coordonnées dans le plan horizontal, et y est la coordonnée verticale (altitude).

 
Sélectionnez
position = vec3.Vec(0,0,0)

X-A. x

Image non disponible Image non disponible .x

Position selon l'axe des x

 
Sélectionnez
xPos = position.x

X-B. y

Image non disponible Image non disponible .y

Position selon l'axe des y

 
Sélectionnez
yPos = position.y

X-C. z

Image non disponible Image non disponible .z

Position selon l'axe des z

 
Sélectionnez
zPos = position.y

XI. Notes de la rédaction de Developpez.com

Ce guide de l'API Python pour Minecraft Pi est une traduction de la référence API Minecraft écrit par Martin O'Hanlon. Des informations supplémentaires sont disponibles sur la page Minecraft de l'auteur.

Nous remercions les membres de la Rédaction de Developpez pour le travail de traduction et de relecture qu'ils ont effectué, en particulier :

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

En complément sur Developpez.com

  

Licence Creative Commons
Le contenu de cet article est rédigé par Martin O'Hanlon et est mis à disposition selon les termes de la Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 3.0 non transposé.
Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright © 2013 Developpez.com.