Java 为什么赋值时该值会递增?

Java 为什么赋值时该值会递增?,java,Java,我正在为游戏制作GUI(OpenGL)。也就是说,我有一个添加了其他组件的Gui屏幕。所以我想让所有其他GUI相对于GUI屏幕的原始位置向左移动。它工作,但不是我想要的,只是与逻辑相反 这里我遇到了这种情况(此代码在onUpdate()中运行,只需执行每一帧): 正如你们所看到的,我只是在用作业。也就是说,我将列表中的内容位置分配给原始内容位置加上当前GuiScreen位置的总和。也就是说,guiContent.position需要每个帧始终是guiContent.startPosition+t

我正在为游戏制作GUI(OpenGL)。也就是说,我有一个添加了其他组件的Gui屏幕。所以我想让所有其他GUI相对于GUI屏幕的原始位置向左移动。它工作,但不是我想要的,只是与逻辑相反

这里我遇到了这种情况(此代码在onUpdate()中运行,只需执行每一帧):

正如你们所看到的,我只是在用作业。也就是说,我将
列表中的内容位置分配给原始内容位置加上当前GuiScreen位置的总和。也就是说,
guiContent.position
需要每个帧始终是
guiContent.startPosition+this.position。这是合乎逻辑的。但对我来说,这工作很奇怪。我有每一帧
guiContent。位置
增加。就像他在使用
+=
命令而不是
=
命令一样

方法之前的值:

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
code(包括
Gui
s):

这里是此构造函数的另一个版本:

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
。此代码来自main
onUpdate()中的my
Scene
worldsecene.class

下一步是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()感兴趣:

@覆盖
公共游戏对象更新()
{
如果(this.scale.x()=2)this.scale.y=2f;
//这是rotateGui();
返回super.onUpdate();
}
附言:立即说其他方法中的错误我没有。我只是重复检查了100次


最有趣的是,我在测试项目中测试了
guiContent.position=guiContent.startPosition+this.position按我的预期工作。请帮助,我已经3天不能理解这个问题。

我已将您的构造函数缩减到最低限度,以显示此.position
此.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
行中,您创建一个
向量3f
(a),并将其引用分配给
此位置

在第
//2
行中,您创建另一个
向量3f
(B),并将其引用分配给
此.startPosition

在第
//3
行中,您使用存储在
此.startPosition
中的对
向量3f
的引用覆盖存储在
此.position
中的
向量3f
的引用

从这一点开始,
this.position
引用与
this.startPosition
相同的
Vector3f
,因此
this.position.x
只是
this.startPosition.x
的另一个名称(两者都指向相同的内存位置)


要解决问题,必须将
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
创建了一个新的、独立的
向量3f
,该向量恰好具有与此引用的向量相同的起始值。startPosition

这与意见无关,因为可能有数百种不同的原因。您应该添加相关和必要的代码,以便我们能够查明问题。或者你需要学习“我知道这是非常少的信息,但是,在你看来,什么会触发这个错误?”这不是如何工作的。因此,这不是一个就bug发表意见的论坛,而是一个编程问答。你的问题应该对其他人有用。我们的答案应该对其他人有用。我们可能会帮助您解决您遇到的问题,这是一个很好的副作用,但不是目的。“我的项目太大,无法在此处写入所有信息。”最小的输入是有原因的。请阅读我们在这里为您提供的链接。在您回复Zabuza和我之前,您从未阅读过这些文章中的所有引用链接。“等待2分钟”您如何初始化
guiContent.position
guiContent.startPosition
?这两个都是对象,所以也许你用同一个对象初始化它们。好的,我明白了!谢谢我已经被冒犯了,因为我已经在OpenGL中搜索得很好了,但在这样的时刻我变得迟钝了
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;
}
@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();
}
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
}
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
}