Créer un map en bloc

Bonjour à tous

J’apporte ici une aide pour les personnes qui m’ont demander comment créer une carte en bloc (style terraria par exemple)
Ce post est autant une réponse qu’une question puisque je vous invite à le compléter et proposer vos solutions.

Je vais donc vous expliquer comment je procède pour créer une map en bloc :

Tout d’abord, la partie théorique : Vous allez d’abord devoir réfléchir à ce que sera votre carte et attribuer à chaque matériau un identifiant.
Par exemple 1 pour la terre, 2 pour la pierre, 3 pour le fer.
Ici je prendrai 3 identifiant pour 3 matériaux différentes : 1 → terre, 2 → bois, 3 → pierre. Si l’identifiant est égal à 0 on sera en présence d’air.

Je vous propose de créer 2 scènes bien distinct, une sera charger de créer la map aléatoirement et l’autre de l’interpréter et de l’afficher à l’écran.
En effet le vrai problème n’est peutêtre pas simplement “comment créer un map en carrés ?”. Cette question apporte plein de nouveaux problèmes, par exemple : comment sauvegarder la carte?, comment la générer aléatoirement? ou encore comment l’afficher à l’écran tout en jouant dessus sans faire buger le jeu?
Autant de problème auquels j’ai étais confronter.

Commençons par la scène de création de la carte :
Ce qui nous amène à une nouvelle question comment faire le liens entre la scène de création et la scène d’affichage?
La réponse à cette question apporte aussi la solution à la question de la sauvegarde.
La carte est créer puis sauvegarder dans un fichier XML, qui sera interprété par la scène d’affichage.

Nous allons donc ici concevoir cette scène qui va générer cette carte aléatoirement :
Nous devons tout d’abord définir la taille de la carte avec les variables largeur et hauteur

largeur = 50 hauteur = 20

Je vous propose d’abord de définir des environnements à la façon de Minecraft qui auront eux aussi un identifiant :
1 → plaine, 2 → montagne, 3 → plaine de glace
Ces environnements auront une taille défini entre 10 et 20 blocs.
On ouvre en écriture un fichier XML qui contiendra la carte

A la façon d’une boucle on va choisir les envirronements :

Pour ma part j’ai aussi un choix des environnements en profondeur mais ça devient beaucoup plus compliqué donc je vous épargne les détailles

Création de la carte en fonction des envirronement :

Voilà pour la création de la carte. Personellement j’ai moi même du mal à comprendre puisque je l’ai fait il y a bientôt eux ans. N’hésitez pas a poser des questions

Attanquons l’interprétation du XML.
La scène de création nous à donner un fichier ressemblant à ceci :

[code]<?xml version="1.0" encoding="ISO-8859-1" ?>



<2 value=“1.000000” />
<3 value=“1.000000” />
<4 value=“1.000000” />
<5 value=“1.000000” />
<6 value=“1.000000” />
<7 value=“1.000000” />
<8 value=“1.000000” />
<9 value=“1.000000” />
<10 value=“1.000000” />
<11 value=“1.000000” />
<12 value=“1.000000” />
<13 value=“2.000000” />
<14 value=“2.000000” />








        </x1>
        <x2>
            <y1 value="0.000000" />
            <y2 value="0.000000" />
            <y3 value="0.000000" />
            <y4 value="0.000000" />
            <y5 value="0.000000" />
            <y6 value="0.000000" />
            <y7 value="0.000000" />
        </x2>


    </bloc2d>
</map>
[/code]

Les lignes de points (…) sont un coupure dans le fichier car celui-ci fait plusieurs centaines de lignes

Interprétons le :smiley:
Dans une nouvelle scène on met un place un algorithme permettant de placer les bloc 1 par 1 :
Attention il beaucoup beaucoup (beaucoup) beaucoup … beaucoup d’algorithme différent pour reconstituer la carte

Ma solution à moi n’est pas adapté pour un jeu style Ultimest Battle ou autre TPS 2D car ma carte est très grande et necessite d’être charger seulement autour du personnage et décharger si on s’éloigne.

Je vous conseille donc de charger la carte comme de la création, c’est a dire ligne par ligne :
L’objet detecteur_2 parcours la carte de 50 pixel par 50 pixel (taille des bloc) et place les blocs si c’est utiles, de cette façon la carte peut etre mise a jour en temps réel.

Voilà j’espère que c’est claire mais j’ai des doute

A vous maintenant de proposer d’autres solutions ou posez toutes vos questions pour vous aidez à comprendre

Je suis désolé de ne pas mettre le fichier source mais comme dit précédemment il a plus de deux ans et donc ne fonctionne plus du tout, impossible de le compiler ou de le tester, je vous ai donner ici une version simplifier car cette version est vraiment complexe et pas du tout optimiser :frowning: N’hésitez pas à me lyncher
Bonne fin de weekend à tous

Merci jvais regarder tout ça :slight_smile: .

Edit: omg c’est compliqué! :astonished:

Oui c’est plutôt compliquer surtout que ma solution nest surrement pas la plus simple
Je vous invite vivement à poser des question si vous souhaitez comprendre

Merci pour tous cela. je vais étudier tous ça après avoir résolut mon problème de connexion Client/serveur