You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GML对象启动时位置偏移,更新后恢复正常的原因咨询

GML对象Draw GUI事件初始化位置偏移问题分析

问题代码

draw_self()
draw_set_color(c_black)
draw_text(x + 70,y + 50,string(obj_deafult.value))

核心原因

Draw GUI事件的坐标系是屏幕GUI坐标系(以屏幕左上角为原点(0,0)),和普通Draw事件的房间坐标系完全不同:

  • 普通Draw事件里的x/y是对象在游戏房间中的位置,会受相机/视图影响自动转换为屏幕显示位置;
  • 但Draw GUI事件不会考虑相机/视图,直接把x/y当作屏幕GUI的绝对坐标使用。

初始化阶段相机往往还未完成初始化(比如视图参数未加载完成),或者对象的房间坐标本身非(0,0),导致draw_self()直接把对象画在屏幕GUI的(x,y)位置,和预期的房间内显示位置产生偏移。等相机初始化完成后,要么是视觉上相机移动抵消了偏移,要么是后续逻辑同步了坐标,才让对象回到“正确位置”。

解决方法

  • 方法1:转换房间坐标到GUI坐标
    如果要在GUI层绘制房间内的对象,需要把对象的房间坐标减去相机的视图偏移,转换为屏幕GUI坐标:

    // 获取当前相机的视图位置
    var _cam_x = camera_get_view_position(view_camera[0]).x;
    var _cam_y = camera_get_view_position(view_camera[0]).y;
    
    // 转换为GUI坐标后绘制自身
    draw_self(x - _cam_x, y - _cam_y);
    
    // 文本也同步转换坐标
    draw_set_color(c_black)
    draw_text((x - _cam_x) + 70, (y - _cam_y) + 50, string(obj_deafult.value))
    

    旧版本GameMaker可以用view_xview[0]和view_yview[0]替代相机API。

  • 方法2:区分UI和游戏对象
    如果这个对象是固定UI元素(比如屏幕上的文本容器),直接用GUI绝对坐标绘制,不要依赖房间内的x/y:

    // 直接指定GUI位置,比如屏幕左上角偏移(50,50)
    draw_self(50, 50);
    draw_set_color(c_black)
    draw_text(50 + 70, 50 + 50, string(obj_deafult.value))
    
  • 方法3:确保初始化顺序
    在对象的Create事件中明确设置初始x/y,或者在Draw GUI事件中加判断,等相机初始化完成后再绘制:

    if (camera_is_active(view_camera[0])) {
        draw_self(x - camera_get_view_position(view_camera[0]).x, y - camera_get_view_position(view_camera[0]).y);
        // 文本绘制代码...
    }
    

内容的提问来源于stack exchange,提问作者edivanFinger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 22:32:36