Jac*_*les 12 c++ collision-detection allegro collision
我一直在研究这几个小时,但没有用.基本上我有
struct rectangle {
int x, y, w, h;
};
rectangle player::RegionCoordinates() // Region Coord
{
rectangle temp;
temp.x = colRegion.x + coordinates.x;
temp.w = colRegion.w;
temp.y = colRegion.y + coordinates.y;
temp.h = colRegion.h;
return temp;
}
// Collision detect function
bool IsCollision (rectangle * r1, rectangle * r2)
{
if (r1->x < r2->x + r2->w &&
r1->x + r1->w > r2->x &&
r1->y < r2->y + r2->h &&
r1->y + r1->h > r2->y)
{
return true;
}
return false;
}
//blah blah main while loop
if (IsCollision(&player1.RegionCoordinates(), &stick1.RegionCoordinates())) //ERROR
{
player1.score+=10;
stick1.x = rand() % 600+1;
stick1.y = rand() % 400+1;
play_sample(pickup,128,128,1000,false);
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?我确信这是非常明显的事情,但对于我的生活,我无法弄明白.
Rei*_*ica 15
RegionCoordinates()按值返回对象.这意味着调用RegionCoordinates()返回一个临时实例rectangle.正如错误所说,您正在尝试获取此临时对象的地址,这在C++中是不合法的.
为什么IsCollision()还要指点?通过const引用获取参数会更自然:
bool IsCollision (const rectangle &r1, const rectangle &r2) {
if (r1.x < r2.x + r2.w &&
r1.x + r1.w > r2.x &&
r1.y < r2.y + r2.h &&
r1.y + r1.h > r2.y) {
return true;
}
return false;
}
//blah blah main while loop
if (IsCollision(player1.RegionCoordinates(), stick1.RegionCoordinates())) //no error any more
{
player1.score+=10;
stick1.x = rand() % 600+1;
stick1.y = rand() % 400+1;
play_sample(pickup,128,128,1000,false);
}
Run Code Online (Sandbox Code Playgroud)
由于IsCollision取a,rectangle *而您要在此处取结果的地址:
if (IsCollision(&player1.RegionCoordinates(), &stick1.RegionCoordinates()))
Run Code Online (Sandbox Code Playgroud)
你最有可能是返回一个rectangle回从RegionCoordinates()它是一个临时变量,因为以后会消失if语句完成。如果将的结果分配给RegionCoordinates()变量,则该变量将不再是临时变量,然后可以获取其地址:
rectangle r1 = player1.RegionCoordinates() ;
rectangle r2 = stick1.RegionCoordinates() ;
if (IsCollision(&r1, &r2))
Run Code Online (Sandbox Code Playgroud)
或者,您可以将参数作为const参考,这将是更C ++的方式:
bool IsCollision (const rectangle &r1, const rectangle &r2)
Run Code Online (Sandbox Code Playgroud)
考虑到您遇到的错误类型,我必须假设RegionCoordinates()按值返回对象,从而导致创建临时对象,并且您正在获取该临时对象的地址。
地址运算符需要左值作为其操作数,但您将其应用于右值(临时值是rvalues)。
您可以这样做(如果您不使用 C++11,请替换auto为 返回的类型RegionCoordinates):
auto rcPlayer1 = player1.RegionCoordinates();
auto rcStick1 = player1.RegionCoordinates();
if (IsCollision(&rcPlayer1, &rcStick1)) //ERROR
{
player1.score+=10;
stick1.x = rand() % 600+1;
stick1.y = rand() % 400+1;
play_sample(pickup,128,128,1000,false);
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以进行更改IsCollision,以便它接受引用而不是指针,正如 Angew 在他的回答中所建议的那样。