2016-07-06 1 views
2

최근에 C++ 및 SFML 최신 버전을 사용하여 간단한 게임을 작업 해 왔지만 충돌 감지가 좋지 않다는 문제가있었습니다. 예를 들어 적이 아직 터치하지 않은 경우에도 플레이어가 죽는 등의 문제가있었습니다. , 그러나 그저 근처에.SFML의 충돌이 좋지 않습니다. 어떻게 개선할까요?

`클래스 PlayerA : { 공공 공공 CircleShape :

//Constructor: 
    PlayerA(float xposition, float yposition, float radius, float s) 
    { 
     setRadius(radius); 
     setFillColor(Color::Yellow); 
     setOutlineColor(Color(00,80,00)); 
     setOutlineThickness(-2); 
     setPointCount(3); 
     setSpeed(s); 
     setPosition(xposition,yposition); 
    } 

    //Movements of the player: 
    void up() 
    { 
     move(0,-10*speed); 
    } 
    void down() 
    { 
     move(0,10*speed); 
    } 
    void right() 
    { 
     move(10*speed,0); 
    } 
    void left() 
    { 
     move(-10*speed,0); 
    } 
    void checkA(ObsA *obs1=NULL,ObsA *obs2=NULL, ObsA *obs3=NULL, ObsA *obs4=NULL, ObsA *obs5=NULL) 
    { 
     if(obs2==NULL) 
     { 
      if(getGlobalBounds().intersects(obs1->getGlobalBounds())) 
      { 
       relevel(); 
      } 
     } 
    private: 
     float speed=0.00; 

    void obs() 
    { 
     if(speed > 0) 
     { 
       rotate(0.5*speed); 
     } 
     else 
     { 
       rotate(0.5*speed); 
     } 
    } 


private: 
    float speed = 0.00; 


    void obs() 
    { 
     if(speed > 0) 
     { 
       rotate(0.5*speed); 
     } 
     else 
     { 
       rotate(0.5*speed); 
     } 
    } 


private: 
    float speed = 0.00; 

뭔가 문제가 여기에 이동 기능과 충돌 감지 코드와 적 클래스의 움직임과 플레이어 클래스의 코드는 코드와 함께, 문제를 해결하는 방법, 감사합니다!

+3

가능한 중복 http://stackoverflow.com/questions/27280264/sfml-bounding-box-collision-detection) – Conduit

답변

6

intersects은 두 개의 직사각형이 교차하는지 확인합니다. SFML에서 완벽한 픽셀 충돌 감지 기능을 원한다면 직접 작성해야합니다. 거기에 모두 원래의 사각형에서 어떤 픽셀이 관련 픽셀을 오버랩하는 포함 경우에 해당하는 경우

기본적으로, intersects로 시작, 다음 교차하는 사각형을 얻을 확인.

+0

감사합니다! 그게 내가 생각하는 최고의거야. – QApps

0

원을 사용하고 있습니까? 올바르게 기억하면 원에는 사각형 히트 박스가 생깁니다. 이 경우 보이지 않는 사각형 모서리가 충돌 할 수 있습니다.

원을 사용하는 경우 클래스를 정사각형으로 변경하고 충돌이 올바르게 작동하는지 확인합니다. 또는 서클과 x 또는 y 축에서 충돌을 직접 테스트 해보십시오. 즉 그것들을 서로를 향해 직선으로 움직여서 1 축만 변화시킨다. (원의 모서리는 왼쪽, 오른쪽, 위쪽 및 아래쪽 섹션에서 사각형의 모서리와 같습니다).

서클의 충돌을 개선해야하는 경우 SFML로 이미 빌드 된 것이있을 수 있습니다. 하지만 저는 두 원의 반경, 두 객체의 중심, 그리고 중심 사이의 각도를 사용하여 자신의 논리를 작성하는 것은 너무 어렵다고 생각하지 않습니다.

당신은 더 나은 충돌을 수행하려면이 기능을 사용할 수 있습니다
+0

네가 맞아, 나는 그것을 시도 할 것이다. 당신의 도움을 주셔서 감사합니다! – QApps

+0

"센터 간의 각도". 중심점에 의해 형성된 직각 삼각형의 빗변 길이를 사용하고 각도에 투영을 시도하는 대신 radius1 + radius2를 확인하는 것이 좋습니다. 이게 당신이 의도 한거야? (미안, 나는 성가신 척하면서 장난이 심하다.) –

0

는 기본 하나를 detection.Its하지만 잘 작동

bool circleTest(const sf::Sprite &first, const sf::Sprite &second) 
{ 
    sf::Vector2f firstRect(first.getTextureRect().width, first.getTextureRect().height); 
    firstRect.x *= first.getScale().x; 
    firstRect.y *= first.getScale().y; 

    sf::Vector2f secondRect(second.getTextureRect().width, second.getTextureRect().height); 
    secondRect.x *= second.getScale().x; 
    secondRect.y *= second.getScale().y; 

    float r1 = (firstRect.x + firstRect.y)/4; 
    float r2 = (secondRect.x + secondRect.y)/4; 
    float xd = first.getPosition().x - second.getPosition().x; 
    float yd = first.getPosition().y - second.getPosition().y; 

    return std::sqrt(xd * xd + yd * yd) <= r1 + r2; 
} 
[SFML 경계 상자 충돌 탐지 (의
+0

한쪽면을 스퀘어 링하는 대신 다른 쪽을 정사각형으로 만들어야한다. 그것은 훨씬 더 빨리 달리고 동일한 결과를줍니다. 나는 또한 이것이 "더 좋다"는 것에 동의하지 않을 것이다. 여전히 픽셀 완전하지는 않지만 (문제 일 수도 있고 아닐 수도 있음) 축 정렬 바운딩 박스 교차 테스트보다 훨씬 느립니다. –

관련 문제