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
相关产品推荐
相关产品推荐

