M@d_Doc Modérateur
Messages : 6600 Localisation : 47°44'8.04 Projet Actuel : aucun
| Sujet: Structure en chunk à la Minecraft Ven 16 Déc 2011 - 19:44 | |
| Cet exemple montre le fonctionnement des chunks, soit des structures imbriquées. C'est le genre de 'trucs' utilisés par minecraft pour gérer les blocs affichés/calculés: on les regrouppe dans des chunks, et on ne calcule que les chunks proches. ça permet d'éviter d'avoir des arrays/matrix/structures très grandes et impossible à gérer. Le code aussi commenté que nécessaire (d'après moi, hein), et en français(les commentaires, pas le code) Télécharger le gmk 8.0screens: position 1: position 2: près du bord, il y a plus de chunk a afficher :O Si vous avez une version antérieur de gm, voilà les scripts : - Spoiler:
create_terrain - Code:
-
//create_terrain(rows,lines,size) globalvar terrain,gridSize,positionX,positionY;
//on garde en mémoire le milieu du terrain positionX = round(argument0/2); positionY = round(argument1/2);
gridSize = argument2; //on commence par enregistrer l'id de la grid principale dans une variable global, plus facilement réaccessible. terrain=ds_grid_create(argument0,argument1);
/*
on passe dans chaque case de la grid, et on créer une ds_list dedans. bref, chaque case sera associée à une liste. Dans cette liste, on stocke l'id de toutes les autres structures utilisées pour définir le chunk.
*/
//association des listes for(i=0;i<argument0;i+=1) { for(j=0;j<argument1;j+=1) { ds_grid_set(terrain,i,j,ds_list_create()); } } //remplissage des listes /* Ici, il faut définir au préalable une certaine structure, pour toujours définir de la même façon tous les chunks.
Il s'agit d'un exemple simple, on va donc essayer de limiter les informations contenues dans le chunk. On va donc créer une grille de 32x32 (soit la taille du chunk), donc chaque case contiendra une couleur aléatoire-> ça représente le 'type' de bloc contenu sur chaque case du chunk On va ajouter deux variables contenant l'etat (actif/inactif), une transparence(0-1),... et ça suffit pour un exemple.
*/
for(i=0;i<argument0;i+=1) { for(j=0;j<argument1;j+=1) { //on récupère l'ID du chunk listID = ds_grid_get(terrain,i,j); ds_list_insert(listID,0,ds_grid_create(gridSize,gridSize));//et hop, l'ID d'une grid de 32*32 est à présent dans la liste ds_list_add(listID,true);//true signifie ACTIF ds_list_add(listID,random(1));//alpha //tant qu'on y est, on va tout de suite mettre les couleurs aléatoires dans la grille du chunk: //1) on récupère l'ID de la grille gridID = ds_list_find_value(listID,0); //2) on boucle, et badaboum: for(X=0;X<32;X+=1) { for(Y=0;Y<32;Y+=1) { color=make_color_rgb(random(255),random(255),random(255)); ds_grid_set( gridID , X , Y , color ); } } } } jump - Code:
-
/* jump(x,y)
deplace la position (positionX,positionY) à l'endroit désigné sur le terrain. ça permet de définir les chunks affichés
*/
positionX=round(max(min(ds_grid_width(terrain)-1,argument0),0)); //on limite la position entre 0 et le dernier index du terrain. Et au cas où, on arrondi. positionY=round(max(min(ds_grid_height(terrain)-1,argument1),0)); move - Code:
-
/* move(x,y)
deplace la position (positionX,positionY) à l'endroit désigné sur le terrain, en relatif. ça permet de définir les chunks affichés
*/ positionX+=argument0; positionY+=argument1 positionX=round(max(min(ds_grid_width(terrain)-1,positionX),0)); //on limite la position entre 0 et le dernier index du terrain. Et au cas où, on arrondi. positionY=round(max(min(ds_grid_height(terrain)-1,positionY),0)); draw_terrain - Code:
-
/* L'exemple ne sert qu'à montrer le principe des chunks: normalement, il faut charger/liberer la mémoire, mais on se contente de n'afficher que les chunks qui (théoriquement) sont actifs.
*/
distance = 3 //distance de visibilité des chunks. Ca signifie que l'on voit '3 chunks plus loin' que là où se trouve positionX,positionY. Bref, ça donne un carré de 7*7=49 chunks //bah oui : 1 dans lequel on se trouve, puis 3 de chaque côté, élevé au carré! Pour donner un exemple, minecraft calcul 21*21 chunks en même temps, soit //10 chunks de distance.
xMin = max(positionX-distance,0); yMin = max(positionY-distance,0);
xMax = min(positionX+distance,ds_grid_width(terrain)-1); yMax = min(positionY+distance,ds_grid_height(terrain)-1);
for(X=xMin;X<=xMax;X+=1) { for(Y=yMin;Y<=yMax;Y+=1) { //on chope l'id de la grille des couleurs du chunk concerné colorMap = chunk_get_colorMap(X,Y); //on chope la transparence alpha = chunk_get_alpha(X,Y); //et on affiche le tout, la position étant relative aux coordonnées du chunk, d'où le X*32 et Y*32 draw_primitive_begin(pr_pointlist); //on va afficher un nuage de point. C'est déjà franchement très lent sous GM, alors il faut à tout prix le faire via une primitive, //c'est toujours ça de gagné. for(i=0;i<32;i+=1) { for(j=0;j<32;j+=1) { color = ds_grid_get(colorMap,i,j); //on cherche la couleur de chaque pixel du chunk dans sa colorMap draw_vertex_color(i+X*32 , j+Y*32 , color,alpha); //et zou, on affiche tout} } } draw_primitive_end(); } } chunk_get_colorMap - Code:
-
/*
chunk_get_colorMap(x,y)
retourne l'id de la grille de couleur du chunk placé en x,y si la coordonnée est valide.
*/
if (argument0<0 || argument1<0 ) || (argument0>ds_grid_width(terrain)-1 || argument1>ds_grid_height(terrain)-1) return -1;
return ds_list_find_value(ds_grid_get(terrain,argument0,argument1),0);//0, c'est l'index de la liste où se trouve l'ID de la grille de couleur chunk_get_alpha - Code:
-
/*
chunk_get_alpha(x,y)
retourne l'alpha du chunk placé en x,y si la coordonnée est valide.
*/
if (argument0<0 || argument1<0 ) || (argument0>ds_grid_width(terrain)-1 || argument1>ds_grid_height(terrain)-1) { return -1; }
return ds_list_find_value(ds_grid_get(terrain,argument0,argument1),2);//2, c'est l'index de la liste où se trouve la valeur alpha.
Sinon, il faut une room d'au moins 640*640 pour tout voir, un peu plus c'est mieux. Placez-y un seul objet, avec dans le create : - Code:
-
create_terrain(20,20,32); dans draw: - Code:
-
draw_terrain(); dans step(accessoire, sert à se déplacer): - Code:
-
if keyboard_check_pressed(vk_up){move(0,-1);} if keyboard_check_pressed(vk_down){move(0,1);} if keyboard_check_pressed(vk_right){move(1,0);} if keyboard_check_pressed(vk_left){move(-1,0);} _________________ Tous les icones de gm utilisables sur le cbna ICI
Dernière édition par M@d_Doc le Ven 16 Déc 2011 - 22:40, édité 1 fois |
|
onilink_ Modérateur
Messages : 9178 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Structure en chunk à la Minecraft Ven 16 Déc 2011 - 20:08 | |
| m@doc et les ds_list, une grande histoire d'amour :p |
|
M@d_Doc Modérateur
Messages : 6600 Localisation : 47°44'8.04 Projet Actuel : aucun
| Sujet: Re: Structure en chunk à la Minecraft Ven 16 Déc 2011 - 20:30 | |
| à défaut d'avoir du c++ devant moi, je m'amuse bien avec les structures de GM :p C'est d'ailleurs le seul moyen que j'ai trouvé pour garder de bonnes performances avec de 'gros' projets ^^ _________________ Tous les icones de gm utilisables sur le cbna ICI |
|
Invité Invité
| Sujet: Re: Structure en chunk à la Minecraft Ven 16 Déc 2011 - 22:25 | |
| dommage que je n'ai pas gm un screenshot siouplet ? |
|
M@d_Doc Modérateur
Messages : 6600 Localisation : 47°44'8.04 Projet Actuel : aucun
| Sujet: Re: Structure en chunk à la Minecraft Ven 16 Déc 2011 - 22:40 | |
| C'est rajouté, mais il y a pas grand chose à voir...
_________________ Tous les icones de gm utilisables sur le cbna ICI |
|
Oculus Utilisateur confirmé: Rang *****
Messages : 1688
| Sujet: Re: Structure en chunk à la Minecraft Ven 23 Déc 2011 - 21:17 | |
| Ah c'est super par un moment je cherchais un système comme ça. |
|
Contenu sponsorisé
| Sujet: Re: Structure en chunk à la Minecraft | |
| |
|