我有一个名为Object的类,它具有以下属性:xPos和yPos。它还具有这些属性的getter和setter。我有另一个名为CollisionDetector的类,它有一个名为detect的函数,它接收两个对象并检测它们是否已经发生碰撞。如果有,则使用setXPos()和setYPos()函数将它们彼此推开。但是,它并没有改变价值观,我试图找出原因?
Object::Object(){
}
Object::Object(float x, float y) { //constructor
xPos = x;
yPos = y;
}
float Object::getXPos(){
return xPos;
}
float Object::getYPos(){
return yPos;
}
void Object::setXPos(float temp){
xPos = temp;
}
void Object::setYPos(float temp){
yPos = temp;
}
char Object::getType(){
return type;
}
bool CollisionDetector::detect(Object a, Object b){
double size = 45; //Set size
double xPosition = a.getXPos() - b.getXPos();
double yPosition = a.getYPos() - b.getYPos();
double sumRadius = (size/2 + 1) + (size/2 + 1);
double radiusSquared = sumRadius * sumRadius;
double distanceSquared = (xPosition * xPosition) + (yPosition * yPosition); //square the distances
if (distanceSquared <= radiusSquared)
{
//Check for collisions between tanks
if(a.getType() == 't' && b.getType() == 't'){
if(a.getXPos() > b.getXPos()){
a.setXPos(a.getXPos() + 10);
}
else if(a.getXPos() < b.getXPos()){
a.setXPos(a.getXPos() - 10);
}
//Same for y direction
if(a.getYPos() > b.getYPos()){
a.setYPos(a.getYPos() + 10);
}
else if(a.getYPos() < b.getYPos()){
a.setYPos(a.getYPos() - 10);
}
}
return true;
}
return false;
}
从main使用调用该函数: collisionDetector.detect(userTank,enemyTank);
答案 0 :(得分:2)
bool CollisionDetector::detect(Object &a, Object &b)
你必须像在上面的例子中那样给函数提供实际的Object作为参考。
现在您正在创建变量的副本,因此您不会修改原始变量。
不同的可能选项是指向对象的指针,如:
bool CollisionDetector::detect(Object *a, Object *b)
只需与reference
一起搜索关键字pointer
和c++
,您就会找到大量关于它的文章和教程。
解释一切都超出了范围。
答案 1 :(得分:0)
我在上面的评论中是正确的 - 看看这个功能 -
bool CollisionDetector::detect(Object a, Object b)
您将对象作为值传递,因此它们被复制到其他位置,并且函数在此副本上运行。如果要更改原始对象,请通过指针或引用传递它们
指针:bool CollisionDetector::detect(Object* a, Object* b)
参考:bool CollisionDetector::detect(Object &a, Object &b)