2017-12-31 43 views
1

그래서 충돌이 SFML에서 작동하는 방식을 살펴 보았습니다. 나는이 코드 조각을 만들었습니다 : 코드에서 알 수SFML (C++)의 올바른 충돌

if (floor.getGlobalBounds().intersects(SuperMario.getGlobalBounds())) // Floor 
    { 
     SuperMario.setPosition(SuperMario.getPosition().x, floor.getPosition().y - SuperMario.getOrigin().y); 
     IsTouching = true; 
    } 

으로, 마리오는 그가 바닥 객체를 접촉 할 때 자신의 위치를 ​​변경하고 바닥에서 순간 이동합니다.

그러나 아래 그림과 같은 부작용이 있습니다. 2nd image

은 "녹색 상자는"앞서 언급 바닥 객체입니다 enter image description here

참고. 또한 그림 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; 
     } 
    } 

그러나, 한 가지 문제가있다 : 그래서 지금, 나는이 있습니다. 마리오가 바닥면에 닿았을 때 그는 오른쪽으로 움직이지 못한다는 의미로 붙어 있습니다.

내가 명확하지 않은 경우 추가하거나 명확히해야 할 사항을 지정하십시오.

+1

피해야 할 행동은 무엇입니까? 순간 이동? 상자에 들려주고 싶습니까? – Mario

+0

예! 나는 그것을 정확하게 원한다! –

+1

x/y 위치와 너비/높이를 비교하여 Mario를 바닥 rect 밖으로 가져 오는 데 필요한 최소 방향이 무엇인지 알아낼 수 있습니다. 그것이 당신이 마리오를 움직이기 원하는 방향입니다. – super

답변

2

일반적으로 플레이어가 들어갈 수있는 영역이 아닌 견고한 영역을 정의하기 때문에 정말 이상하게 느껴집니다. 플레이어는 결국 바닥에 붙이기보다는 오히려 뛰어 내리는 것이 좋습니다.

나머지는 매우 간단합니다 : 모든 고체 이상

  • 반복 처리 및 결정 여부 플레이어와 고체 사각형 중복.
  • 만약 그렇다면 어느 거리가 더 작은 지 (x 또는 y)를 결정하십시오. 이를 통해 플레이어를 이동할 축을 결정할 수 있습니다.
  • 플레이어가 솔리드 영역을 빠져 나가는 방향을 결정합니다. 즉, 플레이어를 밀 수있는 방향을 결정합니다.
  • 플레이어를 계산 된 방향으로 밀고 점검을 반복하십시오.

지도 복잡도에 따라 다소 복잡해 질 수 있으므로 비교/감소 (예 : 건너 뛰기 불가능/멀리있는 모양)를 줄이려면 정렬/공간 분할이 필요할 수 있습니다.

+0

@ToadTheMushroomCoder 위의 함수를 정의한 방법에 따라 달라 지지만 점핑 구현 방식에 따라 달라질 수 있습니다. – Mario

+0

마지막 질문이 있습니다. 어떻게 솔리드 객체를 정확하게 반복 할 수 있습니까? –

+1

@ToadTheMushroomCoder 당신은'std :: vector'와 같은 컨테이너에 넣을 수 있습니다. – Mario