2012-06-20 3 views
2

sfml 스프라이트 클래스. setTexure() 메서드는 iterator의 생성자 내부에서 작동하지 않지만 iterator가 이미 만들어 졌을 때 작동합니다.클래스 .setTexure() 메서드가 다르게 동작하는 이유는 무엇입니까?

우리는 창에 그려지는 프레임에 대한 구조체를 구성하려고합니다. Sprite와 Texture 클래스를 가진 sfml 라이브러리를 사용하고 있습니다. frameData 구조체의 생성자에서 파일에서 텍스처를로드 한 다음 .setTexture() 메서드를 사용하여 스프라이트에 적용합니다. 프로그램을 컴파일하고 실행할 때 시스템에 따라 흰색 블록이나 프로그램 충돌이 발생합니다.

frameData의 생성자 외부에서 .setTexture()를 사용하여 텍스처에 대한 포인터 참조를 만드는 경우 작동합니다!

모두 이것은 다른 프레임을 반복하는 iterator 구조체 인 경우 모두입니다. 여기에 관련 코드이며, 우선이가 FrameData 구조체의 헤더에 있습니다, 여기에 실제 생성자가 작동하지입니다

private: 
    struct FrameData 
    { 
     FrameData(const std::string& fileName, int frameDelay); 

     sf::Texture texture; 
     sf::Sprite sprite; 
     unsigned int frameDelay; 
    }; 

둘째 :

const sf::Sprite& SpriteAnimator::currentFrame() const 
{ 
    return currentFrame_->sprite; 
} 

SpriteAnimator::FrameData::FrameData(const std::string& fileName, int frameDelay) 
: frameDelay(frameDelay) 
{ 
    texture.loadFromFile(fileName); 
    sprite.setTexture(texture); 
} 

그리고 셋째로, 여기에서 작업을 수행 무엇인가 :

const sf::Sprite& SpriteAnimator::currentFrame() const 
{ 
    currentFrame_->sprite.setTexture(currentFrame_->texture); 
    return currentFrame_->sprite; 
} 

SpriteAnimator::FrameData::FrameData(const std::string& fileName, int frameDelay) 
: frameDelay(frameDelay) 
{ 
    texture.loadFromFile(fileName); 
    sprite.setTexture(texture); 
} 

왜 이런 일이 발생했는지에 대한 아이디어가 누락 되었습니까? 생성자가 제대로 작동하도록하려면 현재 프레임이 텍스처가 변경되는 것보다 더 자주 반환되므로 현재 프레임이 반환 될 때마다 텍스처를 업데이트 할 필요가 없습니다.

감사합니다.

+0

나는 이와 비슷한 문제가있었습니다. 내 해결책은 모든 텍스처를 클래스 외부의 컨테이너에 저장하고 텍스처 자체 대신 텍스처에 대한 포인터를 사용하는 것이 었습니다. 클래스에서 다른 객체를 만들려는 경우 동일한 텍스처를 2 개 이상 저장할 필요가 없기 때문에 한 개의 돌로 2 개의 새를 죽입니다. – elimirks

+0

그래서 문제는 포인터가 아닌 텍스처 자체를 사용한다고 생각하십니까? 그것이 문서화되어 있는지 궁금합니다. 고맙습니다! – s3binator

+0

질문을 해결 했으므로 솔루션을 답변으로 게시 할 수 있습니까? 그렇게하면 다른 모든 SO 사용자들에게는 공개적인 질문이되지 않습니다. 감사! – Tim

답변

1

솔브드! SF :: 스프라이트의 클래스 문서의 마지막 단락을 읽어

김포 :: Sprite 인스턴스가 사용하는 질감을 복사하지 않는 것이 중요합니다, 그것은 단지 그것에 대한 참조를 유지합니다. 따라서 sf :: Texture는 sf :: Sprite 에 의해 사용되는 동안 파괴되어서는 안됩니다. 즉, 스프라이트를 만들기 위해 로컬 sf :: Texture 인스턴스 을 사용하는 함수를 작성하지 마십시오.

그래서이 클래스의 범위 밖에있는 텍스처를위한 저장소를 생성하면 strongdrink 권장처럼 참조를 전달하는 것이 좋습니다!

1

나는 이와 비슷한 문제가있었습니다. 내 해결책은 모든 텍스처를 클래스 외부의 컨테이너에 저장하고 텍스처 자체 대신 텍스처에 대한 포인터를 사용하는 것이 었습니다. 클래스에서 다른 객체를 만들려는 경우 동일한 텍스처를 2 개 이상 저장할 필요가 없기 때문에 한 개의 돌로 2 개의 새를 죽입니다.

관련 문제