# Environnements de dveloppement > Delphi > Codes sources  tlcharger >  [FMX] Jeu de plateforme en 2D

## gbegreg

Bonjour,

Dans ce nouveau projet, je vous propose un petit jeu de plateforme  l'ancienne (en 2D) ralis avec Delphi et Firemonkey.
Le zip joint contient l'excutable (pour Windows), les graphismes (ne sont pas de moi, vous trouverez les informations dans le fichier readme.txt prsent dans le zip), un niveau (fichier json) et les sources du projet.

Je n'ai utilis que les composants fournis en standard avec Delphi (ralis sous Delphi Sydney) et aucun moteur de jeu. Ce projet permet de voir plusieurs choses :
- lecture d'un fichier JSON (qui contient toutes les informations du niveau);
- scrolling parallax (dfilement sur plusieurs plans);
- gestion des plateformes (fixes ou animes);
- gestion des ennemis;
- gestion des animations;
- le joueur incarne un petit renard qui peut se dplacer vers la droite ou la gauche (avec les flches du clavier), se baisser (flches du bas) et sauter (touche espace).

L'objectif est d'arriver  la fin du niveau en ayant rcupr les 5 rubis prsents dans le niveau. Il vous faudra viter des ennemis. Attention si vous les touchez, vous perdrez une vie et vous recommencerez au dbut du niveau. Vous pourrez trouver des cerises. Si vous avez au moins une cerise, vous pouvez vous faire toucher une fois par un ennemi : vous perdrez alors vos cerises mais pas de vie et vous ne recommencerez pas au dbut du niveau.

Les graphismes que j'ai pris sont bass sur des tiles de 16x16 pixels. La fiche est donc dimensionne arbitrairement  400x224 pixels (soit 25 tiles par ligne et 14 lignes) et sa taille n'est pas modifiable  l'excution. Par dfaut dans le code, j'ai positionn une variable scale  2. Cela va multiplier  par 2 l'affichage. Vous pouvez modifier cette valeur mais plus vous allez grossir, plus les graphismes seront grossis et donc moins beau (avis personnel).

Voici une capture d'cran du jeu :


Et voici le ZIP : FMXPlateformer.zip

Enjoy  ::):

----------


## Paul TOTH

excellent, a me rappelle mon GameKit pour Turbo Pascal  ::): 

http://tothpaul.free.fr/sources.php?bp7.gamekit

----------


## pprem

Excellent ! Merci pour le partage.

Il manque l'unit uGBEImageUtils dans les sources, mais je suppose que a correspond  https://github.com/gbegreg/GBE3D/blo...ImageUtils.pas ?

Je me suis plong dans tes sources pour voir comment tu avais fait et j'ai des questions sur les raisons de tes choix de composants, comment tu as dessin le niveau pour en faire un JSON, pourquoi tre pass par une animation (ide gniale) plutt qu'un thread ou timer...

S'il y a de la demande par ici, te sentirais tu de faire un live sur Twitch en Zoom avec partage d'cran pour montrer le jeu, expliquer le code et en discuter ?

----------


## gbegreg

Bonjour Patrick,

Je viens de corriger le zip : j'ai rajout l'unit manquante. Effectivement cette unit est fournie avec mes composants GBE3D mais je viens de la rajouter quand mme dans le zip pour celles et ceux qui ne voudraient pas installer GBE3D.

Ce projet est un exemple qui demande  tre amlior. J'ai utilis uniquement des composants standards pour montrer qu'il tait possible de raliser de petits jeux sans avoir recours  un moteur particulier (certes bien plus puissant mais aussi plus lourd). En tant que dveloppeur, c'est ce qui est sous le capot qui m'intresse  ::): 
De plus, en montrant que la cration de jeux peut tre facile avec Delphi, je me dis que a peut attirer de nouvelles personnes...

Ce projet est donc une bauche qui pourrait me servir de base pour faire des jeux en 2D (plateformes, shoot them up...  scrolling horizontal ou vertical) lors de futures gamejams par exemple  :;): 
Le fait d'externaliser entirement la configuration d'un niveau dans un fichier  part permettrait par exemple de fournir un jeu gratuitement puis de facilement proposer de nouveaux niveaux via une option d'achat "in-app" (tant qu' faire, on ne sait jamais  ::):  )

Le fichier json a t fait manuellement, mais l'objectif est de faire un logiciel qui gnre ce fichier pour constituer les niveaux facilement. D'ailleurs la constitution du fichier json doit respecter quelques rgles et le gnrer via un outil permettrait d'tre certain que le fichier json produit respecte bien ces rgles.

