Вы хотите увидеть меньшее (скажем, 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 для каждого вызова, поэтому вы можете оптимизировать это, чтобы избежать выделения.
Отказ от ответственности: Я не пробовал этот код, поэтому он, вероятно, имеет некоторые глупые ошибки, но, надеюсь, он дает вам правильную идею.
Большое спасибо за ваш ответ. Это сработало, как вы объяснили. – Consec
Что касается предотвращения создания новых цветовых объектов в каждом игровом поле, я создал хэш-карту с кешированными цветами. Поскольку уровень подразделяется на блоки, все цвета в верхней и нижней части блоков сохраняются. – Consec