QT 模仿Android游戏中虚拟摇杆(2)限定摇杆拖动范围

来源:互联网 发布:java 内存缓存 编辑:程序博客网 时间:2024/05/16 04:39

上一篇博客介绍了如何解决在摇杆跟随鼠标拖动的时候,鼠标与摇杆不能对齐的问题,链接如下:

http://blog.csdn.net/qq_27385759/article/details/52304620

废话不多说了,下面就实现第二步,如何限定摇杆在一个圆中活动呢?


首先,我们要定义摇杆圆心的位置,这里用一个全局变量来保存圆心位置:

QPoint centerPoint;     //圆心位置double r;               //半径
LeftButton::LeftButton(QWidget *parent) : QPushButton(parent){    centerPoint.setX(200);   //设置圆心X坐标    centerPoint.setY(200);   //设置圆心Y坐标    r = 100;      //设置圆的半径}

再来,思考一下,让一个点无法离开一个圆的原理是什么?其实就是这个点到圆心的距离R不能超过圆的半径r,接下来就是简单的解方程,已知半径r,我们列出R的解析式:

摇杆到圆心的距离R = sqrt(pow(abs(摇杆X坐标 -  圆心X坐标) , 2) + pow(abs(摇杆Y坐标 -  圆心Y坐标) , 2))

这里的摇杆坐标其实就是鼠标相对于窗口的坐标,关于如何求这个坐标我已经在上一篇博客中介绍过了,这里不多赘述,下面是mousemove事件的具体代码:

<span style="font-size:14px;">void LeftButton::mouseMoveEvent(QMouseEvent *e){    QPoint bpoint=e->globalPos()-windowPoint;    if(sqrt(pow(abs(bpoint.rx()-centerPoint.rx()),2) + pow(abs(bpoint.ry()-centerPoint.ry()),2)) < r)    {        move(bpoint);    }}</span>
加入这个代码之后,就实现了鼠标只能在半径为100像素的范围内移动摇杆,但是做到这一步还是不够的,因为照着这个代码实现了程序的同学一定也看到了,实际上鼠标控制摇杆离开圆的半径之后,摇杆就不会动了,但是Android游戏中的虚拟摇杆都是手指离开了圆的范围之后,摇杆依然会朝着手指的方向移动的,而且摇杆始终在圆的外围移动,实现这个功能就在下一篇博客上实现吧,今天就这样了,2016年08月25日打卡!


0 0