Почему значение увеличивается при назначении? - PullRequest
0 голосов
/ 22 сентября 2019

Я делаю графический интерфейс для игры (Open Gl).То есть у меня экран Gui, на котором добавляются другие компоненты.Поэтому я хотел, чтобы все остальные графические интерфейсы переместились влево относительно исходной позиции GuiScreen.Это работает, но не так, как я хотел, просто вопреки логике.

Здесь у меня такая ситуация (этот код работает в onUpdate (), просто делайте каждый кадр):

private void moveRelativeContent(Gui guiContent)
{
    guiContent.position.x = guiContent.startPosition.x + this.position.x();
    guiContent.position.y = guiContent.startPosition.y + this.position.y();
}

Как вы можетевидите, я просто использую назначение.То есть я назначаю позицию контента от List<Gui> сумме исходной позиции контента плюс текущей позиции GuiScreen.То есть guiContent.position необходимо, чтобы каждый кадр всегда был guiContent.startPosition + this.position;.Это логичноНо для меня это работа очень странная.У меня каждый кадр guiContent.position увеличивается.Как будто он использует команду += вместо команды =.

Значения до метода:

Before: ScreenPosX: 0.02
Before: Current Gui PosX: 0.0039999485
Before: Current Gui Start PosX: 0.0039999485

Значения после метода:

After: ScreenPos: 0.02
After: Current Gui PosX: 0.023999948
After: Current Gui Start PosX: 0.023999948

Сначалапосмотрите в мой инициализированный GameObject код (включая Gui s):

public GameObject(float posX, float posY, float posZ, 
                    float rotX, float rotY, float rotZ, 
                        float scaleX, float scaleY, float scaleZ) 
{
    this();
    ...

    this.startPosition = new Vector3f(posX, posY, posZ);
    this.startRotation = new Vector3f(rotX, rotY, rotZ);
    this.startScale    = new Vector3f(scaleX, scaleY, scaleZ);
    this.position = this.startPosition;
    this.rotation = this.startRotation;
    this.scale    = this.startScale;

    ...
}

Вот еще одна версия этого конструктора:

public GameObject(Vector3f position, Vector3f rotation, Vector3f scale) 
{
    this(position.x(), position.y(), position.z(), 
         rotation.x(), rotation.y(), rotation.z(), 
           scale.x() ,   scale.y() ,  scale.z() );
}

public GameObject(Vector2f position, Vector2f rotation, Vector2f scale) 
{
    this(position.x(), position.y(), 
         rotation.x(), rotation.y(), 
           scale.x() ,  scale.y() );
}

Далее, где началось обновление GuiScreen.Этот код из моих Scene и WorldScene.class в основном onUpdate():

@Override
public abstract void onUpdate(); // in Scene

@Override
public void onUpdate() // in WorldScene
{
    if(!this.isInGamePause)
    {
        ... this some in-game code
        this.client.selectedGuiScreen.close(); // close once

    }
    else if(this.isInGamePause)
    {
        ...
        this.client.selectedGuiScreen.open();  // open once
        this.client.selectedGuiScreen.onUpdate();
    }

    ...

    this.updateFrameTime();
    this.client.getGameWindow().updateViewport();
    this.client.getGameWindow().updateWindow();

    ...
}

Следующий шаг - метод my GuiScreen.class `` onUpdate () `` `:

public GameObject onUpdate() 
{
    for(Gui guiContent : this.allContent)
    {
        guiContent.onUpdate();

        if(guiContent.getId() == 0)
        {
            SimplePrint.message("Before: ScreenPosX: " + this.position.x);
            SimplePrint.message("Before: Current Gui PosX: " + guiContent.position.x);
            SimplePrint.message("Before: Current Gui Start PosX: " + guiContent.startPosition.x);
        }

        this.moveRelaviteContent(guiContent);

        if(guiContent.getId() == 0)
        {
            SimplePrint.message("After: ScreenPos: " + this.position.x);
            SimplePrint.message("After: Current Gui PosX: " + guiContent.position.x);
            SimplePrint.message("After: Current Gui Start PosX: " + guiContent.startPosition.x);
        }

        System.exit(0);
    }

    return this;
}

И напоследок, если кому интересно, мои guiContent.onUpdate():

@Override
public GameObject onUpdate() 
{
    if(this.scale.x() <= 0) this.scale.x = 0.2f;
    if(this.scale.y() <= 0) this.scale.y = 0.2f;

    if(this.scale.x() >= 2) this.scale.x = 2f;
    if(this.scale.y() >= 2) this.scale.y = 2f;

    //this.rotateGui();
    return super.onUpdate();
}

Ps: Сразу скажу, что ошибок в других методах у меня нет.Я просто дважды проверил 100 раз.

И самое интересное, что я в тестовом проекте тестировал и guiContent.position = guiContent.startPosition + this.position; работал так, как я планировал.Пожалуйста помогите а то я уже 3 дня не могу понять в чем проблема.

1 Ответ

1 голос
/ 22 сентября 2019

Я сократил ваш конструктор до минимума, чтобы показать проблему с this.position и this.startPosition.Та же проблема существует с this.rotation и this.scale - вы должны применить решение для this.position также к этим двум полям ...

public GameObject(float posX, float posY, float posZ, 
                float rotX, float rotY, float rotZ, 
                float scaleX, float scaleY, float scaleZ) 
{
    this();
    this.position = new Vector3f(0, 0, 0); // 1
    this.startPosition = new Vector3f(posX, posY, posZ); // 2
    this.position = this.startPosition;  // 3
}

В строке // 1 вы создаете Vector3f (A) и присвойте ссылку на него this.position.

В строке // 2 вы создаете еще один Vector3f (B) и назначаете ссылку на него this.startPosition.

В строке // 3 вы перезаписываете ссылку на Vector3f (A), которая была сохранена в this.position, на ссылку на Vector3f (B), которую вы сохранили в this.startPosition.

С этого момента this.position ссылается на то же Vector3f, что и this.startPosition, поэтому this.position.x - это просто другое имя для this.startPosition.x (оба ссылаются на одну и ту же ячейку памяти).


ToЧтобы решить вашу проблему, вы должны назначить клон this.startPosition на this.position

public GameObject(float posX, float posY, float posZ, 
                float rotX, float rotY, float rotZ, 
                float scaleX, float scaleY, float scaleZ) 
{
    this();
    this.position = new Vector3f(0, 0, 0); // 1
    this.startPosition = new Vector3f(posX, posY, posZ); // 2
    this.position = new Vector3f(this.startPosition);  // 3
}

Теперь строка // 3 создает новый, независимый Vector3f, который, как оказалось, имеет те же начальные значения, что иссылка на this.startPosition.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...