LibGDX dr aws точек вместо линий - PullRequest
1 голос
/ 25 января 2020

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

@Override
public void render () {
  cam.update();
  Gdx.gl.glClearColor(1, 1, 1,1);
  Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
  if (Gdx.input.isTouched()) {
    pos.set(Gdx.input.getX(), Gdx.input.getY(), 0);
    pixmap.setColor(new Color(1, 1, 1, 0.5f)); //transparency
    pixmap.fillCircle((int)pos.x, (int)pos.y, 10);
  }
  texture3.draw(pixmap, 0, 0);
  batch.begin();
    batch.draw(texture, 0, 0);
    batch.draw(texture3, 0, 0);
  batch.end();
}

Но я получил очки, когда делаю свайпы. Требуется делать очень медленную скорость, чтобы делать линии вместо точек. Поэтому я ожидаю непрерывную линию вместо точек. Можете ли вы что-нибудь посоветовать, пожалуйста? Точки вместо линии

1 Ответ

1 голос
/ 28 января 2020

Это вызвано тем, что с частотой, с которой обновляется входное состояние, решение здесь будет заключаться в том, чтобы вручную рассчитать недостающие точки, необходимые для построения линии, вы можете сделать это с помощью линейной интерполяции между каждой парой точек, дополнительно Вы можете рассчитать, сколько дополнительных точек необходимо, в зависимости от того, как далеко находится самая новая точка из предыдущей, в моем примере я использую произвольное количество дополнительных точек (20), например, так:

public class TestDraw extends Game {

    private Pixmap pixmap;
    private Texture texture;
    private SpriteBatch batch;
    private Vector2 lastPos;

    @Override
    public void create() {
        pixmap = new Pixmap(1000, 1000, Pixmap.Format.RGBA8888);
        texture = new Texture(pixmap);
        batch = new SpriteBatch();
        lastPos = new Vector2();
    }

    @Override
    public void render() {
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        if (Gdx.input.isTouched()) {
            pixmap.setColor(new Color(1, 1, 1, 0.5f)); //transparency
            int newX = Gdx.input.getX();
            int newY = Gdx.input.getY();
            pixmap.setColor(Color.RED);
            pixmap.fillCircle(newX, newY, 10);

            // If the distance is too far, fill with extra dots
            if (lastPos.dst(newX, newY) > 10) {           // Here far is 10, you can adjust as needed
                int extraDots = 20;                       // How many extra dots to draw a line, I use 20, adjust as needed or calculate according to distance (for example lastPos.dst(newX,newY) * 5)
                for (int i = 0; i < extraDots; i++) {
                    float progress = (1f / extraDots) * i;
                    int dotX = (int) MathUtils.lerp(lastPos.x, newX, progress);
                    int dotY = (int) MathUtils.lerp(lastPos.y, newY, progress);
                    pixmap.setColor(Color.BLUE);
                    pixmap.fillCircle(dotX, dotY, 10);
                }
            }
            // Store last position for next render() call
            lastPos.set(newX, newY);
        }
        texture.draw(pixmap, 0, 0);
        batch.begin();
        batch.draw(texture, 0, 0);
        batch.end();
    }
}

В соответствии с Ваш код по мере необходимости, я не знал, что такое texture3, поэтому я не включил в свой пример

Также еще один вариант, который мне не очень нравится из-за стоимости рендеринга и хранения, - это использование Polygon для рисовать линии.

...