1

オブジェクトの位置を含むテキスト ファイルから配列を読み込んだところ、次のようになりました。

0,0,0,5
0,5,0,0
0,0,5,0
0,5,5,0

オブジェクトは次のようになります。

struct object
{
    int x, y, value;
}

x、y は座標で、値は 1 または 0 です (オブジェクトが「選択」されたかどうかを示します。すべてのオブジェクトの先頭は 1 です)。オブジェクトは配列に格納されobject obj_array[5]ます。

それらを描画するには、次の関数を使用します: (BOARD_Y と BOARD_Y は配列のサイズです。ここでは 4x4 です)

void draw_board(){

    for (int iy = 0; iy < BOARD_Y; iy++) {      
        for (int ix = 0; ix < BOARD_X; ix++) {

            if ( (board[iy][ix] == 5) )
            {
                glPushMatrix();                 
                glTranslatef( ix, iy, 0 );
                glutSolidCube(1);
                glPopMatrix();  
            }
        }
    }
}

そして、それらすべてを完璧に描きます。しかし、オブジェクトの値が 0 の場合 (オブジェクトがプレイヤーによって選択された場合)、オブジェクトの描画をスキップしたいと考えています。これどうやってするの?

4

1 に答える 1

0

わかりました、何が起こっているかわかりました。あなたは物事を少し複雑にしました。このループからだけで任意のオブジェクトにアクセスする方法はありません。かなりばかげた位置の比較は別として:

if ( (board[iy][ix] == 5) ) {
    for (auto const& obj : objects) {
        if (obj.x == ix && obj.y == iy) {
            // obj is the object in given position
            // ...
            break;
        }
    }
}

そうしないでください。

代わりに、ボード上のオブジェクトへの参照を保存します。参考までに(これに限定されません!):

  • 一意のオブジェクト ID
  • オブジェクトへのポインタ

その後、特定のタイルに存在するオブジェクトに、より迅速かつ簡単にアクセスできるようになります。例が必要な場合は、コメントをドロップしてください。ただし、両方のオプションを実装するのはかなり簡単だと思います。

これらの「5」を内部に保持したい場合は、ボードを構造体の配列に変更してください。そしてああ、の代わりに使ってくださいstd::arrayint**

これが例です

using id_t = unsigned;

std::map<id_t, object> objects;

constexpr std::size_t size_x = 4, size_y = 4;
std::array<id_t, size_x * size_y> board;

id0 に等しいということは、オブジェクトがそこにないことを意味すると仮定しましょう。これで、次の方法で特定のオブジェクトにアクセスできます。

unsigned x, y;

id_t obj_id = board[x + size_x * y];

if (obj_id != 0) // is there any object?
    if (objects[obj_id].value != 0) // is its value equal to 0?
        // ...

そしてそれをboard[...] = obj;

すべてのオブジェクトに一意の ID を生成する簡単な方法は、カウンターをインクリメントすることです。

id_t last_id = 1;
objects[last_id++] = obj_id;
于 2013-02-23T15:43:43.327 に答える