Article     Discussion     Modifier     Historique     Forums     Salon IRC

Les heightmaps avec dark basic

Un article de Games Creators Network.


Qu'est-ce qu'un fichier heightmap ? C'est une image grise représentant la hauteur d'un terrain. Plus un pixel est clair, plus l'endroit du sol y correspondant sera élevé. Vous comprendrez mieux en suivant ce tutoriel.

Remarque : Il est possible que le résultat soit moins bon si votre affichage est en 16 bits.


[modifier] Comment créer un fichier heightmap ?

Il existe diverses méthodes, j'expliquerai la plus simple qui consiste à en dessiner un aléatoirement.

La méthode que je trouve la plus réussie est de créer un bitmap dont les dimensions correspondent au nombre de tiles de la matrice puis d'y dessiner de manière aléatoire des boîtes et des traits de différents tons de gris. Voici ce que cela donne :

tilesx = 100
 tilesz = 100
 create bitmap 1, tilesx, tilesz
 set current bitmap 1
 for t=1 to 200
 	rem les tons de gris...
 	c = rnd(255)
 	ink rgb(c,c,c),0
 	rem les boîtes et les lignes
 	x = rnd(tilesx)
 	y = rnd(tilesz)
 	box x,y,x+rnd(tilesx*0.25), y+rnd(tilesz*0.25)
 	line rnd(tilesx), rnd(tilesz), rnd(tilesx), rnd(tilesz)
 next t
 get image 1, 0, 0, tilesx, tilesz, 1
 set current bitmap 0
 delete bitmap 1
 cls rgb(255,0,0)
 paste image 1, 0, 0
 wait key

Comme vous pouvez le constater, le résultat n'est pas génial. Le but d'un fichier heightmap est d'avoir un beau sol, avec des pentes douces, fluides. C'est là qu'intervient la commande blur bitmap. Essayons de rendre le bitmap de plus en plus flou... Ajoutez ceci à la ligne 15 (après le next t):

for t=1 to 10
 		blur bitmap 1, 5
 next t

Le temps de chargement est beaucoup plus long, par contre le résultat est bien mieux. Nous avons notre heightmap. Facile, non ?

Il vous suffit d'ajouter un code sauvegardant l'image pour pouvoir les conserver.

[modifier] Et ensuite ?

Ensuite, il faut faire une matrice et lui donner les hauteurs en fonction du fichier heightmap. Pour ce faire, il faut récupérer la couleur de chaque pixel avec la commande point et en sortir la composante de rouge avec rgbr. Pourquoi le rouge ? Parce que les deux autres auraient exactement le même effet et il faut bien en choisir une.

Voici ce que cela donne :

sync on
 sync rate 50
 tilesx = 100
 tilesz = 100
 create bitmap 1, tilesx+2, tilesz+2
 set current bitmap 1
 for t=1 to 200
 	rem les tons de gris...
 	c = rnd(255)
 	ink rgb(c,c,c),0
 	rem les boîtes et les lignes
 	x = rnd(tilesx)
 	y = rnd(tilesz)
 	box x,y,x+rnd(tilesx*0.25), y+rnd(tilesz*0.25)
 	line rnd(tilesx), rnd(tilesz), rnd(tilesx), rnd(tilesz)
 next t
 for t=1 to 10
 		blur bitmap 1, 5
 next t
 rem création de la matrice
 make matrix 1, 1000, 1000, tilesx, tilesz
 for x=0 to tilesx
 	for z=0 to tilesz
 		couleur = point(x+1,z+1)
 		hauteur = rgbr(couleur)
 		set matrix height 1, x, z, hauteur
 	next z
 next x
 update matrix 1
 get image 1, 0, 0, tilesx, tilesz, 1
 set current bitmap 0
 delete bitmap 1
 rem gestion de la caméra
 debug = mousemovex()-mousemovey()
 do
 	paste image 1, 0, 0
 	xrotate camera wrapvalue(camera angle x()+mousemovey())
 	yrotate camera wrapvalue(camera angle y()+mousemovex())
 	move camera upkey()-downkey()
 	sync
 loop

Si vous ne vous sentez pas l'âme de Farinet et que la montagne est trop escarpée, vous pouvez toujours multiplier hauteur par un nombre inférieur à 1. Si, par contre, vous n'aimez pas vivre en plaine, multipliez par un nombre supérieur à 1. Attention, dans ce cas-là, il faudra déclarer hauteur en tant que float.

Et si vous désirez vraiment une énorme différence de hauteur entre le minimum et le maximum, essayez donc de mettre la hauteur à la puissance 1.5...

 

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.