Source     Discussion     Modifier     Historique     Forums     Salon IRC

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

 

Rechercher
Installer l'extension de recherche Plus d'informations

 

Comprendre
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin

 

Partager
La connaissance est la seule chose qui s'accroit lorsqu'on la partage. - Sacha Boudjema

 

Créer
L'imagination est plus importante que la connaissance. - Albert Einstein

 

 

Le wiki en images Le wiki en images Image du mois: «Snowball: un prototype de jeu développé avec NeL.