2013-02-16 4 views
0

작은 탈출 게임을 개발 중이며 벽을 통과 할 수 없도록하고 싶습니다. 벽을 가로 질러 미끄러지기를 원합니다. 이것으로 나는 당신이 당신의 왼쪽에 벽을 가지고있을 때 당신이 왼쪽과 위로 누르는 것을 의미합니다, 당신은 위로 미끄러지지만 벽을 통과하지 않습니다. 처음에는 잘 작동하지 않는 버그가있는 코드를 조작했습니다.2D 사각형 슬라이딩 충돌이 작동하지 않습니다.

http://xboxforums.create.msdn.com/forums/t/59723.aspx

은 정말 논리적이고 쉽게 그래서 난 내 프로그램에서 구현 소리 : 인터넷에서 몇 가지 검색 후 나는이 발견했다. 문제는 여전히 작동하지 않는다는 것입니다. 때로는 슬라이드를 할 수 있지만 (예상보다 느리게/빠름), 때로는 더 빠르게 슬라이드 할 수 있고 때로는 슬라이드를 할 수없는 경우도 있습니다. 내 코드는 다음과 같습니다.

bool cLevel::slideCol(SDL_Rect* pos, SDL_Rect* oldPos) { 
    bool col = false; 

    for (int i = 0; i < walls.size(); ++i) { 
     if (rectCol(*pos, walls[i])) { 
      pos->x = oldPos->x; 
      col = true; 
     } 

     if (rectCol(*pos, walls[i])) { 
      pos->y = oldPos->y; 
      col = true; 
     } 
    } 

    return col; 
} 

모든 벽을 현재 위치에서 확인합니다. 먼저 x 위치를 조정하고 충돌이 여전히 있으면 y 위치를 조정합니다. 제 문제를 보시려면 데모를 받으십시오 : https://dl.dropbox.com/u/65227065/Operation%20Get%20Out.zip. rectCol 함수가 제대로 작동하는지, 필자는 철저히 테스트했다. 하지만 확실한 것은 어쨌든 여기에 있습니다 :

bool rectCol(SDL_Rect f, SDL_Rect s) { 
    bool ret = false; 

    int t1, r1, b1, l1; 
    int t2, r2, b2, l2; 

    t1 = f.y; 
    r1 = f.x + f.w; 
    b1 = f.y + f.h; 
    l1 = f.x; 

    t2 = s.y; 
    r2 = s.x + s.w; 
    b2 = s.y + s.h; 
    l2 = s.x; 

    // Er zijn vier situaties mogelijk: - rechtsonder1 overlapt linksboven2 
    //         - linksonder1 overlapt rechtsboven2 
    //         - linksboven1 overlapt rechtsonder2 
    //         - rechtsboven1 overlapt linksonder2 
    // Die worden hier elk individueel gechecked 

    if (r1 > l2 && r1 < r2) { // rechts 
     if (b1 > t2 && b1 < b2) { // onder1 overlapt linksboven2 
      ret = true; 
     } else if (t1 > t2 && t1 < b2) { // boven overlapt overlapt linksonder2 
      ret = true; 
     } 
    } else if (l1 > l2 && l1 < r2) { // links 
     if (b1 > t2 && b1 <= b2) { // onder1 overlapt rechtsboven2 
      ret = true; 
     } else if (t1 > t2 && t1 < b2) { // boven1 overlapt met rechtsonder2 
      ret = true; 
     } 
    } 

    return ret; 
} 

저는 여기에 내 재치가 있습니다. 어쩌면 나는 아주 단순한 무언가를 놓치고있다. (나는 항상 그렇듯이 그렇다.) 그러나 나는 이것을 알아낼 수 없다. 바라건대 너희들이 나를 도울 수 있거나 "제출"문제는 내가 빛을 볼 수있게 해줄 것이다.

미리 감사드립니다.

[편집] 좋아, 그래서 나는 직감이 있었기 때문에 다시 원래의 접근 방식을 시도했다. 한 함수에서 부동 소수점 좌표와 정수 좌표간에 앞뒤로 건너 뛰고 있었기 때문에 원래 시스템이 작동하지 않는 것으로 나타났습니다. 따라서이 스레드가 나중에 비슷한 문제가있는 누군가에 의해 발견되면 하나의 유형 (정수 또는 부동 소수점)을 고수해야합니다. 그러면 두통이 많이 줄어들 것입니다.

+0

잘못된 것이 있습니다. 디버그. –

답변

0

귀하의 rectCol 함수는 충돌이되었는지 여부를 나타냅니다하지만 충돌이 된 경우는 X의 충돌과

Y.

에서 충돌 구분하지 않습니다, 당신의 slideCol 기능도 X의 위치를 ​​조정 충돌이 Y에 완전히 있었으면 바닥이나 천장을 따라 미끄러 져 움직일 수 없습니다.

슬라이딩이 "예상보다 느리거나 빠를 때"왜 나는 모릅니다. 나는 그 코드에 대한 이유가 없다 (그리고 나는 당신의 dll을 실험하지 않을 것이다). 그래서 나는 당신의 기대가 비현실적이라고 생각한다.

+0

흠, 나는 생각하고 내 코드가 작동하지 않는 경우가 많이 있습니다. 늘 그렇듯이, 나는 몇 가지 것을 간과했다. 나를 올바른 방향으로 밀어주는 주셔서 고마워. 하하. – bobismijnnaam

관련 문제