上一讲我们绘制一个无休止旋转的立方体,但是这一切都不由我们控制,所以现在我们来看看如何使用鼠标控制物体。
关于鼠标,我们有简单的包装,所以我们只需要重写MDx11Base的dx_MouseEvent函数,所有鼠标事件都会转发到该函数中,所以我们只需要重写该数据即可。
//=========================
bool dx_MouseEvent(MDx11::MouseButton button, MDx11::MouseAction action,float x,float y, bool isglobAxis);
//
// 鼠标按键
//
enum MouseButton{
LeftButton = 0,
//鼠标左键
WheelButton,
//鼠标中键
RightButton,
//鼠标右键
NoMouseButton
//没动作
};
//
// 鼠标动作
//
enum MouseAction{
ButtonDown = 0,
// 鼠标按下
ButtonMove,
// 鼠标移动
ButtonUp,
// 鼠标移动
ButtonDoubleClick, // 鼠标双击
ButtonHover
// 鼠标悬浮
};
// x y 为坐标
isglobAxis 是否为屏幕坐标,所以我们现在只关心窗口坐标
//========================
好吧,我们打算使用右键控制物体的旋转,我们添加几个成员变量记录当前旋转的角度以及上一刻鼠标的位置:
//========================
float mXAngle{ 0.0
};
float mYAngle{ 0.0
};
float mPreXPos{ mj::InfinityF
};
float
mPreYPos{ mj::InfinityF
};
//=========================
现在我们来简单的实现这个dx_MouseEvent响应函数:
//=========================
bool FirstDirectWindow::dx_MouseEvent(MDx11::MouseButton button, MDx11::MouseAction action,float x,float y, bool isglobAxis){
if (isglobAxis == false){
if (button == MDx11::RightButton &
&
action == MDx11::ButtonMove){
if (mPreXPos == mj::InfinityF){
mPreXPos = x;
mPreYPos = y;
}
mXAngle += (x – mPreXPos);
mYAngle += (y – mPreYPos);
mPreXPos = x;
mPreYPos = y;
}
else if (button == MDx11::RightButton &
&
action == MDx11::ButtonUp){
mPreXPos = mj::InfinityF;
mPreYPos = mj::InfinityF;
}
}
return true;
}
//
// 使用我们记录的值来更新旋转矩阵
//
XMMATRIX word = XMMatrixRotationY(mXAngle / 180.0*mj::PI);
word *= XMMatrixRotationZ(mYAngle / 180.0*mj::PI);
word *= XMMatrixRotationX(mXAngle / 180.0*mj::PI);
//=============================
到此,我们可以使用鼠标右键自由控制立方体的旋转了。如果我们想要关心键盘的话就实现dx_KeyEvent(wchar_t,bool)即可,该函数和dx_MouseEvent一样是MDx11Base里面预定义的接口。它的原型如下所示:
//=============================
bool dx_KeyEvent(wchar_t ch,bool isDown);
//
// ch 是键的编码
//
//
// isDown true是按下,false为抬起
//
//===============================
//===============================
回复D查看目录,回复数字查看章节
有些同学问有没有博客或者什么的,毕竟微信上面的代码排版不是很好,所以自己就做了一个简单的web服务器,不过功能简陋,就只是打算在上面放点C++的文件,顺便将源码放在上面。如果有兴趣的同学可以访问下面地址:
http://2076e1b.nat123.cc:43007/
因为外网映射使用的是nat123的免费版,所以会发现下载非常的缓慢,而且可能还会连接不上,还有由于服务器就在电脑上,平时上班家里电脑没开是没法访问网站的,不过下班后就能够访问了,O(∩_∩)O,因为我呢没做过前端,对html和css,js这些不熟悉,所以网站其实就是乱七八糟的,推荐使用win10的edge浏览器,因为实在这个浏览器上面测试的,目前发现chrome不能下载。
对于C++的东西微信里面说得比较深了些,很多同学反应太难看不懂,所以在网站上面打算多说基础。
l150039b70.imwork.net:36629/ 这是花生壳映射的地址,同样是免费的,不过好像比上面那个稳定,所以两个地址都可以进行访问。
原文始发于微信公众号(
C/C++的编程教室
):第131讲 使用鼠标
|