0

OpenGLで描画するには、すべてを操作する必要があるため、C++で20個のオブジェクトの配列を作成する必要があります。

私はもう試した:

Animal::Cat *_listCats[20];

次に、座標でそれらを初期化する必要があります。コンストラクターとセッターがあります

Cat(float _x, float _y) :
 _xOffSet(_x), _yOffSet(_y) {}


void CatCoordinates(float x, float y){
_xOffSet = x;
_yOffSet = y;
    }

そして、私はOpenGLで猫を描く方法を持っています

void DrawCat() 
{
...do things...
 }

Catは名前空間Animalの特定のクラスであり、別のファイルから呼び出します。問題は、私がsigsevsを持っていて、20匹の猫を作成し、それらをシクルで効率的に描く方法がわからないことです。

4

3 に答える 3

1

20オブジェクトの配列が必要な場合は、次を使用できstd::arrayます。

#include <array>

std::array<Animal::Cat, 20> listCats_; // leading _ reserved for implementation

C++11 をサポートしていない場合は、TR1 バージョンを使用できます。

#include <tr1/array>

std::tr1::array<Animal::Cat, 20> listCats_;
于 2013-03-06T10:18:08.253 に答える
1

その配列は単なるポインタの配列です。への20 個のポインタがありAnimal::Catます。Animal::Cat指し示すオブジェクトは与えられず、ポインタはどこにも指していません。それらが実際のAnimal::Catオブジェクトを指すようにするにはnew Animal::Cat()、ポインター要素ごとに実行してそれらを割り当てる必要があります。

for (int i = 0; i < 20; i++) {
  _listCats[i] = new Animal::Cat();
}

このnew式はオブジェクトを動的に割り当て、Animal::Catそのポインタを提供します。これを配列内のポインタに割り当てることができます。

ただし、動的に割り当てられたメモリをまったく使用しない方がはるかに優れています。次のように変更するだけです。

Animal::Cat _listCats[20];

Animal::Catこれにより、すぐに使い始めることができる本物のオブジェクトである20 の配列が得られます。

または、C++ 標準ライブラリのコンテナーを使用すると、さらに安全になります。アンstd::array<Animal::Cat, 20>はここで完璧です。

于 2013-03-06T10:18:29.757 に答える
0

正確に 20 人のメンバーが特に必要ですか? 法線ベクトルを使用してオブジェクトを保存し、必要に応じて成長させることができます。正確な数は必要ないと思います。

また、一部のコンパイラでは std::array を見逃す可能性があるため、 vector で問題ない場合があります。利点は、ファイルから、またはいくつかの構成ファイルに基づいて、各猫データを読み取る方が簡単になることです。

    #include <vector>

    std::vector<Animal::Cat *> cats;

    void createCats()
    {
      using namespace Animal;

      Cat *cat1 = new Cat(1, 2);
      // load image or some data maybe?
      cats.push_back(cat1);

      Cat *cat2 = new Cat(3,4);
      cats.push_back(cat2);

      // unless data loading is needed.
      cats.push_back(new Cat(5,6));
      cats.push_back(new Cat(7,8));
    }

    void DrawAllCats()
    {
      for (unsigned i=0; i< cats.size(); i++) {
        cats[i]->DrawCat();
      }
    }

    // because cats are allocated dynamically, they will not be destroyed on vector destructor.
    // use delete or smart pointers (std::auto_ptr)
    void destroyCats()
    {
      for (unsigned i=0; i<cats.size(); i++) {
        delete cats[i];
        cats[i] = NULL;
      }
    }

Java などの言語とは異なる C++ オブジェクトについて少し勉強することをお勧めします。参照は指定した場合にのみ存在し、オブジェクトはコピー、参照渡し、またはポインターによるポイントが可能です。

たとえば、 std::vector の猫を使用できます。ただし、パラメーターなしでコンストラクターを定義する必要があります。http://www.cplusplus.com/doc/tutorial/pointers/を参照してください。

于 2013-03-06T10:50:37.403 に答える