我正在尝试在Coco2D-x中为3D游戏构建一个输入处理程序。我想用鼠标控制相机的旋转,就像FPS一样。要实现这一点,我需要存储每一帧的先前和当前鼠标位置,以计算每一帧的增量移动,并将其应用为旋转。
文档显示获取鼠标信息的唯一方法是通过鼠标事件和事件分派器。我试过了,但它对位置没有什么用处,因为这样,当鼠标移动时,我只会刷新之前和当前的位置。如果鼠标不移动,我仍然有一些增量移动(计算N帧之前,当鼠标最后一次移动时),相机将永远移动。
有没有办法在每一帧中获得鼠标的位置?我也对任何关于如何用鼠标移动相机的建议持开放态度。
我在Windows10上使用的是Cocos2d-x 3.13.1和Visual Studio2015,该项目在C++上。
谢谢。
发布于 2017-01-06 04:14:44
我不是Cocos2D方面的专家,但从这里可以看出:
文档显示获取鼠标信息的唯一方法是通过鼠标事件和事件调度程序。我试过了,但它对位置没有什么用处,因为这样,当鼠标移动时,我只会刷新之前和当前的位置。如果鼠标没有移动,我仍然有一些增量移动(计算N帧之前,当鼠标最后一次移动时),相机将永远移动。
我认为在相机旋转计算后将增量重置为0可以解决使用这些事件的问题。
发布于 2017-01-07 03:15:11
我找到了一个解决方案,也许不是最好的,但却是最简单的。
InputHandler仍然控制着鼠标事件,并且它只存储鼠标的当前位置。此位置仅在移动鼠标时更新。
每一帧,CameraController都会询问鼠标的当前位置。在执行此操作之前,它会存储前一个。这样,我就可以控制鼠标是否移动。
所以基本上我在必要的地方计算增量(这里是相机控制器),而不是每一帧都计算它(就像我打算用输入控制器计算的那样)。
这在CameraController的update函数中
mousePreviousPos = mouseCurrentPos;
mouseCurrentPos = inputHandler->GetMousePos();
mouseDelta = mousePreviousPos - mouseCurrentPos;
if (mouseDelta.x != 0)
{
ApplyRotationAroundY(mouseDelta.x);
}
if (mouseDelta.y != 0)
{
ApplyRotationAroundX(mouseDelta.y);
}我将继续关注更多或更好的解决方案。谢谢!
https://stackoverflow.com/questions/41493782
复制相似问题