2017-04-25 10 views
1

그래서 저는 체스 게임을 만드는 컴퓨터 과학 프로젝트에 SFML을 사용하고 있습니다. 교실 하나의 사각형 인 클래스 Square이 있습니다. 현재 4 개의 정점 (멤버 변수 sf::VertexArray에 4 개의 sf::Vertex 개체가 있음)이 포함되어 있으며 흰색 또는 검정색으로 표시됩니다. ChessBoard 클래스는 std::vector 제곱을 캡슐화합니다."상위 레벨"오브젝트 그리기

SFML에서 제공하는 자습서를 사용하여 하나의 사각형을 그릴 수 있습니다. 그러나 draw() 함수는 꼭지점을 기반으로 작동하며 ChessBoard 클래스는 실제로 꼭지점을 포함하지 않고 자체가 꼭지점을 포함하는 객체이므로 체스 보드를 그릴 수 없습니다 (예 : 내부의 draw() 함수가 작동하지 않음).).

누구든지이 문제를 해결하는 방법을 알고 있습니까? (필요한 경우/도움이 될 경우 자세한 정보/설명/코드를 제공 할 수 있습니다.)

답변

0

Nevermind. 바보 나. 버텍스 배열을 반환 한 Square 클래스 안에 getter를 구현했습니다. & 안에 Chessboard이 사각형 벡터를 통해 반복되어 각 반복마다 getter를 호출합니다.

2

실제로 "상위 수준 그리기"가 어떻게 작동해야하는지는 아닙니다.

부모님 들께서는 아이들을 어떻게 그려야합니까? 넌 책임이 섞여있어.

대신 서브 클래스 sf::Drawable (및 필요한 경우 sf::Transformable).

이 모든 것은 당신이 모든 그림을 수행하는 draw() 회원을 구현하도록 강요합니다.

은 여기 ChessBoard 클래스에 대한 간단한 예제 :

class ChessBoard : public sf::Drawable { 

    void draw (RenderTarget &target, RenderStates states) const { 
     for (auto &tile : mTiles) // Iterate over all board pieces 
      target.draw(tile, states); // Draw them 
    } 
} 

당신이 볼 수 있듯이,이 설정에 간단하다. 비슷한 방법으로 Square 클래스를 오버로드 할 수 있습니다. (단순히 sf::RectangleShape를 재사용하지 왜? 너무 일반적 그 이름 아닌가요?)

class ChessBoard : public sf::Drawable { 

    void draw (RenderTarget &target, RenderStates states) const { 
     target.draw(mVertices, states); 
    } 
} 

그래서, 다시 메인 게임 루프. ChessBoard을 그리는 방법은 무엇입니까? 다시 말하지만, 사소한 :이 방법의 장점은 처음으로 명확하지 않을 수도 있지만, 그것은 당신이 선 아래로 책임을 통과 할 수있는 걸보고 꽤 쉽게

while (window.isOpen()) { 
    // All the other things happening 

    window.draw(mChessBoard); 
} 

. 예를 들어, ChessBoard은 올바르게 Square을 그리는 방법을 알 필요가 없습니다. 사소한 예로 - 단색의 폴리곤 만 사용하는 것만 큼 눈에 띄지는 않지만 쉐이더, 텍스처 등을 추가하면 코드가 훨씬 깨끗해질 것입니다. 갑자기 더 이상 sf::VertexArray을 반환하지 않아도됩니다. 다른 리소스에 대한 포인터 또는 참조가 필요합니다. 따라서 ChessBoardSquare에서 올바르게 그릴 것을 요청할 구성 요소 (셰이더가 있습니까? 텍스처가 필요합니까?)를 알아야합니다.

+0

모든 정보를 제공해 주셔서 감사합니다. 나중에 프로젝트를 끝내기위한 위기에 처하게 될 것입니다.하지만 대단히 감사하겠습니다. –