我正在尝试在Coco2D-x中为3D游戏构建输入处理程序。 我想用鼠标控制相机旋转,就像FPS一样。为此,我需要每帧存储前一个和当前鼠标位置,以计算每帧的增量移动并将其作为旋转应用。
文档显示获取鼠标信息的唯一方法是通过鼠标事件和事件调度程序。我试过了,但它对位置没用,因为这样,我只会在鼠标移动时刷新上一个和当前位置。如果鼠标不移动,我仍然有一些增量运动(在N帧前计算,当鼠标最后一次移动时),相机将永远移动。
有没有办法每帧都获得鼠标的位置? 我也对使用鼠标进行相机移动的任何建议持开放态度。
我在Windows 10上使用Cocos2d-x 3.13.1和Visual Studio 2015.该项目在C ++上。
感谢。
答案 0 :(得分:0)
我不是Cocos2D的专家,但是从此:
文档显示获取鼠标信息的唯一方法是 通过鼠标事件和事件调度程序。我试过了,但确实如此 对位置没用,因为那样,我只会刷新 鼠标移动时的上一个和当前位置。如果是鼠标 不动,我仍然有一些增量运动(计算N帧 以前,当鼠标移动最后一次时)相机会移动 永远。
我认为在相机旋转计算后将增量重置为0将解决使用这些事件的问题。
答案 1 :(得分:0)
我找到了一个解决方案,可能不是最好的解决方案,但也是最简单的解决方案。
InputHandler仍然可以控制鼠标事件,它只存储鼠标的当前位置。仅在移动鼠标时才更新此位置。
CameraController每帧询问鼠标的当前位置。在此之前,它会存储前一个。 这样,我可以控制鼠标是否移动。
所以基本上我在任何需要的地方计算增量(在这种情况下是摄像机控制器),而不是每帧计算(就像我想要的输入控制器一样)。
这是在CameraController的更新功能
中 mousePreviousPos = mouseCurrentPos;
mouseCurrentPos = inputHandler->GetMousePos();
mouseDelta = mousePreviousPos - mouseCurrentPos;
if (mouseDelta.x != 0)
{
ApplyRotationAroundY(mouseDelta.x);
}
if (mouseDelta.y != 0)
{
ApplyRotationAroundX(mouseDelta.y);
}
我会继续关注更多或更好的解决方案。 谢谢!