2014-12-07 3 views
0

이 질문은 전에 액세스 한 적이 있지만 (here) 알고 싶지만 어떻게해야하는지 궁금합니다. 내 게임에는 스크롤하는 배경이 있습니다. 예를 들어 푸른 하늘이 아래쪽에서 하늘색이며 높을수록 어두워집니다. 제안 된 솔루션으로는 실제로 가능하지 않습니다.libgdx의 그래디언트 하위 집합 그리기

shapeRenderer.filledRect(x, y, width, height, 
         lightBlue, lightBlue, darkBlue, darkBlue); 

실제로 표시되는 색상 만 제공 할 수 있기 때문에 가능한 것은 아닙니다. 그라데이션 페인트를 상단 darkblue에, 하단 lightblue를 예를 들어 500 픽셀 이상으로 확장하고 싶습니다. 이것은 단지 200 픽셀 만 그렸습니다. 이렇게하면 배경 스크롤 할 때 여전히 색이 어두워집니다. 아무도 libgdx를 사용하여이 작업을 수행하는 방법을 알고 있습니까?

답변

2

원하는 것은 더 작은 (예를 들어 200 픽셀) 창을 더 큰 (예 : 500 픽셀) 그라데이션으로 보는 것입니다. 이를 위해서는 전체 그라데이션에서 창의 위치에 따라 네 모서리 색상의 색상을 계산 한 다음 그려야합니다. (배경 전체를 그리는 것이 아니라 원하는 부분 만 그리는 방법을 생각해보십시오.)

2 가지 색상 (0과 500 사이)을 부드럽게 움직이기 때문에, Window가있는 곳을 기준으로 색상 사이의 "직선 보간"(즉, 직선 추정)을 수행합니다. Libgdx는 lerp() methods on Color을 통해이를 지원합니다.

창은 Y 축을 따라 여행하는 가정하면,이 같은 당신이 원하는 무엇을 제공해야합니다 :

Color baseColor = lightBlue; 
Color topColor = darkBlue; 

int skyHeight = 500; 
int windowHeight = 200; 
int windowLocation = ...; // something betweeen 0 and skyHeight - windowHeight; 
Color windowBottomColor = baseColor.copy().lerp(topColor, windowLocation/skyHeight); 
Color windowTopColor = baseColor.copy().lerp(topColor, (windowLocation + windowHeight)/skyHeight); 
이제

windowBottomColorwindowTopColor filledRect 전화에 적합해야한다 :

shapeRenderer.filledRect(x, y, width, height, 
         windowBottomColor, windowBottomColor, windowTopColor, windowTopColor); 

주를이 "copy()"호출은 각 호출에 대해 새로운 Color 객체를 생성하므로 할당을 피하기 위해 최적화하려고 할 수 있습니다.

면책 조항 :이 코드를 사용하지 않았으므로 어리석은 버그가있는 것으로 보입니다.하지만 잘하면 올바른 아이디어를 제공합니다.

+0

답장을 보내 주셔서 감사합니다. 당신이 설명하는대로 작동했습니다. – Consec

+0

각 gameloop에 새로운 색상 객체가 생성되는 것을 피하기 위해 캐시 된 색상으로 해시 맵을 만들었습니다. 레벨은 블록으로 세분화되므로 블록의 상단과 하단에있는 모든 색상이 저장됩니다. – Consec