关闭

QT 模仿Android游戏中虚拟摇杆(3)让圆随着角度移动

标签: QT 程序设计
1013人阅读 评论(0) 收藏 举报
分类:

接着上一篇讲起,我们需要在鼠标离开圆的范围的时候,让圆跟着鼠标与圆心的角度移动,那么我们来看看我们的已知量是什么:

1、圆心坐标

2、圆的半径

3、当前鼠标的坐标

运用一下我们的中学知识,根据(1、3),可以得到圆心到鼠标的线段与水平线的角度,相当于已知

4、鼠标与圆心线段的角度

稍微整理一下得到下面的公式:

<span style="font-size:14px;">/*
         *
            摇杆的当前坐标(x,y)
            圆点坐标:(x0,y0)
            半径:r
            角度:angle
            
            k = (y-y0)/(x-x0)
            angle = arctan k
            x = x0 + r * cos(angle * 3.14 / 180 )
            y = y0 + r * sin(angle * 3.14 / 180 )
         *
*/</span>
在这里我们需要想到一个问题,那就是QT的角度计算公式不像在传统的象限中计算,因为传统象限中是:越往右X越大,越往上Y越大。但是QT的画布是:越往右X越大,越往下Y越大,所以会出现:


我们可以看到QT由于Y轴与传统象限相反,所以一、三象限和二、四象限相互调换了。

那么根据QT的象限的规则,我们得出:

//bpoint: 鼠标坐标,centerPoint: 圆心坐标
//第四象限 (0,90)
if(bpoint.rx()>centerPoint.rx() && bpoint.ry()<centerPoint.ry())
{}
//第一象限 (90,180)
else if(bpoint.rx()>centerPoint.rx() && bpoint.ry()>centerPoint.ry())
{}
//第二象限 (180,270)
else if(bpoint.rx()<centerPoint.rx() && bpoint.ry()>centerPoint.ry())
{}
//第三象限 (270,360)
else if(bpoint.rx()<centerPoint.rx() && bpoint.ry()<centerPoint.ry())
{}

我为了好记一点,之后的角度都是按照时钟12点方向为0°(360°)顺时针增加来计算的,

按照上述公式,我们得出如下的代码:

//第四象限 (0,90)
if(bpoint.rx()>centerPoint.rx() && bpoint.ry()<centerPoint.ry())
{
	double k = (double)(bpoint.rx()-centerPoint.rx())/(centerPoint.ry()-bpoint.ry());
	double angle= qAtan(k)/3.1415*180;
	bpoint.setX(centerPoint.rx() + r*qCos((angle-90.0)*3.1415/180));
	bpoint.setY(centerPoint.ry() + r*qSin((angle-90.0)*3.1415/180));
	move(bpoint);
	this->setText(QString::number(angle));
}
我们可以看到上面的代码全都是按照公式来计算的,那么下一个象限是这个样子的:

//第一象限 (90,180)
else if(bpoint.rx()>centerPoint.rx() && bpoint.ry()>centerPoint.ry())
{
	double k = (double)(bpoint.rx()-centerPoint.rx())/(bpoint.ry()-centerPoint.ry());
	double angle= 180-qAtan(k)/3.1415*180;
	bpoint.setX(centerPoint.rx() + r*qCos((angle-90.0)*3.1415/180));
	bpoint.setY(centerPoint.ry() + r*qSin((angle-90.0)*3.1415/180));
	move(bpoint);
	this->setText(QString::number(angle));
}
分析一下,上面两段代码其实没有什么区别,但是angle的计算方法不同是因为按照分四个象限的方法求出的角度都是(0°,90°)的,不能表示90°以上的值,我们将这个角度显示成正常的按照顺时针增加的角度,就可以让摇杆正常显示了。

还有两个象限的代码都是差不多的,只是角度的计算不一样,我就不贴出来了,就这样,模仿Android游戏中的虚拟摇杆制作完毕,说起来很惭愧,完成这个功能只用了一个下午的时间,但是写这个博客却分别占用了三个时间,本以为可以一口气写完的,但是很难静下心来写,最近还有大量的工作需要做,好了,不吐槽了,就这样吧,之后我会将可执行文件发布到此博客中,拜~

2016 年8月29日打卡!

1
0
查看评论

QT 模仿Android游戏中虚拟摇杆(1)让摇杆跟着鼠标飞

主要是接触QT之后,在项目上碰到的一些问题的总结和一些技术的总结
  • qq_27385759
  • qq_27385759
  • 2016-08-24 22:19
  • 1120

android 游戏虚拟摇杆实现

  • 2012-04-30 15:36
  • 1.11MB
  • 下载

教你一步步实现一个虚拟摇杆

各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是http://qinyuanpei.com。最近因为项目需要决定尝试自己来实现一个虚拟摇杆,所以在今天的文章中我们的目标是使用uGUI来制作一个可以在移动平台稳定运行的虚拟摇杆(请不要问我为什么不使用NGUI来实现,你说我做个虚拟摇杆...
  • qinyuanpei
  • qinyuanpei
  • 2015-10-30 15:14
  • 10907

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

此篇博客介绍了如何限定虚拟摇杆在一个圆中移动
  • qq_27385759
  • qq_27385759
  • 2016-08-25 21:42
  • 778

Unity用UGUI做虚拟摇杆

上图是示例图片: 虚拟摇杆主要是开发移动端的游戏用的,市面上这样的游戏有很多,大家也都见过或者玩过了,今天我就给大家说一个巨简单的方法做这个虚拟摇杆,不需要用三角函数,不需要用什么sin,cos的,直接用Unity自带的UGUI就可以了。 正式开始: 现在场景中新建一个panel,创建之后...
  • qq272508839
  • qq272508839
  • 2017-03-05 17:06
  • 3957

android 虚拟摇杆绘制

首先附上效果图 1、自定义RockerView package com.example.rocker; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap...
  • qwjun
  • qwjun
  • 2015-11-19 11:39
  • 3052

Android 虚拟摇杆,多种模式回调,返回距离级别,方向,角度。

Android 虚拟摇杆,多种模式回调,返回距离级别,方向,角度。
  • u014608640
  • u014608640
  • 2016-10-27 18:16
  • 637

虚拟摇杆的surfaceView实现

  • 2017-09-06 09:14
  • 4KB
  • 下载

安卓虚拟摇杆

Rocker安卓虚拟摇杆:由于需要制作一个控制小车移动的应用,使用按键控制不太舒服,故制作了一个虚拟摇杆。该摇杆原理十分简单,就是继承一个surfaceView,然后根据用户操作不断重绘界面,同时返回给用户当前角度。 如果用户不指定摇杆背景和摇杆,则默认绘制两个圆形,效果如下图所示。 摇杆的图...
  • u013831257
  • u013831257
  • 2015-09-15 19:43
  • 5071

android 开发之虚拟摇杆

  • 2015-11-19 11:51
  • 2.42MB
  • 下载
    个人资料
    • 访问:10440次
    • 积分:346
    • 等级:
    • 排名:千里之外
    • 原创:19篇
    • 转载:1篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论