Прокрутка фона параллакса, бесконечно повторяемая в libgdx - PullRequest
12 голосов
/ 22 сентября 2011

Я делаю 2D-шутер с космической прокруткой, где мне нужен фон, который можно бесконечно прокручивать (он выложен мозаикой или повторяется).Я также хотел бы реализовать прокрутку параллакса, так что, возможно, у вас есть одна самая низкая фоновая текстура туманности, которая едва движется, более высокая, содержащая далекие звезды, которые едва двигаются, и самый высокий фон, содержащий близкие звезды, которые много двигаются.* Я вижу в Google, что каждый слой будет перемещаться на 50% меньше, чем слой над ним, но как мне реализовать это в libgdx?У меня есть камера, которую можно увеличивать и уменьшать, и на физическом экране 800x480 можно отобразить что угодно - от 128x128 пикселей (корабль) до огромного пространства с изображением текстур, обернутых несколько раз по краям.

Как мне непрерывно оборачивать меньшую текстуру (скажем, 512x512), как если бы она была бесконечно мозаичной (для случая, когда камера была уменьшена прямо), и как мне наложить несколько текстур, подобных этим, сохранить их вместе в подходящей структуре (есть лиодин в libgdx api?) и перемещать их при изменении координат игрока?Я посмотрел на javadocs и примеры, но не могу найти ничего похожего на эту проблему, извинения, если это очевидно!

Ответы [ 4 ]

10 голосов
/ 24 сентября 2011

Эй, я также делаю фон параллакса и пытаюсь заставить его прокручиваться.

В хранилище есть ParallaxTest.java, его можно найти здесь .

Этот файл является автономным классом, поэтому вам нужно будет включить его в свою игру так, как вы хотите. и вам нужно будет изменить управляющий вход, так как он подключен для использования сенсорного экрана / мыши.

это сработало для меня. Что касается повторного bg, я еще не дошел до этого, но я думаю, что вам просто нужна базовая логика, как, например, один экран от конца, измените первые несколько экранов pos, чтобы выстроиться в конце.

3 голосов
/ 24 января 2012

Я не могу сказать больше о Parallax Scrolling, чем PFG.Действительно, в репозитории есть тестовая папка и несколько пояснений по всему Интернету.Мне понравился этот .Вопрос с фоном действительно легко решить.Эта и другие связанные проблемы могут быть решены с помощью модульной алгебры.Я не буду вдаваться в подробности, потому что когда-то показано очень легко понять.

Представьте, что вы хотите показать компас на экране.У вас есть текстура 1024x16, представляющая кардинальные точки.В основном, у вас есть полоска.Оставляя в стороне соображения относительно реальной ориентации и тому подобного, вы должны отрендерить ее.

Например, ваш видовой экран имеет размер 300x400, и вы хотите, чтобы на экране было 200 пикселей текстуры (чтобы сделать ее более интересной).Вы можете отрисовать его идеально с одной областью, пока не достигнете позиции (1024-200) = 824. Как только вы окажетесь в этой позиции, явно больше нет текстуры.Но так как это компас, очевидно, что как только вы достигнете его конца, он должен начать снова .Так что это ответ.Другая область текстуры сделает свое дело.Диапазон 825-1023 должен быть представлен другим регионом.Второй регион будет иметь размер (1024-pos) для каждого значения pos> 824 && pos <1024 </p>

Этот код предназначен для работы в качестве реального примера компаса.Он очень грязный, поскольку все время работает с относительными позициями из-за преобразования диапазона (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();
1 голос
/ 27 июня 2014

Ниже, где вы инициализируете свою текстуру для объекта.Затем под этим типом введите

YourTexture.setWrap(Texture.TextureWrap.Repeat, Texture.TextureWrap.Repeat);

Где YourTexture - это ваша текстура, которую вы хотите прокрутить в параллаксе.

В вашем файле рендеринга введите этот код.

batch.draw(YourTexture,0, 0, 0 , srcy, Gdx.graphics.getWidth(),     
           Gdx.graphics.getHeight());  
srcy +=10;

Это даст вам ошибку, поэтому создайте переменную с именем srcy.Ничего особенного.

Int srcy
1 голос
/ 02 ноября 2012

Вы можете использовать функцию setWrap, как показано ниже:

Texture texture = new Texture(Gdx.files.internal("images/background.png"));
texture.setWrap(Texture.TextureWrap.Repeat, Texture.TextureWrap.Repeat);

Он будет рисовать фон несколько раз!Надеюсь, что это поможет!

...