如何实现love.js中Love2D剪贴板与浏览器剪贴板同步?
Love.js 实现浏览器剪贴板同步
love.js 默认的 love.system.getClipboardText() 和 setClipboardText() 仅在游戏沙箱内独立运行,无法与浏览器系统剪贴板互通。要解决这个问题,需要通过 love.js 提供的 js 模块桥接浏览器原生剪贴板 API,直接调用浏览器的剪贴板功能。
实现步骤
1. 引入 love.js 的 JS 桥接模块
在代码开头引入 js 模块,获取浏览器的全局环境对象:
local js = require("js") local window = js.global local navigator = window.navigator
2. 替换剪贴板操作逻辑
修改你的 love.keypressed 函数,将原有的 love.system 剪贴板调用替换为浏览器原生 API:
function love.keypressed(key) if FEN_input.active then if (key == "v" or key == "V") and (love.keyboard.isDown("lctrl") or love.keyboard.isDown("rctrl")) then -- 读取浏览器剪贴板(异步操作) navigator.clipboard:readText():then_(function(text) if text then FEN_input.text = FEN_input.text .. text end end):catch_(function(err) print("剪贴板读取失败: " .. tostring(err)) end) elseif (key == "c" or key == "C") and (love.keyboard.isDown("lctrl") or love.keyboard.isDown("rctrl")) then -- 写入浏览器剪贴板(异步操作) navigator.clipboard:writeText(FEN_input.text):then_(function() print("内容已复制到浏览器剪贴板") end):catch_(function(err) print("剪贴板写入失败: " .. tostring(err)) end) elseif (key == "a" or key == "A") and (love.keyboard.isDown("lctrl") or love.keyboard.isDown("rctrl")) then FEN_input.selectAll = true else FEN_input.selectAll = false end end end
关键说明
- 异步处理:浏览器剪贴板 API 是异步的,因此需要通过 Promise 的
then_(对应 JS 的then)和catch_(对应 JS 的catch)方法处理结果和错误。Lua 中then是关键字,所以 love.js 将 JS 方法名转换为then_。 - 权限要求:浏览器会在首次调用剪贴板 API 时向用户请求权限,由于操作是通过用户主动触发的按键事件(Ctrl+C/V)发起的,权限申请通常会被通过。
- 兼容性:现代主流浏览器(Chrome、Firefox、Edge 等)都支持
navigator.clipboardAPI,无需额外兼容处理。
内容的提问来源于stack exchange,提问作者Aye Veska
相关产品推荐
相关产品推荐

