2014-12-07 4 views
0

Я знаю, что к этому вопросу обращались раньше (например, here), но мне было интересно, как это сделать. В моей игре у меня есть прокручиваемый фон. Например, голубое небо голубого цвета внизу и становится темнее, чем выше вы идете. Это не совсем возможно с предлагаемым решением:Рисование подмножества градиента в libgdx

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

так как вы можете дать только цвета, которые действительно будут показаны. Я хотел бы иметь gradientPaint с верхним darkblue и нижним светом, который растягивается, например, на 500 пикселей. Это, пока я рисую только 200 пикселей. При этом цвет будет по-прежнему темнее, когда фоновые свитки. Кто-нибудь знает, как это сделать с помощью libgdx?

ответ

2

Вы хотите увидеть меньшее (скажем, 200 пикселей) окно на более крупный (скажем, 500 пикселей) градиент. Для этого вам просто нужно вычислить цвета четырех углов цвета, основываясь на расположении вашего окна в общем градиенте, а затем нарисуйте именно это. (Так что не думайте о том, как рисовать весь фон, но о том, как рисовать только ту часть, которая вам нужна.)

Поскольку вы просто плавно перемещаетесь между двумя цветами (от 0 до 500), вы «делать линейную интерполяцию» (то есть прямолинейную оценку) между цветами, основанными на том, где находится Окно. 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); 

Теперь windowBottomColor и windowTopColor должны быть пригодны для вызова filledRect:

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

Обратите внимание, что вызовы «copy()» создают новый объект Color для каждого вызова, поэтому вы можете оптимизировать это, чтобы избежать выделения.

Отказ от ответственности: Я не пробовал этот код, поэтому он, вероятно, имеет некоторые глупые ошибки, но, надеюсь, он дает вам правильную идею.

+0

Большое спасибо за ваш ответ. Это сработало, как вы объяснили. – Consec

+0

Что касается предотвращения создания новых цветовых объектов в каждом игровом поле, я создал хэш-карту с кешированными цветами. Поскольку уровень подразделяется на блоки, все цвета в верхней и нижней части блоков сохраняются. – Consec