2017-06-26 8 views
0

最近、C++をもっと使い始めました。私はJavaを学ぶときに行ったことのクローンである基本的なボクセルゲームを作成しています。マップ内に格納されたクラスのコール関数

メインゲームループは、Worldクラスのdraw()メソッドを呼び出し、すべてのチャンクをループし、チャンクの描画メソッドを呼び出します。メモリの使用量を節約し、非正方形の世界を持たせるために、チャンクはチャンクの位置を格納するクラスであるマップに格納されます(chunk space)。私は一度だけ呼び出されると仮定されたチャンクメッシュを構築するためのコードが呼び出されているので、私は現在、mapchunks.draw()関数を呼び出しています方法が正しくないと信じ

(チャンクスペースは基本的にchunkx = floor(worldx/chunksize)です)何度も。

世界の描画機能:

void World::draw() { 
    std::map<ChunkPosition, Chunk>::iterator it = chunks.begin(); 
    while (it != chunks.end()) { 
     ChunkPosition pos = it->first; 
     Chunk chunk = it->second; // I think I may need to use a pointer here somehow 

     chunk->draw(); 
     it++; 
    } 
} 

チャンクの描画機能:

void Chunk::draw() { 
    if(build){ // should only "build" the mesh once, is initialized to true 
     build = false; 

     ... mesh building code that is not relevant ... 

     std::cout << verticeSize << std::endl; // this is called every loop cycle instead of once 

     mesh.build (vertices, verticeSize, indices, indiceSize); 
    } 

    mesh.draw(); // draw the mesh every cycle 
} 

そしてここでは、チャンク・クラスの構造

class Chunk { 
    private: 
     static const int size = 25; 
     std::map<Location, Block> blocks; 
     Mesh mesh; 
     bool build = true; 
    public: 
     void setBlock (Location, Block&); 
     void setBlock (int, int, int, Block&); 
     Block *getBlock (Location); 
     Block *getBlock (int, int, int); 
     bool hasBlock (Location); 
     bool hasBlock (int, int, int); 
     void draw(); 
}; 

である私はchunksに単一のチャンクを持っていますポジションは(0,0,0)です。それに関する他のすべては、質問とは無関係です。

+1

'チャンクのチャンク= IT->第二;'コピーを避けるには 'Chunk&chunk = it-> second;'でなければなりません。 – Jarod42

答えて

2

一つの問題は、ここでマップに保存されているチャンクのコピーを作っているということです。

Chunk chunk = it->second; 

あなたが代わりに参照にアクセスする必要があります。これは次のように行うことができる。

Chunk& chunk = it->second; 

使用するのが容易であり得る範囲ベースの代わりにループのための複雑なwhileループ:

for (auto& chunk : chunks) chunk.second.draw(); 
+0

ありがとうございます!私はそれが起こっていたが、完全に参照を忘れていたと仮定:) –