私はこれを数時間調査してきましたが、役に立ちませんでした。基本的に私は持っています
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);
}
何か案は?それは本当に明白なことだと確信していますが、私の人生ではそれを理解することはできません。
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);
}
IsCollision
は_rectangle *
_を受け取り、ここで結果のアドレスを取得します。
_if (IsCollision(&player1.RegionCoordinates(), &stick1.RegionCoordinates()))
_
rectangle
ステートメントが完了すると消えるので、一時変数であるRegionCoordinates()
からif
を返す可能性があります。 RegionCoordinates()
の結果を変数に割り当てると、一時的なものではなくなり、アドレスを取得できます。
_rectangle r1 = player1.RegionCoordinates() ;
rectangle r2 = stick1.RegionCoordinates() ;
if (IsCollision(&r1, &r2))
_
または、パラメータをconst
参照として取得することもできます。これは、よりC++の方法です。
_bool IsCollision (const rectangle &r1, const rectangle &r2)
_
発生している種類のエラーを考えると、RegionCoordinates()
が値によってオブジェクトを返しているため、temporaryが作成され、その一時的なアドレス。
アドレス演算子には、オペランドとしてlvalueが必要ですが、これをrvalueに適用しています(一時変数は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);
}
あるいは、IsCollision
を変更して、ポインターではなくreferencesを受け入れるようにすることもできます Angewの回答で示唆されているように 。