Source:EditeurHeightmaps.dbp
Un article de Games Creators Network.
Ceci est un éditeur de heightmaps automatique. Il crée des images heightmap aléatoires de 512x512 pixels en fonctions de paramètres que vous lui donnez. Voici un petit mode d'emplois :
- Nombre d'images à créer : vous pouvez créer plusieurs images utilisant les mêmes paramètres à la suite. Entrez toutefois au minimum 1, sinon le programme se terminera dès le dernier paramètre entré.
- Nombre minimum de boîtes : Le programme commence par dessiner un certain nombre de rectangles sur une image de 128x128 pixels. a position ainsi que les niveaux de gris des rectangles sont aléatoires. Entrez ici le nombre minimum de boîtes à dessiner.
- Variation aléatoire du nombre de boîtes : Le programme va ajouter un nombre aléatoire de boîtes à celui entré précédemment. Par exemple, si vous avez entré 100 comme nombre minimum de boîtes et 50 comme variation aléatoire, le programme dessinera entre 100 et 150 boîtes.
- Taille minimum des boîtes : Si vous désirez un paysage assez cahotique, demandez plutôt une taille minimum basse. La taille des boîtes est choisie aléatoirement mais de manière à ce qu'elle ne soit jamais inférieure à cette valeur.
- Variation de la taille des boîtes : Si vous avez choisi une taille minimale de 10 et que vous entrez ici 15, toutes vos boîtes auront une taille variant de 10 à 15 pixels.
- Nombre de crevasses : En plus de faire un paysage aléatoire à l'aide de boîtes, le programme dessine un certain nombre de "crevasses". Ce sont des lignes noires dont les extrémités sont placées aléatoirement sur la carte. Lors du traitement de l'image brute, ces lignes feront des dépressions. Entrez le nombre de crevasses souhaité.
- Nombre de lignes par crevasse : Ne tracer qu'une seule ligne ne donnerait, au final, pas grand chose. C'est pourquoi le programme dessine un certain nombre de lignes ayant les extrémités très proches pour chaque crevasse. Plus vous mettez de ligne, plus la crevasse sera marquée.
- Mettre une bordure : La personne m'ayant demandé de lui faire ce programme voulait qu'il y ait automatiquement une marge noire d'une trentaine de pixels. Si vous désirez aussi une marge, écrivez 1, sinon 0.
- Nombre de blur : Une fois les boîtes et les crevasses dessinées, la première image - celle de 128x128 - subit plusieurs fois de suite un effet de flou (blur bitmap n,5). Entrez le nombre de flous à effectuer.
- Nombre de filtre 1 : Jusque là, on avait une image de 128x128 pixels, mais il faut la faire passer en 512x512. Pour ce faire, un nouveau bitmap est crée et un pixel sur 4 coloré. Ensuite, tous les autres pixels sont colorés avec la couleur moyenne des pixels se trouvant directement à leur gauche, droite, haut et bas. C'est un peu "tordu" et difficile à expliquer, mais cette manoeuvre est effectuée plusieurs fois. Je vous conseille de commencer avec une valeur comprise entre 10 et 20. Vous pouvez remarquer que les pixels sont colorés en rouge ; j'avais sûrement une bonne raison de faire ainsi, mais j'ai bien peur d'avoir oublié pourquoi.
- Nombre de filtre 2 : Presque la même chose, mais cette fois avec tous les pixels les entourant directement. Le but de cette manoeuvre est de rendre l'image plus "lisse" sans avoir recours à la commande blur bitmap.
- Nombre de filtre 3 : Le filtre 3 est un blur bitmap. Il sert à "finaliser" l'image. Grâce aux autres filtres, vous n'avez pas besoin de mettre beaucoup de filtre 3 ; deux ou trois devraient largement suffir.
- Puissance du filtre 3 : C'est le second paramètre de la commande blur bitmap.
- Chemin du dossier où sauvegarder les heightmaps : Le nom dit tout. Si vous entrez un chemin inexistant, le programme plante malheureusement.
Et voici la source :
set text font "arial",1 randomize timer() set text size 18 input "Nombre d'images à créer> ",nbr_img input "Nombre minimum de boîtes> ",nbr_box input "Variation aléatoire des boîtes> ",nbr_box2 input "Taille minimum des boîtes> ",tmin input "Variation de la taille des boîtes> ",tvar input "Nombre de crevasses> ",crev input "Variation du nombre de crevasses> ",crev2 input "Nombre de ligne par crevasse> ",crev3 input "Var. du nombre de ligne par crevasse> ",crev5 input "Mettre une bordure (1 ou 0)> ",bordure input "Nombre de blur> ",nbr_blur input "Nombre de filtre 1> ",f1 input "Nombre de filtre 2> ",f2 input "Nombre de filtre 3> ",f3 input "Puissance du filtre 3 (1 - 5)> ",p3 input "Chemin du dossier où sauvegarder les heightmaps> ",path$ `réglages divers set display mode 800,600,32 sync on sync rate 0 `deux-trois variables utilisées plus loin dim hauteur(128,128) as float dh as float for image=1 to nbr_img `création d'une petite image de 128x128, car il est plus `aisé de faire certaines opérations sur de petites images if bitmap exist(2)=1 then delete bitmap 2 create bitmap 2, 128, 128 set current bitmap 2 cls nbr_box3 = nbr_box+rnd(nbr_box2) `dessin des boîtes for t=1 to nbr_box3 set window title "Box "+str$(t)+"/"+str$(nbr_box3) c = rnd(255) x = rnd(128) y = rnd(128) w = tmin+rnd(tvar) h = tmin+rnd(tvar) ink rgb(c,c,c),0 box x,y,x+w,y+w next t crev4 = crev + rnd(crev2) `dessin des crevasses ink 0,0 for t=1 to crev4 set window title "Crevasse "+str$(t)+"/"+str$(crev4) x1 = rnd(128) y1 = rnd(128) x2 = rnd(128) y2 = rnd(128) crev6 = crev3 + rnd(crev5) for u=1 to crev6 line x1+rnd(20)-10,y1+rnd(20)-10,x2+rnd(20)-10,y2+rnd(20)-10 next u next t `on la rend floue for t=1 to nbr_blur print "Blur "+str$(t)+"/"+str$(nbr_blur) blur bitmap 2, 5 if image exist(1) then delete image 1 get image 1, 0, 0, 128, 128,1 set current bitmap 0 CLS paste image 1, 0,0 sync set current bitmap 2 next t `modification de la hauteur de manière à ce que `le relief soit plus important mini = 255 maxi = 0 for x=0 to 128 for y=0 to 128 hauteur(x,y) = rgbr(point(x,y)) if hauteur(x,y)<mini then mini = hauteur(x,y) if hauteur(x,y)>maxi then maxi = hauteur(x,y) next y next x dh = 255/((maxi-mini)*1.0) for x=0 to 128 for y=0 to 128 hauteur(x,y) = (hauteur(x,y)-mini)*dh next y next x `on la recopie dans celle de 512x512, mais comme `elle est plus petite, il ne faut colorer qu'un `pixel sur 4, donc remplir les autres en faisant `un dégradé linéaire if bitmap exist(1)=1 then delete bitmap 1 create bitmap 1, 512, 512 for t=1 to f1 set window title "Premier filtre : "+str$(t)+"/"+str$(f1) lock pixels for x=1 to 128 for y=1 to 128 ink rgb(hauteur(x,y),hauteur(x,y),hauteur(x,y)),0 dot 4*x, 4*y next y next x unlock pixels if image exist(1) then delete image 1 get image 1, 0, 0, 512, 512, 1 set current bitmap 0 CLS paste image 1, 0, 0 sync sync set current bitmap 1 if escapekey()=1 then end `ici le dégradé lock pixels for x=1 to 512 for y=1 to 512 if modulo(x, 4)<>0 or modulo(y, 4)<>0 c = (rgbr(point(x-1,y)) + rgbr(point(x+1,y))+ rgbr(point(x,y-1)) + rgbr(point(x,y+1)))/4 dot x, y, rgb(c,0,0) endif next y next x unlock pixels next t `après, il faut rendre ça plus lisse... for t=1 to f2 set window title "Second filtre : "+str$(t)+"/"+str$(f2) if image exist(1) then delete image 1 get image 1, 0, 0, 512, 512, 1 set current bitmap 0 CLS paste image 1, 0, 0 sync sync set current bitmap 1 lock pixels for x=1 to 512 if escapekey()=1 then end for y=1 to 512 c = (rgbr(point(x-1,y)) + rgbr(point(x+1,y))+ rgbr(point(x,y-1)) + rgbr(point(x,y+1)) + rgbr(point(x-1,y-1)) + rgbr(point(x+1,y-1)) + rgbr(point(x-1,y+1)) + rgbr(point(x+1,y+1)))/8 dot x, y, rgb(c,0,0) next y next x unlock pixels next t `en niveaux de gris c'est mieux lock pixels for x=0 to 512 for y=0 to 512 c = rgbr(point(x,y)) dot x,y,rgb(c,c,c) next y next x unlock pixels `et un peu de blur pour terminer for t=1 to f3 set window title "Troisième filtre : "+str$(6-t)+"/5" blur bitmap 1, p3 next t if bordure=1 ink 0,0 box 0,0,512,25 box 0,0,25,512 box 512-25,0,512,512 box 0,512-25,512,512 endif if image exist(1) then delete image 1 get image 1, 0, 0, 512, 512, 1 CLS set current bitmap 0 paste image 1, 0, 0 sync sync `sauvegarde if right$(path$,1)<>"\" then path$ = path$ + "\" if file exist(path$+str$(image)+".jpg") then delete file path$+str$(image)+".jpg" save image path$+str$(image)+".jpg",1 next image function modulo(v as integer, m as float) v1 as float v1 = v v1 = v1 / m v2 as integer v2 = v / m v1 = v1 - v v2 = int((m * v1)+0.3) endfunction v2

