私は、衝突がSFMLでどのように動作するかを確認するためのテストを続けました。コードが示すように、マリオは彼が床オブジェクトに触れたときに彼の位置を変更し、床の上にテレポートしますSFMLでの適切な衝突(C++)
if (floor.getGlobalBounds().intersects(SuperMario.getGlobalBounds())) // Floor
{
SuperMario.setPosition(SuperMario.getPosition().x, floor.getPosition().y - SuperMario.getOrigin().y);
IsTouching = true;
}
:私は、このコードのスニペットを作ってきました。
「グリーンボックス」は、私が先に述べた床オブジェクトであることに注意してください。また、画像1の単語「左」を無視して、「右」を意味します。
もちろん、この動作は意図されています(つまりバグではありません)が、望ましくありません。
私の質問です。どうすればこの "副作用"を排除できますか?つまり、私は自分のコードを変更することができます。そのため、Marioはフロアの上を移動しません。私はマリオがボックスに止められて、テレポートされないようにしたい。
UPDATE:だから今、私はこの持っている:
for (unsigned int i = 0; i <= solidObjects.size() - 1; i++)
{
if (solidObjects[i].getGlobalBounds().intersects(SuperMario.getGlobalBounds()))
{
if (SuperMario.getPosition().x - solidObjects[i].getPosition().x < SuperMario.getPosition().y - solidObjects[i].getPosition().y)
{
SuperMario.setPosition(solidObjects[i].getPosition().x - SuperMario.getOrigin().x, SuperMario.getPosition().y);
IsTouching = false;
}
else if (SuperMario.getPosition().y - solidObjects[i].getPosition().y < SuperMario.getPosition().x - solidObjects[i].getPosition().x)
{
SuperMario.setPosition(SuperMario.getPosition().x, solidObjects[i].getPosition().y - SuperMario.getOrigin().y);
IsTouching = true;
}
else if (SuperMario.getPosition().x - solidObjects[i].getTextureRect().width < SuperMario.getPosition().y - solidObjects[i].getPosition().y)
{
SuperMario.setPosition(solidObjects[i].getTextureRect().width + SuperMario.getOrigin().x, SuperMario.getPosition().y);
IsTouching = false;
}
}
else
{
IsTouching = false;
}
}
をしかし、一つの問題があります。マリオがフロアの両側に触れると、彼は右に動かすことができないということを意味する。
私が十分明確でない場合は、追加する内容や具体的な内容を明記してください。
避けたい行動は、どのようなものですか?テレポーテーション?箱に止めたいですか? – Mario
はい!私はそれがほしいと思う! –
x/yの位置と幅/高さを比較することで、Marioを床の矩形の外に出すには最小限の動きが必要な方向を見つけ出すことができます。それがあなたがマリオを動かそうとする方向です。 – super