Monde généré aléatoirement.

Bonjour,

Comment je pourrai créer un monde 2d entièrement rempli de carré qui sont collés ? (dans le même principe que terraria).

Comment, après avoir fait cela, pouvoir y générer des espaces à l’intérieur qui se généreront aléatoirement ?

(Concrètement, je voudrais un monde rempli de carrés, qui auront l’aspect de roche, et des grottes générées aléatoirement dedans ^^). Le reste je verrai ;p

Merci :stuck_out_tongue:

Je me suis toujours demander comme faire un terrain de cette sorte :slight_smile:

Comme ça on est deux ^^

Basiquement, en utilisant l’expression Random(x) pour avoir un nombre entre 0 et x, ce qui permet ensuite de choisir par exemple un élement de décor au hasard. Ensuite, on répète ceci pour tous les élements à créer.
Si on veut un peu d’homégénéité, il faut utiliser des techniques additionnelles, à vous de voir selon votre problème. ( On peut imaginer par exemple d’éviter de créer des arbres dans des espaces grottes ).

Voyez l’exemple LaserAndZombies par exemple.

Merci :smiley: Par contre, j’ai compris ce que tu voulais dire mais concrètement je vois pas trop comment faire … Si tu pouvais me montrer précisément ce qu’il faut faire, ce serait top ^^
(sans vouloir paraître pour un assisté :stuck_out_tongue: )

_Tu fait un grand tableau X par Y
_Dans chaque case tu fais un random(n) → ou n est le nombre d’éléments de décor différent

Mais ça c’est très basique parce que ça peut donner des incohérences, genre un bloc de terre flottant en l’air.

Il faut donc rajouter plein de techniques de contrôle :
_par exemple un horizon (quand y < n1, il n’y a que du sol, quand n1< Y n2, il y a du sol et de l’air, n2 < Y, il n’y a que de l’air)
_un contrôle des bloc orphelins (un bloc doit être relié à au moins un ou deux blocs du même type)
_placer des salles pré crées, sans quelles se chevauchent ou se retrouvent à des endroits impossibles
_faire pousser des arbres sur le sol
_etc…

Comment tu fait le tableau X par Y ?

Ca peut être simplement une série d’objet que tu créé de façon régulière.

Tu peux aussi le stocker dans un fichier xml genre

<monde> <x1> <y1></y1> <y2></y2> <y2></y2> <x1> <x2> <y1></y1> <y2></y2> <y2></y2> <x2> <x3> <y1></y1> <y2></y2> <y2></y2> <x3> </monde>

Ou encore tu fait appel à l’extension tableaux de Victor → viewtopic.php?f=4&t=2364

L’extension n’est pas faite pour gérer des objets en tableaux, mais bien des données en mémoire sous forme de tableaux. :wink:
Enfin, si tu l’utilises et que tu as besoin d’aide, n’hésite pas. :slight_smile:

J’ai fait un petit bout de code qui permet de généré une grille, on peut choisir le nombre d’objet sur une ligne et le nombre de ligne.
Et j’ai utilisé les effets pour différencié l’objet, donc les deux première ligne en partant du haut ont un effet on va dire qu’il représente l’air.
ensuite a la ligne 3 il y a un random() celui ci va nous dire l’effet qu’il y aura, donc air ou normal
Le hic est que je ne vois pas comment regroupé les objet ayant un même effet.
Si deux objets sont séparé par de l’air il faudrait changer celui ci en normal. Histoire d’avoir un terrain pas trop hard.

Une idée ?

[attachment=0]Sans titre.png[/attachment]

Merci pour vos réponses, je pense que je vais réussir ;p

Edit: en fait, non ^^ …

J’ai fait ça: imagup.com/data/1141314471.html [/IMG][/URL]

Normalement, cela devrait créer 5 blocs aléatoirement sur la carte qui seront espacés au maximum de 100 non ?

@Victor :
Personnellement je n’utilise pas tableau (je n’en ai pas besoin)
Cependant, j’avais dans l’idée de :
_D’abord générer on truc genre : int mapMonde[nx][ny] → ou nx et ny représentent les limites de la carte, chaque case du tableau contenant un ID correspondant au type de terrain
_On enregistre tout ça dans un xml, sinon faut se taper la génération à chaque fois
_ensuite on a une série d’évents qui affichent le monde

Tableau peut servir pour la première étape je suppose ?

Oui, il y a les tableaux à 2 dimensions pour faire cela. :wink:

Donc afficher la map est un jeu d’enfant avec des blocs carrés :

il faut :
_un tableau : map[x][y] qui contient les ID du type de terrain
_une variable taille : la taille en px de l’image d’un bloc
_Deux tant que pour parcourir le tableau en x et y
_Récupérer l’ID dans le tableau et prendre le bon type de bloc
_Afficher le bloc en pos(x * taille, y * taille)

pour créer le terrain il faut faire plusieurs passages (exemple sur un terrain de 50 par 50
_parcourir chaque case du tableau (deux boucles)
_au dessus d’une certaine hauteur (y entre 0 et 10) → que du ciel
_en dessous que de la terre
→ on a l’horizon on peut stocker le 10 dans une variable pour laisser l’utilisateur mettre ce qu’il veut

pour les collines, on peut peut-être utiliser le raisonnement suivant :

Pour des collines d’une hauteur de y blocs
_à y (c’est à dire juste au dessus de l’horizon) il y a y-1 chances (random) qu’il y ait un bloc de terre
_au dessus (à y-1 donc) il y a y-2 chances qu’il y ait un bloc si et seulement si il y a un bloc juste au dessous
_etc…
->ainsi on construit des collines avec de moins en moins de bloc à chaque etape et aucun bloc ne flotte en l’air

On peut avoir un exemple sous forme de projet ?

Je mets à jour GD et je vois ce que je peux faire…

Edit :
_GD accepte des bout de code c++, question : est-il utile en termes de performances de passer la génération du monde à un
petit bout de code ? (mes arguments pour viennent du fait que, 1 : ce n’est pas un processus graphique, 2 : c’est très largement dans mes capacités)

_Question 2 : y-a-t-il quelque part une docu sur l’extension tableaux ?

_Question 3 : Comment faire communiquer un éventuel bout de code avec l’extension tableaux ?

Pourriez vous juste m’expliquer comment faire un carrelage ou chaque carré se colle, déjà ça j’y arrive pas …

Pour le moment, les fonctionnalités relatives au C++ ne sont pas au point ( et ne doivent plus fonctionner depuis GD2 ), une remise à plat de celles ci viendra peut être dans les prochaines versions.

bon j’abandonne ^^