2012-03-31 13 views
0

Ich arbeite an Voxel-basierten Spiel-Engine, in denen ich Stücke haben muss. Ich habe versucht, eine Chunk-Klasse aus Minecraft zu lesen, aber ich kann es nicht verstehen. Von Chunk ich meine: 16x16x256 Array von BlöckenWie erstellt man einen Chunk in der 3D-Welt?

Also meine Frage ist: Wie Chunk funktioniert und wie speichert es Daten?

+0

Nicht jeder hier in die Minecraft Codebasis gelesen hat, kann ein Stück alles von einem Stück Speicherpuffer zu einer geometrischen Struktur zu etwas völlig anders sein. Was ist der Brocken, auf den du dich beziehst? Was versuchst du zu machen. Was hast du bisher versucht? Können Sie uns Ihren nicht arbeitenden Code zeigen? – datenwolf

+0

Ich habe keinen Code nicht arbeiten, weil ich nicht einmal verstehe, wie ich es tun sollte. – TheMorfeus

+0

@datenwolf Ein Chunk ist im Zusammenhang mit Voxel Grafiken im Allgemeinen glaube ich nicht nur minecraft spezifischen –

Antwort

1

Durch chunk i bedeuten: 16x16x256 Array von Blöcken

Nun, die dann eine gewisse geometrische Struktur entzieht. Wenn dies ein Spiel von Micraft ist, dann ist entweder ein Block gefüllt oder er ist leer. Willst du, dass diese Blöcke von verschiedenen Typen sind, oder nur "da" oder "nicht da"?

Nehmen wir an, der Einfachheit halber wollen Sie 2^CHAR_BIT verschiedene Zustände für einen Block haben (CHAR_BIT ist 8 auf den meisten Systemen). Der Zustand 0 bedeutet leer. So können Sie diese Blöcke in einem Array der Struktur speichern

char chunk[16][16][256]; 

Sie können dies in einer Klasse kapseln.

class Chunk 
{ 
private: 
    char chunk[16][16][256]; 
} 

Natürlich Ihre Welt von mehr als einem Klumpen besteht, werden Sie wahrscheinlich Ihre Stücke in einem Raster anordnen, wobei jede Gitterzelle einen Chunk nimmt

class ChunkGrid 
{ 
private: 
    std::list<Chunk> chunks; 

Und für sicher, dass Sie auch wollen diese Chunks in einer räumlichen Unterteilung Struktur zu organisieren, so dass Sie schnell Brocken Index auf ihre Position in der Welt abhängig, arbeitet ein Octree wunderbar für die

class ChunkOctree 
    { 
    private: 
     union Fork 
     { 
      ChunkOctree *branch; 
      Chunk *leaf; 
     }; 
     Fork forking[2][2][2]; 
    } 

Sie werde als Ich möchte, dass einige Funktionen diese Struktur durchqueren, aber ich überlasse die Forschung Ihnen als Lernerfahrung. Ich habe dir viele Schlüsselwörter gegeben, nach denen du die Interwebs durchsuchen kannst.

} 
+0

Großartig, aber ist das sogar Java? – TheMorfeus

+0

dort gibt es bereits ein C++ Tutorial. Deshalb habe ich Frage unter Java-Tag gestellt. – TheMorfeus

+1

@TheMorfeus: Betrachten Sie diesen Pseudocode. Konzeptionell gibt es keinen Unterschied zwischen C++, Java oder D bezüglich dieser Dinge. Als Lerner ist es für Sie wichtig, dass Sie über die verwendete Sprache hinaus schauen und die zugrunde liegenden Konzepte und Datenstrukturen verstehen. – datenwolf