Shiro 🍬 a changé de compte pour @shiro@social.mochi.academy :
82f10a09517a7fc0

Shiro 🍬 @Shiro@witches.town

Petit down du retour alors je vais me coucher.
Prenez soin de vous.

Shiro 🍬 partagé
Shiro 🍬 partagé
Shiro 🍬 partagé

Et un dernier truc pour vous donner une idée : je sais que les jeux avancés à ce niveau là (genre Dwarf Fortress) génère 3 bruit de perlin différents (en simplifié) et les superposent.

1 pour l'altitude, 1 pour la température et 1 pour l'humidité.

Résultat on a une combinaison super varié de terrains (je vais pas tous les faire) :

- altitude moyenne, humide, chaud : jungle
- haute altitude, pas d'humidité, froid : sommet rocheux

Je vous laisse deviner pour le désert, la plaine, etc ... :)

Shiro 🍬 partagé

[NSFW] Le feu avait eu raison de nous.

Shiro 🍬 partagé

Un autre algo super connu que j'ai pas encore utilisé c'est le "diamond square" que j'ai pas taffé assez pour expliquer correctement mais ça donne des résultats rigolo aussi :

(il est pas super compliqué, je l'ai juste plus en tête)

Shiro 🍬 partagé

Dans les trucs rigolo à faire en plus y a : la formation des rivières.

Un algo du genre c'est de partir des points localements les plus hauts au dessus d'un certain seuil (genre là où y de la neige) puis de faire couler l'eau où à chaque point où on est, on regarde lequel est le plus bas autour de nous et s'arrêter quand on touche la mer.

Résultat ça peut faire des lacs aussi :)

Shiro 🍬 partagé

libristux Afficher plus

Shiro 🍬 partagé

Pour donner quelques informations en plus : c'est un peu la base de la génération aléatoire, à partir de ça tout est énormément une question de tweakage, de trouver les nouveaux algos, les nouvelles fractals et co pour bien s'amuser, c'est un domaine très vaste que je connais mal, en tout cas c'est très marrant :)

Shiro 🍬 partagé

Et le code si vous voulez jouer avec : gist.github.com/Psycojoker/e28

Jupyter notebook, l'util en ligne que j'ai utilisé pour ça jupyter.org/

La librairie noise: github.com/caseman/noise (normalement c'est "pip install noise" dans un virtualenv mais la distribution en python :/)

Pillow pillow.readthedocs.io/en/lates

Shiro 🍬 partagé
Shiro 🍬 partagé

Il suffit maintenant de définir des couleurs pour chaque niveaux qu'on veut dans notre carte 😋

Là c'est la partie où vous vous amusez et vous définissez ce que vous voulez :)

J'ai rajouté:

- de l'eau moins profonde
- une plage
- des plaines (vertes)
- de la forêt
- des montagnes
- des sommets eneigés

À vous de faire comme vous voulez \o/

Shiro 🍬 partagé
Shiro 🍬 partagé

Maintenant : comment on transforme ça en carte aléatoire de jeux vidéo ?

Et ben en fait c'est super simple (la partie difficile est finite) : chaque point de l'image est une valeur entre 0 et 255, il suffit de se dire qu'en fait, ça représente l'altitude de notre carte.

Par exemple : si on décide qu'entre 0 et 100 c'est le fond de la mer, on peut remplacer tous ces points par du bleu foncé et ça donne ça:

(j'ai du un peut changé le code pour avoir un variable color)

Shiro 🍬 partagé

Et pour l'example, avec 4 variations différentes d'octaves pour vous donner une idée:

Shiro 🍬 partagé

"Mais c'est tout aussi aléatoire que avant !" Vous allez me répondre.

Et bien : presque oui, en fait il faut encore un peu tweaker tout ça car l'aléatoire c'est 3 tonnes de tweakage.

Heureusement la réponse est déjà dans l'exemple (moche) de la librairie (qui se trouve ici github.com/caseman/noise/blob/) : il faut diviser i et j par une "fréquence" pour réduire l'aléatoire.

Et boum: on vient de refaire le filtre photoshop "nuages" \o/

Shiro 🍬 partagé

Donc maintenant qu'on a notre formule magique trouvé dans l'exemple de la librairie ("bibliothèque" :blobcat:) que tout le monde utilise (les gens codent comme ça hein, vous faites pas d'illusions 😋) on remple notre "randint" par ça pour avoir un joli résultat :blobcat:

Shiro 🍬 partagé

Quelques explications en plus: la librairie va toujours renvoyer la même valeur pour les mêmes "i et j" en entrée.

Ici j'ai mis "43" et "13" au pif pour donner un exemple.

"octaves" c'est un paramètre qu'on va faire varier sans trop se préoccuper de ce que ça signifie vraiment mais ça change le résultat et on va juste changer ça pour en avoir un qu'on aime.

Problème ici: le nombre est compris entre -1 et 1 et on en veut un entre 0 et 255, donc on doit quand même faire un peu de maths :oh_no:

Shiro 🍬 partagé

Donc, comme on est en python et qu'on est des fleimasses et que coder le bruit de perlin à la main c'est chiant car c'est plein de math et les maths c'est chiant, on utilise une librairie qui fait déjà tout pour nous 😋

La librairie s'appelle "noise" (le "import noise").

Malheureusement elle a une API très moche et une doc pas facile à comprendre.

Ici j'ai suivit un exemple trouvé dans la librairie, on utilise "snoise2" qui prend 2 coordonnées en entrée (les i et j de notre image):