Java libGDX - проблемы со случайным изменением размера текстуры во время выполнения - PullRequest
0 голосов
/ 03 января 2019

Я программирую свою собственную версию "FlappyBird", но наткнулся на некоторые проблемы.

У меня есть четыре разные текстуры (башни), которые должны иметь произвольную высоту (с указанным диапазоном),но проблемы, с которыми я сталкиваюсь:

  • Если я сгенерирую случайные числа вне моего метода drawTowers(), тогда все башни будут иметь разную высоту, но высота не изменится
  • Если я сгенерирую случайные числа в моем методе drawTowers(), то будет отображаться множество башен различной высоты при изменении каждую миллисекунду

Вот мой метод drawTowers():

Random r = new Random();
int low = 0;
int high = 25;
int result1 = r.nextInt(high-low) + low;
int result2 = r.nextInt(high-low) + low;
int result3 = r.nextInt(high-low) + low;
int result4 = r.nextInt(high-low) + low;

private void drawTowers() {

    batcher.draw(AssetLoader.texture1, tower1.getX(), tower1.getY() + tower1.getHeight() - result1, 
           tower1.getWidth(), midPointY - (tower1.getHeight())); 


    batcher.draw(AssetLoader.texture2, tower2.getX(), tower2.getY() + tower2.getHeight() - result2,
           tower2.getWidth(), midPointY - (tower2.getHeight()));

    batcher.draw(AssetLoader.texture3, tower3.getX(), tower3.getY() + tower3.getHeight() - result3,
         tower3.getWidth(), midPointY - (tower3.getHeight()));

    batcher.draw(AssetLoader.texture4, tower4.getX(), tower4.getY() + tower4.getHeight() - result4,
            tower4.getWidth(), midPointY - (tower4.getHeight()));

}

У меня та же проблема с зазором между двумя башнями.Я хочу, чтобы разрыв имел случайный диапазон (с указанием минимума и максимума).Поэтому я использовал два класса: A ScrollHandler и Scrollable.

. Вот как выглядит мой класс ScrollHandler:

public class ScrollHandler {

private Tower tower1, tower2, tower3, tower4;
public static final int SCROLL_SPEED = -59;

Random r = new Random();
int low = 90;
int high = 110;
int result = r.nextInt(high-low) + low;

public final int TOWER_GAP = result; 

public ScrollHandler(float yPos) {

    tower1 = new Tower(210, 0, 25, 0, SCROLL_SPEED);
    tower2 = new Tower(tower1.getTailX() + TOWER_GAP, 0, 25, 0, SCROLL_SPEED);
    tower3 = new Tower(tower2.getTailX() + TOWER_GAP, 0, 25, 0, SCROLL_SPEED);
    tower4 = new Tower(tower3.getTailX() + TOWER_GAP, 0, 25, 0, SCROLL_SPEED);
}

public void update(float delta) {
    // Update our objects

    tower1.update(delta);
    tower2.update(delta);
    tower3.update(delta);
    tower4.update(delta);

    // Check if any of the pipes are scrolled left,
    // and reset accordingly
    if (tower1.isScrolledLeft()) {
        tower1.reset(tower4.getTailX() + TOWER_GAP);
    } else if (tower2.isScrolledLeft()) {
        tower2.reset(tower1.getTailX() + TOWER_GAP);
    } else if (tower3.isScrolledLeft()) {
        tower3.reset(tower2.getTailX() + TOWER_GAP);
    } else if (tower4.isScrolledLeft()) {
        tower4.reset(tower3.getTailX() + TOWER_GAP);
    }
}
}

А вот мой класс Scrollable:

public class Scrollable {

protected Vector2 position;
protected Vector2 velocity;
protected int width;
protected int height;
protected boolean isScrolledLeft;

public Scrollable(float x, float y, int width, int height, float scrollSpeed) {
    position = new Vector2(x, y);
    velocity = new Vector2(scrollSpeed, 0);
    this.width = width;
    this.height = height;
    isScrolledLeft = false;
}

public void update(float delta) {
    position.add(velocity.cpy().scl(delta));

    // If the Scrollable object is no longer visible:
    if (position.x + width < 0) {
        isScrolledLeft = true;
    }
}

// Reset: Should Override in subclass for more specific behavior.
public void reset(float newX) {
    position.x = newX;
    isScrolledLeft = false;
}

public boolean isScrolledLeft() {
    return isScrolledLeft;
}

public float getTailX() {
    return position.x + width;
}

public float getX() {
    return position.x;
}

public float getY() {
    return position.y;
}

public int getWidth() {
    return width;
}

public int getHeight() {
    return height;
}

Я не знаю, что именно я должен изменить, чтобы получить случайную высоту и случайный разрыв каждый раз, когда он появляется снова.Может быть, мне придется работать с самой текстурой?Заранее спасибо!

texture1 = new Texture("png/turm_gryffindor.png");
    gryffindor = new TextureRegion(texture1, 136, 16, 15, 1);

1 Ответ

0 голосов
/ 06 января 2019

Воссоздание случайных чисел в методе сброса башни и в начале (когда вы инициализируете игру).Таким образом, когда они вернутся к началу, у них будет новая случайная высота.

...