JavaFX太阳系模拟问题:已设为不可移动的太阳仍发生位移
问题原因与修复方案
核心问题
你的代码存在字段与判断逻辑不匹配的关键问题:
- CelestialBody类中定义的控制天体是否可移动的字段是
isImmovable,初始化太阳时也正确设置为true - 但在
updatePositions方法中,判断是否跳过位置更新的条件是body.isFixed(),这和isImmovable是完全无关的判断逻辑,导致太阳的不可移动标记没有被识别,依然会执行位置更新。
另外需要确认:CelestialBody类中如果存在isFixed()方法,它的返回值大概率和isImmovable字段无关(比如对应另一个未设置的isFixed字段,或默认返回false),这直接导致太阳的不可移动属性失效。
修复步骤
统一判断逻辑
将updatePositions方法中的判断条件替换为对应isImmovable的判断:// 替换原有的if (body.isFixed()) if (body.isImmovable()) { continue; }确保CelestialBody有正确的getter方法
检查CelestialBody类是否存在返回isImmovable字段的getter方法,如果没有,添加以下代码:public boolean isImmovable() { return this.isImmovable; }循环范围检查(可选)
当前循环从i=1开始,若太阳在bodies列表的索引0位置,本来不会被遍历到。但如果太阳被错误放在索引>=1的位置,需要确保判断条件能覆盖到它,或者调整循环起始索引为0后,通过isImmovable判断跳过它的位置更新。
验证修复
修改完成后,太阳的isImmovable=true会被正确识别,位置更新逻辑会被跳过,太阳将保持静止,行星可正常绕其运行。
内容的提问来源于stack exchange,提问作者gocdev78
相关产品推荐
相关产品推荐

