그래서 충돌이 SFML에서 작동하는 방식을 살펴 보았습니다. 나는이 코드 조각을 만들었습니다 : 코드에서 알 수SFML (C++)의 올바른 충돌
if (floor.getGlobalBounds().intersects(SuperMario.getGlobalBounds())) // Floor
{
SuperMario.setPosition(SuperMario.getPosition().x, floor.getPosition().y - SuperMario.getOrigin().y);
IsTouching = true;
}
으로, 마리오는 그가 바닥 객체를 접촉 할 때 자신의 위치를 변경하고 바닥에서 순간 이동합니다.
참고. 또한 그림 1에서 "left"라는 단어를 무시하면 "right"를 의미합니다.
물론이 동작은 의도 한 것이며 (버그는 아니지만) 원치 않는 동작입니다.
내 질문은 : 어떻게이 "부작용"을 제거 할 수 있습니까? 내 코드를 수정하면 어떻게 될까요? Mario가 바닥 위로 텔레포트하지 않을 것입니다. 즉, 플랫폼에 맞게 플랫폼 작업을하는 것입니다. 나는 마리오가 상자에 의해 멈추게하고, 순간 이동하지 않기를 바란다.
업데이트 :
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를 바닥 rect 밖으로 가져 오는 데 필요한 최소 방향이 무엇인지 알아낼 수 있습니다. 그것이 당신이 마리오를 움직이기 원하는 방향입니다. – super