Фон параллакса прокрутки, бесконечное повторение в libgdx

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

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

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


person fundead    schedule 22.09.2011    source источник
comment
Дополнительная информация, прямо сейчас ввод игрока перемещает спрайт игрока вокруг мировых координат, а камера остается по центру игрока.   -  person fundead    schedule 22.09.2011


Ответы (4)


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

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

Например, ваше окно просмотра имеет размер 300x400, и вы хотите, чтобы на экране отображалось 200 пикселей текстуры (чтобы сделать его более интересным). Вы можете идеально визуализировать его с одной областью, пока не достигнете позиции (1024-200) = 824. Как только вы находитесь в этой позиции, очевидно, что текстуры больше нет. Но поскольку это компас, очевидно, что, когда вы дойдете до его конца, он должен запуститься снова. Вот и ответ. Другая область текстуры подойдет. Диапазон 825-1023 должен быть представлен другим регионом. Вторая область будет иметь размер (1024 позиции) для каждого значения 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();
person Community    schedule 24.01.2012

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

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

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

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

person pfg    schedule 24.09.2011
comment
ParallaxTest.java теперь находится по адресу github.com/libgdx/libgdx/blob/master/tests/gdx-tests/src/com/ - person Max; 18.09.2016

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

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

Он будет рисовать фон повторно! Надеюсь на эту помощь!

person Nolesh    schedule 02.11.2012
comment
Можете ли вы также установить обертку на textureRegions? - person Jente Rosseel; 25.04.2013
comment
просто для справки: это обертывает текстуру, а не область текстуры и не работает с масштабированием области просмотра. Мне тоже нужна текстура POT, но я могу ошибаться. - person RichieHH; 23.08.2015

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

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
person user3754408    schedule 27.06.2014
comment
Это не повторяется бесконечно - person themorfeus; 26.05.2016