为了账号安全,请及时绑定邮箱和手机立即绑定

为什么赋值时值会递增?

为什么赋值时值会递增?

智慧大石 2023-08-16 09:55:34
我正在为游戏制作 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.02Before: Current Gui PosX: 0.0039999485Before: Current Gui Start PosX: 0.0039999485方法后的值:After: ScreenPos: 0.02After: Current Gui PosX: 0.023999948After: 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():@Overridepublic abstract void onUpdate(); // in Scene最有趣的是,我在测试项目中guiContent.position = guiContent.startPosition + this.position;按照我的预期进行了测试和工作。请帮忙,我已经三天无法理解这个问题了。
查看完整描述

1 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

我已将您的构造函数减少到最少,以显示 和 的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。


在线,您可以用存储在 中的 (B)引用覆盖存储在 中的 (A)// 3引用。Vector3fthis.positionVector3fthis.startPosition


从这一点开始,引用与this.position相同,所以只是 的另一个名称(两者都指相同的内存位置)。Vector3fthis.startPositionthis.position.xthis.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

}

现在, line// 3创建一个新的、独立的Vector3f,它恰好具有与 引用的起始值相同的起始值this.startPosition。


查看完整回答
反对 回复 2023-08-16
  • 1 回答
  • 0 关注
  • 102 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信