为何Game.h类成员常量导致碰撞检测逻辑失效?
类成员const int变量导致碰撞检测失效的原因分析
核心原因1:const成员变量未正确初始化
C中,类的const成员变量必须在构造函数的初始化列表中完成赋值(C11及以后支持类内inline初始化,比如const int left_mobile = 10;,但如果没这么写),如果只是在Game.h里声明const int left_mobile;却没在构造函数里初始化,这个变量的值会是内存里的随机垃圾值。用这种随机值做碰撞判断,逻辑自然完全失效。
而局部const int变量在定义时直接赋值(比如const int left_mobile = mobile.x - mobile.width / 2;),值是明确且正确的,所以碰撞逻辑能正常工作。
核心原因2:const成员变量无法随对象状态动态更新
碰撞检测用的left_mobile这类变量,本质是基于游戏对象的实时位置、尺寸计算出来的动态值。如果把它们定义成类的const成员变量,一旦初始化后就无法修改——哪怕游戏对象移动了、尺寸变了,这些变量的值还是停留在初始化时的旧值,后续的碰撞判断用的都是过期数据,自然会出错。
而在UpdateModel函数里定义局部变量,每次函数调用时都会重新计算最新的碰撞边界值,完全匹配当前对象的状态,所以碰撞检测能正常运行。
补充:访问权限问题(可能性较低)
如果这些const成员变量被声明为private,而你在UpdateModel里直接访问时编译器没报错,那说明你没犯这个错;但如果是不小心设置了错误的访问权限(比如protected且当前场景不符合访问规则),也可能导致读取的值异常,但这种情况通常会触发编译错误,所以概率不高。
内容的提问来源于stack exchange,提问作者Jayden Steiner Sable
相关产品推荐
相关产品推荐