En gros, le fichier json contient :
- les proprits du niveau;

- la position du joueur au dpart (en X et Y);

- la gravit  appliquer (cela influence les sauts);

- les diffrents scrollings  afficher (l'image qui sera associe au plan, sa vitesse de dplacement par rapport  la vitesse de dplacement du joueur, sa position, son chelle, et le zorder). Pour le zorder, il y a une rgle : il faut dclarer dans le fichier json les plans dans l'ordre suivant : de celui le plus au fond  celui le plus proche de l'cran. Le zorder 0 correspond au plan du niveau o seront placer le joueur, les dcors, les bonus, les ennemis et les plateformes. Un zorder positif indique que le plan sera en arrire plan par rapport au plan du niveau et un zorder ngatif indique que le plan sera devant le plan du niveau.

- les plateformes possibles (plateformElement). Pour chaque plateforme, on indique dans "image" les indices des tiles constituant la plateforme. Les tiles tant des blocs de 16x16 pixels de l'image dfinie dans "tileImage". Dans cette version, une plateforme ne peut faire qu'une hauteur de 1 tile... On peut galement prciser le style de la plateforme (seul le paramtre 2 est pris en compte dans cette version). J'ai t optimiste j'ai prvu que les tiles pouvaient avoir de nombreux styles (voir l'enum TTileStyle) mais je n'ai gr pour le moment que le style TTileStyle.blocHaut (l'indice 2)). Ce style sert pour la dtection des collisions et le TTileStyle.blocHaut signifie que seul le haut du tile est  prendre en compte lors de la dtection de collision. Enfin, pour les plateformes, on peut dfinir une animation. Dans ce cas, une syntaxe particulire est ncessaire : les paramtres de l'animation sont spars par des ":". Le premier paramtre correspond la proprit de l'animation (x l'animation se fera sur la proprit position.X de la plateforme, y l'animation se fera sur la proprit position.Y de la plateforme, o l'animation se fera sur la proprit opacity de la plateforme etc...), le second paramtre est la dure de l'animation, le troisime correspond  la valeur de fin de l'animation,le 4me est linterpolation  utiliser, le 5me le type d'animation, le 6me est un flag "loop" ou "noloop" et indique si l'animation boucle indfiniment ou non et le 7me est aussi un flag "autoreverse" ou "noautoreverse" indiquant si l'animation s'inverse ou non  la fin.

- les lments de dcors (decorElement). Il s'agit d'image qui ne sont pas dans l'image "tileImage" mais qui seront affiches sur le plan du niveau;

- les bonus (bonusElement) il s'agit d'image et plus particulirement d'une animation TBitmapListAnimation. Il faut indiquer le fichier d'image, le nombre d'image constituant l'animation et la dure de l'animation souhaits;

- les ennemis (ennemiElement) il s'agit l aussi de TBitmapListAnimation auquel on peut ajouter une autre animation (deplacement : mme syntaxe que les animations d'une plateforme). Il peut y avoir 2 fichiers images  renseigner par exemple dans le cas ou l'ennemi devra faire demi tour;

- la dfinition du niveau (niveau) qui contient 4 sous lments :
   * "decor" o chaque lment du dcor est spar par un ";" et est constitu de 3 valeurs spares par des ":" : la premire est l'indice de "decorElement", la seconde est l'indice de la ligne o il sera plac (par dfaut, il y a 14 lignes chaque ligne faisant une hauteur de 16 pixels), la troisime est l'indice en X (sachant que lpar dfaut aussi il s'agit de bloc de 16 pixels de large). Il y a une petite astuce concernant la premire valeur : si on met T25 par exemple, alors on n'ira pas chercher l'image dans "decorElement" mais a sera dans la "tileImage" qu'on ira chercher la 25 me tile. 
   * "plateformes" mme principe que pour le dcor sauf que l on va indiquer o placer les plateformes. Pour chaque plateforme on va indiquer son indice dans "plateformeElement" puis sa position en Y et X (toujours en multiple de tileSize soit 16 pixels dans l'exemple);
   * "bonus" vous l'aurez devin, c'est la mme chose mais pour placer les bonus;
   * "ennemis" vous l'aurez devin, c'est la mme chose pour placer les ennemis;

Cela n'est pas trs vident  expliquer comme a et a fait un gros pav  lire...

L'utilisation des animations est trs pratique et elles sont dj "threades".

Pas de souci si a intresse du monde pour un live sur Twitch  ::): 

J'ai mis une petite vido du jeu sur ma chaine Youtube :

----------


## gbegreg

Et pour info, mon meilleurs temps pour finir le niveau est de 45 secondes  ::):

----------

