2014-04-06 5 views
2

"진행률 막대"를 만들려고하는데 클리핑이 예상대로 작동하지 않는 것 같습니다. 이 일이 내가 잘못했거나 잘못 해석 한 것입니까? 클립한다libgdx ScissorStack이 예상대로 작동하지 않습니다.

draw() 루틴 : ClipTest group 클래스, TestScreen 및 스크린 샷에 대한

@Override 
    public void draw(SpriteBatch batch, float parentAlpha) { 
     Rectangle scissors = new Rectangle(); 
     Rectangle clipBounds = new Rectangle(getX(), getY(), getWidth() * 0.75f, getHeight()); 

     ScissorStack.calculateScissors(
       getStage().getCamera(), 
       getStage().getGutterWidth(), 
       getStage().getGutterHeight(), 
       getStage().getCamera().viewportWidth, 
       getStage().getCamera().viewportHeight, 
       batch.getTransformMatrix(), 
       clipBounds, scissors); 

     if (ScissorStack.pushScissors(scissors)) { 
      super.draw(batch, parentAlpha); 
      ScissorStack.popScissors(); 
     } 
    } 
} 

전체 샘플 코드.

  • ClipTest

    enter image description here

    은 "벌레"를 보여주기 위해 사용되는 그룹의 서브 클래스이다.
  • ClipImagedraw()에서 클리핑을 수행하는 Image의 하위 클래스입니다.
  • ClipTest에는 2 개의 이미지, 배경 및 전경이 있습니다.

배경은 검은 색 이미지이므로 항상 진행률 막대의 전체 크기 여야합니다.

전경은 흰색 이미지이며 막대의 백분율에 따라 너비가 잘립니다.

내가 발견 한 이상한 결과는 전경에서 클리핑 클래스를 사용하지만 배경 이미지가 실제로 클리핑 된 것입니다.

예상 결과는 Photoshop을 사용하여 작성되었습니다 (코드를 통해 생성 할 수 없음).

어떤 아이디어가 잘못 되었나요?

+0

당신이 "일종의"라고 말한 이유는 당신이 필요로하지 않을 수도 있기 때문입니다. 그러나 당신이 그것에 대해 모를 경우를 대비해서 - 당신이 야간 석방을한다면, 진행 막대가 있습니다. http : //libgdx.badlogicgames – Chase

+0

@ 체이스 : 나는 그 일을하게되어 유혹을 받았지만, 다른 모든 구문 변경으로 인해 프로젝트도 망가졌다. (예 : 스테이지 생성자가 변경됨 등). 나는 이것이 작은 감시 일 것이기를 바랐다. 그것은 – twig

+0

으로 밝혀졌다. 대신 http://gamedev.stackexchange.com에서 이것을 묻어야한다. – ashes999

답변

5

실제 그림은 일괄 처리가 플러시 될 때까지 발생하지 않습니다. draw 호출이 필요하지 않으므로 나중에 완료되도록 도면을 대기열에 넣어야합니다.

draw 뒤에 flush을 추가하면 가위를 활성화하거나 비활성화 할 때 OpenGL 그리기 호출이 이루어 지도록해야합니다. draw 전화 일어날 플러시가 발생할 수 있습니다 https://github.com/libgdx/libgdx/wiki/Clipping,-with-the-use-of-scissorstack

때문에 참조하십시오, 당신은 액티브 가위 지역 내부의 draw 통화를 계속해야합니다. 활성 시저 영역을 시작하기 전에 일괄 처리를 플러시하거나 종료해야 활성 시저 영역 내에서 가위 시작하기 전에 대기중인 그리기 호출을 방지 할 수 있습니다.

+1

YES !!! 지금 3 일이 지났고 내 정신을 회복 해 주셔서 감사합니다! 그 조언은 완벽했고 올바른 길로 나를 인도했습니다. 궁금해하는 사람들을 위해, 나는 draw() 오버라이드를 시작할 때 batch.flush()를 호출하여 클립핑을 계속하기 전에 모든 것이 예상대로 빠져 나오도록해야했습니다. super 뒤에 batch.flush()를 호출해야했습니다.올바른 내용을 잘라내는 데 draw()를 사용합니다. – twig

+1

@ P.T. 가위를 활성화하기 전에 내뿜는 것이 저를 위해 속임수였습니다. BTW, 나는 당신의 대답에서 발췌 한 링크와 업데이트 된 원래 wiki를 업데이 트했습니다. –

관련 문제