如何在运行时修改FlxG宽高?resizeGame函数无效
解决HaxeFlixel运行时修改游戏分辨率(FlxG宽高)的问题
经验证的有效解决方案
要在运行时修改HaxeFlixel的游戏逻辑分辨率(即FlxG.width和FlxG.height),不能仅依赖resizeGame函数,需要手动覆盖核心变量并同步更新相关组件,步骤如下:
直接修改FlxG的核心尺寸变量
同时更新FlxG.width/FlxG.height和FlxG.gameWidth/FlxG.gameHeight,这两组变量分别对应渲染尺寸和逻辑尺寸:var targetWidth = 1280; var targetHeight = 720; FlxG.width = targetWidth; FlxG.height = targetHeight; FlxG.gameWidth = targetWidth; FlxG.gameHeight = targetHeight;强制更新缩放模式的尺寸配置
BaseScaleMode的onMeasure方法会默认使用FlxGame初始化时的initialWidth/initialHeight重置尺寸,因此需要手动更新其gameSize并触发重新计算:if (FlxG.scaleMode != null) { FlxG.scaleMode.gameSize = new FlxPoint(targetWidth, targetHeight); FlxG.scaleMode.onMeasure(); // 触发缩放逻辑重新计算 }同步调整游戏窗口尺寸(C++目标)
针对Windows C++编译目标,通过OpenFL的Stage对象修改实际窗口大小:Lib.current.stage.stageWidth = targetWidth; Lib.current.stage.stageHeight = targetHeight;重置相机与输入检测
重新调整相机尺寸并重置鼠标输入,避免偏移和检测异常:FlxG.camera.resize(targetWidth, targetHeight); FlxG.camera.update(); FlxG.mouse.reset();
问题根源说明
resizeGame函数的设计初衷是适配现有窗口尺寸,而非修改游戏的逻辑分辨率,因此调用后只会调整内容缩放比例,不会改变FlxG的宽高值。BaseScaleMode.onMeasure方法会在窗口尺寸变化时自动触发,且默认使用FlxGame初始化时的initialWidth/initialHeight重置尺寸,导致手动修改的FlxG宽高被覆盖。BaseScaleMode中的gameSize变量未被正确关联到FlxG的尺寸更新逻辑,需要手动赋值才能生效。
内容的提问来源于stack exchange,提问作者WeegeeDatBagel
相关产品推荐
相关产品推荐

