1

私の知識を超えた問題が発生しました。私は HGE プロジェクトに取り組んでいますが、これは C++ の問題であり、HGE エンジン自体ではありません。

質問: 5 つの異なるタートルで 3 つの異なるアニメーションを持つ 2D 配列を作成したいと考えています。ただし、HGE で次のようなコンストラクターを使用する必要があります。turtleAnim[i] = new hgeAnimation( turtleTexture, 6, 6, 0, 0, 110, 78 )

でもやり方がわからない!interwebz のすべての例は、デフォルトのコンストラクターを取得したかのように問題を処理します。このようなもの:

クラスで:

#define     TURTLECOUNT     5
#define     TURTLEANIMATIONS    3

private:
hgeAnimation** turtleAnim;

.cpp で

turtleAnim= new hgeAnimation*[TURTLECOUNT];

for(int i=0; i<TURTLECOUNT; i++)
{
    turtleAnim[i]= new hgeAnimation[TURTLEANIMATIONS]; // Uses default constructor. I don't want that cuz it doesn't exists.
    turtleAnim[i]->Play();
}
4

1 に答える 1

1

まず、オブジェクトをスタックまたはヒープのどちらに配置するかを決定する必要があります。これらはオブジェクトであるため、おそらくヒープに配置する必要があります。つまり、2D 配列には 3 つの星があり、次のようにアニメーションにアクセスします。

hgAnimation* theSecondAnimOnTheFourthTurtle = turtleAnim[4][2];
theSecondAnimOnTheFourthTurtle->DoSomething();

それが必要な場合は、最初にポインターのマトリックスを作成します。

hgeAnimation*** turtleAnim = new hgeAnimation**[TURTLECOUNT];

その後、タートルをループできます。タートルごとに、アニメーションへのポインターの配列を作成します。その配列の各要素に対して、アニメーション自体を作成します。

for (int turt=0; turt<TURTLECOUNT; ++turt) {
   turtleAnim[turt] = new hgeAnimation*[TURTLEANIMATIONS];
   for (int ani=0; ani<TURTLEANIMATIONS; ++ani) {
      turtleAnim[turt][ani] = new hgeAnimation(parameter1, par2, par3);
   }
}

それが難しいように見える場合は、すべての配列を削除するのも面倒です。

for (int turt=0; turt<TURTLECOUNT; ++turt) {
   for (int ani=0; ani<TURTLEANIMATIONS; ++ani) {
      delete turtleAnim[turt][ani];
   }
   delete[] turtleAnim[turt];
}
delete[] turtleAnim;

これがトリッキーであるという事実は、おそらくもっと簡単な設計方法があることを示す良い兆候です。

次のようなメンバーを持つタートル クラスはどうでしょうか。

class ATurtle {
  private:
    std::vector<hgeAnimation*>   myAnimations;

次に、クラスのコンストラクターで、アニメーションを作成するために必要なことを何でも行うことができます。

ATurtle::ATurtle(par1, par2, par3) {
    myAnimations.push_back( new hgeAnimation(par1, x, y) );
    myAnimations.push_back( new hgeAnimation(par2, z, a) );
    myAnimations.push_back( new hgeAnimation(par3, b, c) );
}

そうすれば、単一の配列でタートルを作成できます。

ATurtle* turtles[TURTLECOUNT];
for (int t=0; t<TURTLECOUNT; ++t) {
    turtles[t] = new ATurtle(par1, par2);
}

タートル クラスでは、次のようにアニメーションにアクセスします。

(*(myAnimations.at(1)))->DoSomething();

また

std::vector<hgAnimation*>::iterator i, end=myAnimations.end();
for (i=myAnimations.begin(); i!=end; ++i) {
    (*i)->DoSomething();
}

ただし、すべての要素に対して new を呼び出したので、この場合でも、ベクトルの各要素に対して delete を呼び出す必要があります。

ATurtle::~ATurtle() {
   std::vector<hgAnimation*>::iterator i, end=myAnimations.end();
   for (i=myAnimations.begin(); i!=end; ++i) {
       delete (*i);
   }       
}
于 2013-05-07T22:14:34.887 に答える