我遇到了一个超出我知识范围的问题。我正在处理一个 HGE 项目,但这是一个 c++ 问题,而不是 HGE 引擎本身。
问题: 我想在 5 只不同的海龟上创建一个包含 3 种不同动画的二维数组。但是,我需要在 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();
}
最佳答案
首先,你必须决定你的对象是在栈上还是堆上。由于它们是对象,您可能希望将它们放在堆上,这意味着您的 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();
}
不过,在这种情况下,您仍然需要对 vector 的每个元素调用 delete,因为您为每个元素都调用了 new。
ATurtle::~ATurtle() {
std::vector<hgAnimation*>::iterator i, end=myAnimations.end();
for (i=myAnimations.begin(); i!=end; ++i) {
delete (*i);
}
}
关于c++动态二维数组不使用默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16428048/