【发布时间】:2021-09-09 18:06:58
【问题描述】:
所以最近,我一直在努力将数组传递给函数(如下所述)。我的问题是,当我传递一个数组时,只有数组的第一个元素才能正常工作(用 cout 显示)。而且,对象“Enemy”是“Obj”的子对象。
创建一系列敌人:
const int eN = 2;
Enemy enemyArray[eN];
for (int i = 0; i <eN; i++) {
enemyArray[i].creating("abc.png", Type::ENEMY);
enemyArray[i].position = Vector2f(x, y);
enemyArray[i].loadChasePoint();
enemyArray[i].number = i + 100;
enemyArray[i].updatePosition();
x += 50; y += 50;
}
包含这个数组的函数:
void Obj::movement(Vector2f mVector, Obj* b, int objsNumber) {
bool collision = false;
position.x = position.x + mVector.x;
for (int i = 0; i < objsNumber; i++) {
if (!(type == Type::NONE)) {
//if (type == Type::PLAYER) { cout<<"Inside: "<< b[1].getSprite().getPosition().x << endl;} Prints "0"
if (isColliding(b[i])) collision = true;
}
}
if (collision == 1) position.x = position.x - mVector.x;
collision = false;
position.y = position.y + mVector.y;
for (int i = 0; i < objsNumber; i++) {
if (!(type == Type::NONE)) {
if (isColliding(b[i])) collision = true;
}
}
if (collision == 1) position.y = position.y - mVector.y;
}
调用该函数:
//cout <<"Outside: "<<enemyArray[1].getSprite().getPosition().x<<endl; Prints actuall position
playerArray[0].movement(mVector, enemyArray, eN);
【问题讨论】:
-
我认为这段代码中关于数组的传递和访问它的元素没有任何问题。那么实际问题是什么?请更具体。
-
附注:
if (collision == 1)应该是if (collision == true)或只是if (collision)。而if (!(type == Type::NONE))应该是if (type != Type::NONE)。另外,不要在每次循环迭代时检查type,因为它不会改变值,您应该完全在循环之外检查它,例如:if (type != Type::NONE)) { for (int i = 0; i < objsNumber; i++) { if (isColliding(b[i])) collision = true; } }运行相同的碰撞循环两次有什么意义呢?你不能把它们合并成一个循环,同时检查position.x和position.y吗? -
您需要另一个级别的间接。即使假设
Enemy是Obj的子类,Enemy的数组在内存中的布局与Obj的数组不同。在数组中找到第二个Obj所需的偏移量与在数组中找到第二个Enemy所需的偏移量不同。 -
我的意思是你是对的,但是应该在每次循环迭代时检查它,就像这样:
for (int i = 0; i < objsNumber; i++) { if (b[i].type != Type::NONE)) { if (isColliding(b[i])) collision = true; } },但这是我的错。正如我所写的,问题在于关于敌人精灵的信息没有正确传递到函数中。我可以提供整个代码,但它有点大(300 行)。另一件可能会有所帮助的事情是我使用 SFML 2.5.1 和 VS 2019。 -
@MilesBudnek 我想我明白你的意思。但是,您能否解释一下如何做到这一点,或者只是提供某种教程的链接?
标签: c++ arrays function object