如何设置已旋转LibGDX Actor的拖拽位置?
解决LibGDX旋转Actor后拖拽位置偏移问题
核心原因
未旋转时固定偏移计算可生效,但Actor旋转后局部坐标系发生旋转变换,原有偏移公式未适配该变换,导致位置错位。
解决方案
利用LibGDX内置坐标转换方法自动适配Actor的旋转、缩放等变换,同时同步拖拽Actor的旋转状态,实现触摸点与拖拽位置精准重合:
获取触摸点的局部坐标
在拖拽开始时,将屏幕触摸坐标转换为原Actor的局部坐标,该转换会自动处理Actor的所有变换逻辑:// 获取屏幕触摸坐标 Vector2 screenTouchPos = new Vector2(event.getStageX(), event.getStageY()); // 转换为原Actor的局部坐标(自动适配旋转、缩放) Vector2 localTouchPos = sourceImage.screenToLocalCoordinates(screenTouchPos);设置拖拽Actor的位置偏移
通过计算得到的局部坐标,设置拖拽Actor相对于触摸点的偏移,确保触摸点与Actor对应位置重合:dragAndDrop.setDragActorPosition(-localTouchPos.x, -localTouchPos.y);同步拖拽Actor的旋转与原点
让拖拽Actor的旋转角度、原点与原Actor保持一致,避免因方向错位导致的位置错觉:Image dragActor = new Image(sourceImage.getDrawable()); // 同步旋转角度 dragActor.setRotation(sourceImage.getRotation()); // 同步原点设置(若原Actor修改过原点) dragActor.setOrigin(sourceImage.getOriginX(), sourceImage.getOriginY());
完整代码示例
@Override public DragAndDrop.Payload dragStart(InputEvent event, float x, float y, int pointer) { // 获取触摸点局部坐标 Vector2 screenTouchPos = new Vector2(event.getStageX(), event.getStageY()); Vector2 localTouchPos = sourceImage.screenToLocalCoordinates(screenTouchPos); // 设置拖拽位置偏移 dragAndDrop.setDragActorPosition(-localTouchPos.x, -localTouchPos.y); // 创建并配置拖拽Actor Image dragActor = new Image(sourceImage.getDrawable()); dragActor.setRotation(sourceImage.getRotation()); dragActor.setOrigin(sourceImage.getOriginX(), sourceImage.getOriginY()); // 组装返回Payload DragAndDrop.Payload payload = new DragAndDrop.Payload(); payload.setDragActor(dragActor); return payload; }
为什么之前的方法失效?
localToParentCoordinates是局部坐标转父节点坐标,与我们需要的屏幕坐标转局部坐标方向相反,无法直接用于偏移计算。- 手动旋转矩阵易遗漏Actor原点、缩放等参数,导致计算偏差,而LibGDX内置坐标转换方法已封装所有变换逻辑,准确性更高。
内容的提问来源于stack exchange,提问作者avenger
相关产品推荐
相关产品推荐

