Прогрессивное отставание с каждой итерацией столкновения libGDX - PullRequest
0 голосов
/ 24 июня 2018

Здравствуйте, я занимаюсь разработкой игры в свободное время с AIDE и libGDX.Хотя в AIDE есть некоторые недостающие методы API libGDX, и мне пришлось создать несколько обходных путей, чтобы компенсировать отсутствующие методы.Поэтому моя проблема в том, что с каждым случаем столкновения приложение становится все более и более медленным.Никакие новые текстуры не прорисовываются и не исчезают.Просто плохая реализация, которая предназначена для того, чтобы вытолкнуть вас из упомянутой плитки столкновения.Он работает нормально, пока у вас не будет нескольких столкновений.Я думаю, что он создает новую переменную при каждом столкновении и сохраняет ее в памяти, вызывая утечку.Но я не могу точно сказать, так ли это.О, я хотел бы добавить, что у меня нет доступа к компьютеру, только мой телефон.Вот мой класс движений

move.java

public class move
{
    float posX;
    float posY;
    float touchedOnScreenX;
    float touchedOnScreenY;
    float centerOfScreenX;
    float centerOfScreenY;
    float posXSetter;
    float posYSetter;
    float Speed = 150;
    float mapBoundsWidth;
    float mapBoundsHeight;
    boolean upperBounds;
    boolean lowerBounds;
    boolean rightBounds;
    boolean leftBounds;
    boolean tileCollition;



    public move() {

    }

    public void renderMove(float delta) {


        if(Gdx.input.isTouched()) {
            screenAndTouchInfo();
            checkBoundsBoolean();
            checkForCollision();
        }
    }

    //slows game down
    private void checkForCollision()
    {
        if (upperBounds == false)
        {
            if (lowerBounds == false)
            {
                if (rightBounds == false)
                {
                    if (leftBounds == false)
                    {
                        if (tileCollition == false)
                        {
                            movement();
                        }
                        else
                        {
                            collitionSide();
                        }
                    }
                    else
                    {
                        posX++;
                    }
                }
                else
                {
                    posX--;
                }
            }   
            else
            {
                posY++;
            }
        }
        else
        {
            posY --;
        }
    }

    private void movement()
    {
        posYSetter = posY;
        posXSetter = posX;
        if (touchedOnScreenX < centerOfScreenX)
        {
            posX -= Gdx.graphics.getDeltaTime() * Speed;

        }
        else
        {
            posX += Gdx.graphics.getDeltaTime() * Speed;

        }
        if (touchedOnScreenY < centerOfScreenY)
        {
            posY -= Gdx.graphics.getDeltaTime() * Speed;

        }
        else
        {
            posY += Gdx.graphics.getDeltaTime() * Speed;

        }
        if (touchedOnScreenY < centerOfScreenY + 64 && touchedOnScreenY > centerOfScreenY - 64)
        {
            posY = posYSetter;

        }
        if (touchedOnScreenX < centerOfScreenX + 64 && touchedOnScreenX > centerOfScreenX - 64)
        {
            posX = posXSetter;

        }
    }

    //buggy and slows game down. Can push you into tile if input is the opposite of the side
    public void collitionSide() {
        if (tileCollition == true){
            if (touchedOnScreenX < centerOfScreenX)
            {
                posX = posX +10;
            }
            else
            {
                posX = posX - 10;

            }
            if (touchedOnScreenY < centerOfScreenY)
            {
                posY = posY +10;
            }
            else
            {
                posY = posY -10;
            }
        }
    }

    private void screenAndTouchInfo()
    {
        touchedOnScreenX = Gdx.input.getX();
        touchedOnScreenY = (Gdx.graphics.getHeight() - Gdx.input.getY());
        centerOfScreenX = Gdx.graphics.getWidth() / 2;
        centerOfScreenY = Gdx.graphics.getHeight() / 2;
    }
    //slows game down
    private void checkBoundsBoolean()
    {
        if (posX > mapBoundsWidth)
        {
            rightBounds = true;
        }
        else {
            rightBounds = false;
        }
        if (posY > mapBoundsHeight)
        {
            upperBounds = true;
        }
        else {
            upperBounds = false;
        }
        if (posX < mapBoundsWidth - mapBoundsWidth)
        {
            leftBounds = true;
        }
        else {
            leftBounds = false;
        }
        if (posY < mapBoundsHeight - mapBoundsHeight)
        {
            lowerBounds = true;
        }
        else {
            lowerBounds = false;
        }
    }

    public void setTileCollision(boolean tileCollision) {
        this.tileCollition = tileCollision;
    }

    public float getPosX() {
        return posX;
    }

    public float getPosY() {
        return posY;
    }

    public float getTouchedOnScreenX() {
        return touchedOnScreenX;
    }

    public float getTouchedOnScreenY() {
        return touchedOnScreenY;
    }

    public float getCenterOfScreenX() {
        return centerOfScreenX;
    }

    public float getCenterOfScreenY() {
        return centerOfScreenY;
    }

    public void setMapboundsWidth(float width) {
        this.mapBoundsWidth = width;
    }

    public void setMapboundsHeight(float height) {
        this.mapBoundsHeight = height;
    }
}

Я знаю, что это большой код, который нужно прочесать, и мне жаль, если не всегда понятно, что происходит.Я реорганизовал его туда, где было бы немного легче понять.О, если бы кто-нибудь мог сказать мне, почему в AIDE отсутствуют некоторые методы libGDX, которые тоже были бы хорошими. Наиболее заметным из них был бы Cell.setTile ().То, что я знаю, находится в API libGDX и может быть найдено в их документации.Но когда я это реализую, он выдает неизвестный метод класса Cell error.Я исследовал, как использовать метод, но безрезультатно.Пришлось создать карту int [] [] и цикл for для рисования карты с другой текстурой [].Оно работает.Лол.Спасибо, кто бы ни нашел время, чтобы посмотреть на мой длинный двойной вопрос.Надеюсь, кто-нибудь скажет мне, почему это отставание создается из-за указанных столкновений.

1 Ответ

0 голосов
/ 26 июня 2018

Я рекомендую перенести ваш код столкновения в отдельный поток.Это должно значительно улучшить производительность:

Executor executor = Executors.newSingleThreadExecutor();
  executor.execute(new Runnable() {
     @Override
     public void run() {
        // Physics loop goes here
     }
});

Обязательно выключите исполнитель при утилизации экрана.

...