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();
}

但是,在这种情况下,您仍然必须对向量的每个元素调用 delete,因为您为每个元素调用了 new。

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 回答