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...

