为什么赋值时值会递增?

我正在为游戏制作 GUI(Open Gl)。也就是说,我有一个 Gui Screen,上面添加了其他组件。所以我想让所有其他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代码(包括Guis):


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在 main 中onUpdate():


@Override

public abstract void onUpdate(); // in Scene

最有趣的是,我在测试项目中guiContent.position = guiContent.startPosition + this.position;按照我的预期进行了测试和工作。请帮忙,我已经三天无法理解这个问题了。



智慧大石
浏览 103回答 1
1回答

郎朗坤

我已将您的构造函数减少到最少,以显示 和 的this.position问题this.startPosition。this.rotation和也存在同样的问题this.scale- 您必须将解决方案this.position也应用于这两个字段......public GameObject(float posX, float posY, float posZ,&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; float rotX, float rotY, float rotZ,&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; float scaleX, float scaleY, float scaleZ)&nbsp;{&nbsp; &nbsp; this();&nbsp; &nbsp; this.position = new Vector3f(0, 0, 0); // 1&nbsp; &nbsp; this.startPosition = new Vector3f(posX, posY, posZ); // 2&nbsp; &nbsp; this.position = this.startPosition;&nbsp; // 3}您在线// 1创建一个Vector3f(A) 并将对其的引用分配给this.position。您在线// 2创建另一个Vector3f(B) 并将对其的引用分配给this.startPosition。在线,您可以用存储在 中的 (B)引用覆盖存储在 中的 (A)// 3引用。Vector3fthis.positionVector3fthis.startPosition从这一点开始,引用与this.position相同,所以只是 的另一个名称(两者都指相同的内存位置)。Vector3fthis.startPositionthis.position.xthis.startPosition.x要解决您的问题,您必须分配一个this.startPosition克隆this.positionpublic GameObject(float posX, float posY, float posZ,&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; float rotX, float rotY, float rotZ,&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; float scaleX, float scaleY, float scaleZ)&nbsp;{&nbsp; &nbsp; this();&nbsp; &nbsp; this.position = new Vector3f(0, 0, 0); // 1&nbsp; &nbsp; this.startPosition = new Vector3f(posX, posY, posZ); // 2&nbsp; &nbsp; this.position = new Vector3f(this.startPosition);&nbsp; // 3}现在, line// 3创建一个新的、独立的Vector3f,它恰好具有与 引用的起始值相同的起始值this.startPosition。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java