求一个类似Unity的Input.GetAxis("Mouse X 或 Y ")的监听鼠标移动的事件,目前Creator还找不到

首先强调一点,官方提供的 cc.Node.EventType.MOUSE_MOVE 是光标移动事件,并不是鼠标移动事件
cc.Node.EventType.MOUSE_MOVE这个只会在光标移动时才会触发,如果光标移动到窗口边界不能再移动了就收不到触发事件。我说的监听鼠标移动事件是只要你的物理鼠标有移动就一定会有响应,不管你的光标是否卡在边界都不会影响到监听事件,跟光标无关。

目前unity的Input.GetAxis(“Mouse X”),Input.GetAxis(“Mouse Y”)就是这样的一个东西,获取到物理鼠标的移动轴。做第一人称视角,或者通过鼠标转摄像头时很有用,目前在creator还找不到类似这样功能的一个东西。

仔细看了看MND,按浏览器那一套事件系统来的话,你说的功能貌似是不行的

我要的功能和creator的 cc.Node.EventType.MOUSE_MOVE事件唯一的差别就是光标移动到窗口边界了还能继续响应到鼠标移动,event.getDelta()能一直响应,只要鼠标在移动。这样就达到unity的响应鼠标移动轴的效果了。第一人称射击游戏的操作就是这样的,键盘方向键控制移动,鼠标左右移动能旋转角色,光标移动到屏幕边界旋转还有效。目前creator真做不了第一人称操作的游戏。

那其实可以让摄像机响应鼠标事件吧

跟摄像机无关啊,我说的“鼠标移动事件”是你手上的鼠标在移动就一定能收到移动事件,你可以玩一下unity看,测一下 Input.GetAxis(“Mouse X”) 和 Input.GetAxis(“Mouse Y”),就会发现 这两个值是上一次鼠标的位置到当前鼠标的位置的距离(值和creator的event.getDelta()差不多),只要手上的鼠标移动就能收得到,跟屏幕无关。准确来说unity的那两个接口是直接监听鼠标的硬件接口。而creator引用的浏览器鼠标事件是监听应用窗口的鼠标光标事件(这个事件受限于应用窗口范围)。

你如果是做原生桌面程序开发 那是可以做得到。
如果只是网页,而且不是内嵌到nw 或electron这样的壳里,那即使是Unity也是不行的。
你要看你测试的程序是运行在哪。

浏览器的话可以用requestPointerLock来获得无限距离的鼠标移动, 相当于光标锁定在固定位置, 但是鼠标的移动会导致movementX/movementY的变化.

下面代码我在谷歌浏览器console测试了下是可以的:

// 触发鼠标锁定
cc.game.canvas.addEventListener('click', function () {
    if(document.pointerLockElement) {
        document.exitPointerLock();
    } else {
        cc.game.canvas.requestPointerLock();
    }
});
function onMouseMove(e) {
    let node = cc.Canvas.instance.node.children[0];
    node.x -= e.movementX;
    node.y += e.movementY;
}
// 检测鼠标锁定状态变化
document.addEventListener('pointerlockchange', function () {
    console.log('pointerlockchange: ', document.pointerLockElement)
    if (document.pointerLockElement) {
        cc.game.canvas.addEventListener("mousemove", onMouseMove, false);
    } else {
        cc.game.canvas.removeEventListener("mousemove", onMouseMove, false);
    }
}, false);

这个倒还真没玩过,学习了