2013-09-22 8 views
0

뱀의 oop 버전에서 sfml 2.0 라이브러리를 사용하고 있으며 충돌을 처리하기위한 별도의 클래스가 있습니다. 여기 코드는 다음과 같습니다 SFML 2.0 충돌 클래스

는 "collision.hpp"를 포함

bool sfc::Sprite::collision(sfc::Sprite sprite2) { 
    this->setBounds(); 
    sprite2.setBounds(); 

    if (top > sprite2.bottom || bottom < sprite2.top || left > sprite2.right || right < sprite2.left) { 
    return false; 
    } 

    return true; 
} 

void sfc::Sprite::colMove(sf::Vector2f &movement, sfc::Sprite sprite2) { 
    if (!this->collision(sprite2)) { 
    this->move(movement); 
    } 
} 

void sfc::Sprite::colMove(float x, float y, sfc::Sprite sprite2) { 
    if (!this->collision(sprite2)) { 
    this->move(x, y); 
    } 
} 

void sfc::Sprite::setBounds() { 
    top = this->getPosition().y; 
    bottom = this->getPosition().y + this->getTexture()->getSize().y; 
    left = this->getPosition().x; 
    right = this->getPosition().x + this->getTexture()->getSize().y; 
} 

유일한 문제는 충돌 이벤트가 발생하면, 스프라이트는 윈도우 남은 생애 동안 붙어있다. 어떻게 충돌을 일으켜서 거기에 붙지 않도록 할 수 있습니까? 감사! ~ 마이클

편집 : 나는 충돌이 발생한 후에 스프라이트가 움직일 수 없다는 것을 알고 있지만, 충돌 후에 스프라이트가 움직이지 않게하는 다른 방법을 모른다.

답변

2

귀하의 스프라이트가 스프라이트 2와 충돌하여 입력되면 더 이상 움직일 수 없다는 것이 문제입니다. 충돌을 감지하면 이전 x 및 y로 이동을 되돌릴 수 있습니다. 또는 이동할 장소가 비어 있는지 확인하십시오. 충돌입니다

bool sfc::Sprite::collision(sfc::Sprite sprite2, float x, float y) { 
    this->setBounds(); 
    sprite2.setBounds(); 

    if (top > sprite2.bottom + y || bottom < sprite2.top - y || left > sprite2.right +x|| right < sprite2.left - y) { 
    return false; 
    } 

    return true; 
} 

다음

void sfc::Sprite::colMove(float x, float y, sfc::Sprite sprite2) { 
    if (!this->collision(sprite2, x, y)) { 
    this->move(x, y); 
    } 
} 

참고 : -

+0

불행하게도이 작동하지 않습니다 내가 제대로 그래서 + 및 확인 sfml에서 사용하는 좌표계를 기억하지 않습니다. 내 스프라이트는 충돌 후 움직일 수 없다는 것을 알았지 만 위에 게시 한 코드는 충돌이 발생하기 전에 두 스프라이트 사이의 거리 만 변경합니다. – Michaelslec

+0

오, 알았어. 나는 smfl에 대해 많이 기억하지 않지만 어쨌든 그것이 당신을 조금 도왔 으면 좋겠다. – th3sn4k3

+0

해답을 가져 주셔서 감사합니다! 감사합니다 :) – Michaelslec