2017-05-24 2 views
1

Ma question est très semblable à cela, mais je ne pouvais pas travailler tout à fait dehors, comme le calcul doit être un peu différent: https://gamedev.stackexchange.com/questions/65800/when-storing-voxels-in-chunks-how-do-i-access-them-at-the-world-levelGet bloc voisin qui existe dans un morceau différent

Je suis en train de retirer quelques visages de blocs. J'ai du mal à trouver comment obtenir un bloc si c'est en dehors du segment actuel.

J'ai une classe Chunk qui garde la trace de ses propres blocs. Pour tester, mes morceaux sont 2 x 2, qui contient 4 blocs chacun, tous solides.

class Chunk { 

    private Blocks[,,] blocks; 

    public Vector3 position; 

    public Chunk(Vector3 world_pos){ 
     position = world_position; 

     // Loops for populating blocks array... 
     ... 

     // Create mesh 

     for(...){ 
      for(...){ 
       for(...){ 
        Block block = GetBlock(x, y, z + 1); // Chance of this block being outside of this chunk 
       } 
      } 
     }  
    } 

    public Block GetBlock(int x, int y, int z){ 
     ... 

     // If block is not in this chunk, use global GetBlock instead 
    } 

} 

I ont une méthode à l'intérieur du bloc appelé « getBlock » qui tente d'obtenir un bloc sur la base des x, y, z et la position. Si les index sont hors de portée, j'appelle alors un "getBlock" global qui tente de trouver le bloc et le bloc à l'intérieur de celui-ci. C'est là que je me bats.

Ceci est ma méthode "getChunk" (pas mon code, trouvé dans un tutoriel), ce qui semble bien se passer.

public Chunk getChunk(int x, int y, int z){ 
    float s = CHUNK_SIZE; 
    float d = CHUNK_DEPTH; 

    int posx = Mathf.FloorToInt(x/s) * CHUNK_SIZE; 
    int posy = Mathf.FloorToInt(y/d) * CHUNK_DEPTH; 
    int posz = Mathf.FloorToInt(z/s) * CHUNK_SIZE; 

    Chunk chunk = null; 

    this.chunks.TryGetValue(new Vector3(posx, posy, posz), out chunk); 

    return chunk; 
} 

Voici mon "getBlock" global.

public Block getBlock(int x, int y, int z){ 
    Chunk chunk = this.getChunk(x, y, z); 
    Block block; 

    if(chunk == null){ 
     block = Block_Types.AIR; 
    } else { 

     // Need to work out the block position I want here 

     int posx = x; 
     int posy = y; 
     int posz = z; 

     block = chunk.getBlock(posx, posy, posz); 

    } 

    return block; 
} 

Voici une photo si elle aide:

Picture

Merci

+0

Cela serait vraiment bénéfique de creuser dans le code de morceau de Minecraft. Essentiellement, vous devez modifier les valeurs xyz des coordonnées du monde en coordonnées de morceau. – Draco18s

Répondre

0

Diviser la position globale par CHUNK_SIZE et prendre le reste en position locale du morceau. Vous pouvez utiliser l'opérateur modulo (%) pour que:

x = posx % CHUNK_SIZE; 
y = posy % CHUNK_SIZE; 
z = posz % CHUNK_SIZE; 

par exemple

0/2 = 0; r = 0; 
1/2 = 0; r = 1; 
2/2 = 1; r = 0; 
3/2 = 1; r = 1; 
4 = 2 = 2; r = 0; 
5 = 2 = 2; r = 1; 
+0

Mon problème est d'obtenir la position du bloc monde, je pense. Si je fais getBlock (0, 0, 0 - 1), et qu'un morceau existe, comment puis-je le convertir en (0, 0, 3). – JacketPotatoeFan

+0

@JacketPotatoeFan Je ne vois pas de problème ici. Lorsque vous passez vos coordonnées du monde '(x, y, z)' à la fonction 'getBlock', vous trouvez le morceau correspondant. À ce stade, soit vous avez le bloc qui contient votre bloc, soit le bloc est nul - impliquant que vous êtes hors limites. Vous faites alors ce que j'ai dit dans ma réponse qui convertit les coordonnées du monde en coordonnées locales. Vous avez maintenant une référence directe au bloc qui vous intéressait. – Iggy

+0

Mes coordonnées de bloc ne sont pas des coordonnées mondiales. J'ai besoin de me convertir aux coords du monde, puis de me convertir aux coords locaux pour le morceau que je vérifie. Je suis en train d'essayer de supprimer le gros plus à l'intérieur des 4 morceaux http://i.imgur.com/cbwJiRi.png – JacketPotatoeFan