Каков наилучший способ переместить объект в libGDX - PullRequest
0 голосов
/ 29 января 2020

Я только что написал простое приложение для проверки перемещения графики c Текстура по данным, предоставленным пользователем. В центре экрана есть круг png, и если пользователь дотронется до него, круг будет следовать за пальцем пользователя. Вот код:

private int HEIGHT, WIDTH;
private Circle circle;
private final int RADIUS = 256;
private boolean circleTouched, firstClick;
private SpriteBatch batch;
private Texture b1;

@Override
public void create()
{
    WIDTH = Gdx.graphics.getWidth();
    HEIGHT = Gdx.graphics.getHeight();
    circleTouched = false;
    firstClick = true;
    batch = new SpriteBatch();
    b1 = new Texture("b1.png");
    circle = new Circle(WIDTH / 2, HEIGHT / 2, RADIUS);
}

@Override
public void render()
{
    //Logic
    if (Gdx.input.isTouched())
    {
        if (circleTouched)
        {
            circle.x += Gdx.input.getDeltaX();
            circle.y += Gdx.input.getDeltaY();
        }
        else if (isCircleTouched(Gdx.input.getX(), Gdx.input.getY(), circle) && firstClick)
        {
            circleTouched = true;
        }
        else
        {
            firstClick = false;
        }
    }
    else
    {
        circleTouched = false;
        firstClick = true;
    }

    //Drawing
    Gdx.gl.glClearColor(1, 1, 1, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    batch.begin();
    batch.draw(b1, circle.x - circle.radius, HEIGHT - circle.y - circle.radius);
    batch.end();
}

@Override
public void dispose()
{
    super.dispose();
}

private boolean isCircleTouched(int x, int y, Circle c)
{
    return ((x - c.x) * (x - c.x) + (y - c.y) * (y - c.y)) <= (c.radius * c.radius);
}
  1. Является ли это хорошим способом перемещения объектов (если у меня есть 15 объектов, таких как это приложение, производительность все равно будет хорошей?)
  2. Можно ли использовать функцию рисования не из левого нижнего угла, а из левого верхнего? Мне приходится вычитать высоту каждый раз, когда я рисую.
  3. Мой png 512x512, как я могу установить размер для рисования текстуры с заданным размером?

РЕДАКТИРОВАТЬ 1. firstClick можно заменить на Gdx.input.justTouched ()

1 Ответ

1 голос
/ 30 января 2020
  1. Я не нахожу 15 объектов так много, тем более, что вы используете только 2d текстуры и некоторую простую математику. Однако, когда ваша кодовая база растет, вы должны подумать о ее рефакторинге и переместить логи c в выделенные классы.
  2. Функция draw всегда использует левый нижний угол. Но вы можете использовать класс Sprite, который может принимать исходные координаты: https://libgdx.badlogicgames.com/ci/nightlies/docs/api/com/badlogic/gdx/graphics/g2d/Sprite.html
  3. Если вы не хотите использовать для этого класс Sprite, вы также можете используйте методы Texture.getWidth и getHeight: https://libgdx.badlogicgames.com/ci/nightlies/docs/api/com/badlogic/gdx/graphics/Texture.html#getWidth -

Когда дело доходит до структурирования libGdx кода, я всегда находил Ashley весьма полезным: https://github.com/libgdx/ashley/wiki/How-to-use-Ashley

...