亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么賦值時值會遞增?

為什么賦值時值會遞增?

智慧大石 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 關注
  • 135 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號