Après cette pause de Noël, je repars pour de nouvelles aventures. Tout d'abord, commençons par quelque chose qui devient habituel, voici la listes des fonctionnalités ajoutées aujourd'hui :
- Le système de visée a été totalement revu (mon frère ayant testé le jeu, il ne trouvait pas ça très naturel). C'est maintenant beaucoup plus intuitif.
- La première arme a été faite (tous les modèles 3D sont susceptibles d'être modifiés/améliorés d'ici la version finale) et intégrée au jeu.
- Le système d'arme est bientôt terminé. Je continue de le peaufiner. Bientôt la possibilité de ramasser des armes sera ajoutée !
Demain, je vais essayer de m'attaquer aux particules (de les approcher du moins), et de terminer le système d'arme. Avec ça je vais commencer la GUI, pour indiquer les munitions restantes, l'arme possédée et la vie de Lil'Gus.
De plus, je voulais vous parler du système de chargement de scène ! En effet, grâce au langage XML, je peux charger le level, avec les différents ennemies etc.. Pour me rattraper de la vidéo que je promet depuis longtemps, j'ai décidé de vous montrer comment je procédais.
Voici en exemple la map de test que j'utilise :
<level>
<scene ambientLight = "0.4"/>
<player file = "gus2.mesh"
posX = "0" posY = "5" posZ = "-20"
scaleX = "1" scaleY = "1" scaleZ = "1"
life = "100"/>
<geometry name = "map1" file = "MapTest2"
posX = "0" posY = "0" posZ = "0"
dat1X = "0" dat1Y = "0" dat1Z = "0"
dat2X = "10" dat2Y = "10" dat2Z = "10"
dataBool = "0">
</geometry>
<light type = "2"
posX = "-0.5" posY = "-1" posZ = "-0.5"
dataX = "0.6" dataY = "0.6" dataZ = "0.6"/>
<spawn ID = "0" posX = "0" posY = "5" posZ = "0" />
<enemyID ID = "0" file = "enemy1.mesh" speed = "75"
scaleX = "1" scaleY = "1" scaleZ = "1"
life = "20"/>
<enemyID ID = "1" file = "enemy1.mesh" speed = "25"
scaleX = "2" scaleY = "3" scaleZ = "2"
life = "50"/>
<enemy ID = "0" spawn = "0" wave = "1" spawnTime = "0"/>
<enemy ID = "0" spawn = "0" wave = "2" spawnTime = "0"/>
<enemy ID = "0" spawn = "0" wave = "2" spawnTime = "1"/>
<enemy ID = "1" spawn = "0" wave = "3" spawnTime = "0"/>
</level>
Pour ceux qui ne sont pas habitué au XML, ça peut sembler compliqué mais en réalité c'est tout simple. Je vais vous l'expliquer ligne par ligne :
Tout d'abord, <level> signifie que nous entrons dans la description de la map, qui se termine à </level>.
<player file = "gus2.mesh"
posX = "0" posY = "5" posZ = "-20"
scaleX = "1" scaleY = "1" scaleZ = "1"
life = "100"/>
Cette balise permet de créer notre joueur. "file" représente le fichier qui permettra de représenter Lil'Gus, "posX/Y/Z" sa position dans le monde 3D, "scaleX/Y/Z" permet de grandir ou de réduire son modèel 3D. Quant à "life", c'est tout simplement la vie initiale de notre héros.
<geometry name = "map1" file = "MapTest2"
posX = "0" posY = "0" posZ = "0"
dat1X = "0" dat1Y = "0" dat1Z = "0"
dat2X = "10" dat2Y = "10" dat2Z = "10"
dataBool = "0">
Grâce à ce code, je crée une "Geometry", qui est en fait une entité physique immobile, comme une maison, ou tout simplement le sol de la map. Les données Pos permettent de la placer, Dat1 de lui faire subir des rotations, dat2 d'en changer la taille, et dataBool est une variable nécessaire à la gestion des ombres.
<light type = "2"
posX = "-0.5" posY = "-1" posZ = "-0.5"
dataX = "0.6" dataY = "0.6" dataZ = "0.6"/>
Comme vous pouvez vous en douter, ceci permet de créer une lumière, de la placer et de lui assigner une couleur. La variable "type" indique de quel type de lumière il s'agit (un spot, une lumière directionnelle ou une lumière ponctuelle).
<spawn ID = "0" posX = "0" posY = "5" posZ = "0" />
Les spawn sont les points d'apparition des monstres. Ainsi, je peux en placer autant que je veux sur ma map. Sa variable "ID" permet de l'enregistrer. Lors de la création d'un ennemi je n'aurai qu'à indiquer l'ID de son point d'apparition.
<enemyID ID = "0" file = "enemy1.mesh" speed = "75"
scaleX = "1" scaleY = "1" scaleZ = "1"
life = "20"/>
Les enemyID et weaponID (qui viendra prochainement) sont en fait des types propres à la map de monstres ou d'armes. Un ennemi ne sera qu'une représentation d'un des enemyID, qui ne sont en réalités que des modèles que l'on reproduira. Ici, j'indique quel sera le modèle 3D de l'ennemi, sa vitesse de déplacement, sa vie initiale et sa taille.
<enemy ID = "0" spawn = "0" wave = "1" spawnTime = "0"/>
Voici donc la façon dont je crée un ennemi. J'indique d'abord l'enemyID que je vais utiliser (la variable ID), l'ID de son point de spawn. Viennent ensuite les variables "wave" et "spawnTime". La première indique la vague d'ennemis à laquelle appartient celui-ci. Une nouvelle vague apparaît quand la précédente est achevée. Le spawnTime indique le temps en seconde avant que l'ennemi apparaisse lors de sa vague.
Voilà ! J'espère que c'est assez clair. Vous savez maintenant comment je procède pour créer mes maps ! Je peux vraiment mettre de tout et n'importe quoi (même si il manque encore certains éléments, et c'est la façon que j'utiliserai pour créer les maps finales.
J'espère que vous m'excuserez pour la vidéo, elle arrivera bientôt. Je préfère vous donner quelque chose de potable, plutôt qu'un truc bâclé.
Ah ciao bonsoir !
C'est impressionnant le XML quand on connait pas xD
RépondreSupprimerSinon, c'est une idée franchement géniale, le coup de l'explication du code.
Ca montre un peu ce que je suis en train de faire :) J'ai hésité à faire la vidéo de suite, mais j'attends encore deux-trois petites choses.
RépondreSupprimerSympa, surtout avec l'explication du code. ;)
RépondreSupprimer