Ответ 1
У меня не так много сказать о прокрутке Parallax, чем PFG. В репозитории в тестовой папке действительно есть пример и несколько объяснений в Интернете. Мне понравился этот. Дело с фоном действительно легко решить. К этой и другим смежным проблемам можно подойти, используя модульную алгебру. Я не буду вдаваться в детали, потому что однажды показано очень легко понять.
Представьте, что вы хотите показать компас на экране. У вас есть текстура 1024x16, представляющая кардинальные точки. В основном все, что у вас есть, это полоса. Отбросив соображения относительно реальной ориентации и т.д., Вы должны сделать это.
Например, ваш видовой экран 300x400, и вы хотите получить 200 пикселей текстуры на экране (чтобы сделать его более интересным). Вы можете сделать это идеально с одной областью, пока не достигнете положения (1024-200) = 824. Как только вы находитесь в этом положении, текстуры больше нет. Но поскольку это компас, очевидно, что, как только вы достигнете конца, , он должен начать снова. Так что это ответ. Другая область текстуры сделает трюк. Диапазон 825-1023 должен быть представлен другим регионом. Вторая область будет иметь размер (1024-pos) для каждого значения pos > 824 && pos < 1024
Этот код предназначен для работы в качестве реального примера компаса. Он очень грязный, так как он работает с относительными позициями все время из-за преобразования между диапазоном (от 0-3,6) до (0-1024).
spriteBatch.begin();
if (compassorientation<0)
compassorientation = (float) (3.6 - compassorientation%3.6);
else
compassorientation = (float) (compassorientation % 3.6);
if ( compassorientation < ((float)(1024-200)/1024*3.6)){
compass1.setRegion((int)(compassorientation/3.6*1024), 0, 200, 16);
spriteBatch.draw(compass1, 0, (Gdx.graphics.getHeight()/2) -(-250 + compass1.getTexture().getHeight()* (float)1.2), Gdx.graphics.getWidth(), 32 * (float)1.2);
}
else if (compassorientation > ((float)(1024-200)/1024*3.6)) {
compass1.setRegion((int)(compassorientation/3.6*1024), 0, 1024 - (int)(compassorientation/3.6*1024), 16);
spriteBatch.draw(compass1, 0, (Gdx.graphics.getHeight()/2) -(-250 + compass1.getTexture().getHeight()* (float)1.2), compass1.getRegionWidth()/200f * Gdx.graphics.getWidth() , 32 * (float)1.2);
compass2.setRegion(0, 0, 200 - compass1.getRegionWidth(), 16);
spriteBatch.draw(compass2, compass1.getRegionWidth()/200f * Gdx.graphics.getWidth() , (Gdx.graphics.getHeight()/2) -(-250 + compass1.getTexture().getHeight()* (float)1.2), Gdx.graphics.getWidth() - (compass1.getRegionWidth()/200f * Gdx.graphics.getWidth()) , 32 * (float)1.2);
}
spriteBatch.end();