Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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();

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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