QT 模仿Android游戏中虚拟摇杆(1)让摇杆跟着鼠标飞
来源:互联网 发布:噪声分析软件 编辑:程序博客网 时间:2024/05/22 09:46
最近的项目涉及到了这方面的内容,虽然是不值得一提的技术,但是好歹接触QT已经半年多了,早就想要动手写一些开发总结,今天算是为自己实现承诺。
要实现虚拟摇杆,首先应该自定义一个按钮,之所以要自定义按钮,是我没有在QT的QPushButton类中找到自带的move或者mousemove事件,虽然可以直接获取mouse的位置,但是这样的话就不方便实现两个以上的摇杆,所以还是决定自定义按钮。
自定义按钮,首先新建一个class,我命名为LeftButton,在这个类中,将其修改为继承自QPushButton,网上应该还是有挺多自定义按钮的方法的,我目的不在于讲述这个,所以跳过了,只要简单做一个按钮,功能是鼠标按下后,跟随鼠标按钮移动:
在自定义按钮的cpp文件中加入
voidLeftButton::mouseMoveEvent(QMouseEvent*e)
{
QPointmovePos=cursor().pos();
move(movePos);}
这里有一个问题,鼠标与摇杆会不能对齐,原因是QT获取的是相对于当前显示器的X、Y,而move是相对于当前窗体的,也就是说,如果分辨率400*400的显示器,当鼠标按下按钮,如果鼠标相对于屏幕是(100,100)的位置,则该按钮会移动到相对于程序窗体的(100,100)的位置上去,画出效果的话,相当于下图:
如果只是单纯在move事件中把当前鼠标的坐标赋值给摇杆,那么摇杆就会相对于程序窗体移动,但是鼠标是相对于整个屏幕的,所以会造成鼠标与摇杆无法对齐。
解决的办法就是下面代码:
voidLeftButton::mousePressEvent(QMouseEvent*e){
windowPoint = e->globalPos() - this->pos();
}
voidLeftButton::mouseMoveEvent(QMouseEvent*e){ QPoint bpoint=e->globalPos()-windowPoint;
move(bpoint);}
翻阅了一些前辈的资料之后发现,globalPos获取的是相对于整个屏幕的坐标,而cursor.pos()得到是相对于窗体的坐标。用此方法,先在鼠标按下的时候获取到当前窗体相对于屏幕的位置windowPoint(原理的话,各种同学麻烦请自己想想),然后用鼠标相对屏幕的位置减去屏幕坐标,所得出来的,就是鼠标相对于屏幕的坐标,这样的话,直接调用move事件,摇杆就会跟着鼠标对齐了,今天就先讲到这里,有时间继续,谢谢浪费事件看这文章,如果有人看的话。
- QT 模仿Android游戏中虚拟摇杆(1)让摇杆跟着鼠标飞
- QT 模仿Android游戏中虚拟摇杆(2)限定摇杆拖动范围
- QT 模仿Android游戏中虚拟摇杆(3)让圆随着角度移动
- android 虚拟摇杆绘制
- android 虚拟摇杆绘制
- Android手机游戏摇杆
- 虚拟摇杆
- 对游戏开发中虚拟摇杆的封装
- android 虚拟摇杆图片版
- Unity3d火箭班(1)--游戏摇杆
- 游戏开发学习笔记(四)虚拟摇杆的制作
- Unity3d_UGUI虚拟摇杆(简易)
- Cocos2d-x虚拟摇杆控制精灵上下左右运动----之游戏开发《赵云要格斗》(1)
- 摇杆
- 摇杆
- android虚拟手柄摇杆的实现
- EasyTouch中虚拟摇杆的使用EasyJoystick
- Unity3d中利用NGUI实现虚拟摇杆
- [OS复习]文件管理
- java SPI
- volatile 用法
- sqlserver性能调优方法论
- UIAlertController的使用以及对字体颜色大小的修改
- QT 模仿Android游戏中虚拟摇杆(1)让摇杆跟着鼠标飞
- easyui 动态添加空间无法渲染 $.parser.parse()无效
- 记录redis相关
- pl/sql编程(四)存储过程、包
- 坚持#第19天~
- hosts老D博客
- 网络编程之TCP应用
- 【Unity】GUI之GUIStyle与GUISkin
- Android-WebView在ScrollView中高度不稳定末尾有大段空白问题解决