Прокрутка фона параллакса, бесконечно повторяющаяся в libgdx

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

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

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

4 ответов


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

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

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

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

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

существует Параллакстест.java в репозитории, его можно найти здесь.

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

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


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

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

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


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

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