wq右边写的。


项目所用图片资源下载:http://download.csdn.net/detail/jukai7/5096755

解压我们下载的图片资源,有三个图片,其中飞机图片是被控制的对象,剩下的两个我们组合起来制作摇杆,想必这个摇杆最后的样子大家已经猜到了吧,如下所示,即用圆圈作为控制按钮,滑动圆圈,根据其所在位置来设置飞机应该运行的方向。

首先我们新建一个工程,取名为JoyStick,并把刚才下载的图片资源添加进我们的项目。具体的添加方法就不说了,之前的文章都有过说明。在开始编写代码之前,我们先来分析一下摇杆实现的原理。我们是根据圆圈所在位置来判定飞机的移动方向的,我画了一个简单的示意图,来跟大家说明一下(图画的很粗糙,见谅……)。


从这个简单的示意图我们可以看到,我把这个摇杆图片用一个外切正方形框了起来,用虚线分成了九个大小相等的正方形区域,然后又把中间的圆圈所在正方形区域分成了大小相等的四个等腰直角三角形区域。于是我们得到了大小共12个区域,并进行了编号处理。接下来我们就可以根据这些区域来进行判定了。

当我们滑动圆圈时,触点移动到区域1,3,10,12时,我们分别规定飞机的飞行方向为:左上,右上,左下,右下。当触点移动到区域2或区域5时,我们规定飞机向上飞行;移动到区域6或11时,向下;区域4或7时,向左;区域9或8时,向右。

好了,基本原理已经说清楚了,我们就来说一下怎么具体判定触点是在哪块区域里面的?这里我们首先定义一些变量,我们规定大圆的半径为R,中间小圆的半径为r,九个相同大小的正方形的边长为d,即2r,大圆和小圆共同的中心点为O,触点为location。

首先左上,右上,左下,右下四个方向我们比较容易进行判定,左上方向即location.x<(O.x-r)&&location.y>(O.y+r);右上方向为location.x>(O.x+r)&&location.y>(O.y+r);左下为location.x<(O.x-r)&&location.y<(O.y-r);右下为location.x>(O.x+r)&&location.y>(O.y-r)。

然后是上下左右四个方向。每个方向上我们分为两个区域进行判断,首先是判定触点在区域2,11,4,9分别来决定飞机的方向为上,下,左,右。这四个区域都是正方形,比较好判断,例如判定方向上,只要证明触点在以区域2左下角为原点,边长d的正方形内即可。判定是区域2(上)的代码实现为CCRectMake(O.x-r,O.y+r,d,d).containsPoint(location);区域11(下)的代码实现为CCRectMake(O.x-r,O.y-radius1-d,d).containsPoint(location);区域4(左)的代码实现为CCRectMake(O.x-r-d,O.y-r,d).containsPoint(location);区域9(右)的代码实现为CCRectMake(O.x+r,d).containsPoint(location)。

最后是中间四个三角形区域5,6,7,8的判定。要想判定触点在一个三角形内,我们会模糊的记着以前高中是不是经常出这种证明题?对啦,我们就用三角形面积来做。如果一个点包含在一个三角形内,那么从三角形三个顶点中相邻两个顶点到这个点做连线形成新的三个小三角形,这三个新三角形的面积和一定等于原先的那个大三角形面积。相反,如果这个点在三角形外部则一定大于原先三角形的面积,如下图所示:


那么我们怎么求这四个三角形的面积呢?可以根据海伦公式来求。我们知道三角形三个顶点和触点的坐标,那么根据两点间直线距离公式来求得每个三角形的三条边的大小,假设为a,b,c。那么每个三角形的半周长为L=(a+b+c)/2。

于是我们根据海伦公式求得每个三角形的面积。根据求得的结果进行判断即可得知触点是否在四个三角形区域内。例如判断是否在区域5内,我们指定三角形的三个顶点坐标为p1(O.x,O.y),p2(O.x-r,O.y+r),P3(O.x+r,O.y+r)。触点坐标为p(location.x,location.y)。那么S为p1,p2,p3三点组成三角形的面积,S1为p1,p三点组成三角形面积,S2为p2,p3,p三点,S3为p3,p1,p三点。那么判断是否S=S1+S2+s3即可。向下,左,右三方向同理可证。

讲了这么多,我们是时候用代码来具体的实现了。代码我就不做详细的注释了,因为该了解的上面都讲过了。回到我们一开始创建的项目JoyStick,我们需要的图片已经导入到工程中了。我把修改后的HelloWorld.h文件和HelloWorld.cpp文件内容粘贴出来,大家看一下,具体实现的过程我就不讲了,必要的注释也都加上了,有不懂得地方再讨论交流。

HelloWorld.h文件内容如下:

[cpp] view plain copy
  1. #ifndef__HELLOWORLD_SCENE_H__
  2. #define__HELLOWORLD_SCENE_H__
  3. #include"cocos2d.h"
  4. #include"SimpleAudioEngine.h"
  5. classHelloWorld:publiccocos2d::cclayer
  6. {
  7. public:
  8. //Here'sadifference.Method'init'incocos2d-xreturnsbool,insteadofreturning'id'incocos2d-iphone
  9. virtualboolinit();
  10. staticcocos2d::CCScene*scene();
  11. voidmenuCloseCallback(CCObject*pSender);
  12. virtualvoidcctouchesBegan(cocos2d::CCSet*ptouches,cocos2d::CCEvent*pEvent);
  13. voidcctouchesMoved(cocos2d::CCSet*ptouches,cocos2d::CCEvent*pEvent);
  14. voidcctouchesEnded(cocos2d::CCSet*ptouches,248); line-height:18.095239639282227px; margin:0px!important; padding:0px 3px 0px 10px!important"> //求三角形面积的函数
  15. floatheronsformula(floatx1,floaty1,87); background-color:inherit; font-weight:bold">floatx2,87); background-color:inherit; font-weight:bold">floaty2,87); background-color:inherit; font-weight:bold">floatx3,87); background-color:inherit; font-weight:bold">floaty3);
  16. //判断三个新三角形面积和是否等于原先三角形面积的函数
  17. booltriangleContainPoint(floaty3,87); background-color:inherit; font-weight:bold">floatpx,87); background-color:inherit; font-weight:bold">floatpy);
  18. CREATE_FUNC(HelloWorld);
  19. private:
  20. voidflying(floatdt);
  21. cocos2d::CCSprite*joystick;
  22. //中心点O
  23. cocos2d::CCPointO;
  24. //大圆半径
  25. floatR;
  26. cocos2d::CCSprite*plane;
  27. //飞机飞行的速度分量值
  28. floatspeedX;
  29. floatspeedY;
  30. //是否飞行的标志
  31. boolisFlying;
  32. };
  33. #endif//__HELLOWORLD_SCENE_H__

HelloWorld.cpp文件内容如下:

copy

cocos2dx虚拟摇杆制作【极力推荐】的更多相关文章

  1. ios – didUpdateLocations从未调用过

    我正在尝试获取用户的位置.为此,我在info.plist中设置了以下属性:我还在viewDidLoad方法中添加了以下代码以及下面的函数.问题是locationManager(manager,didUpdate…

  2. ios – 重命名并重写为Swift后对象解码崩溃

    由于我们已经重命名了(Bestemming–>Place)类并将其从Objective-c重写为Swift,因此一些用户会遇到崩溃.我们正在尝试使用NSCoding原则从NSUserDefaults加载对象.碰撞:班级:从NSUserDefaults阅读:崩溃日志说它在第0行崩溃,这是注释所以我认为它在init方法中崩溃,我认为它与一个null为空但不能为null的对象有关.我尝试过的:>尝试在S

  3. 适用于iOS的Google Maps SDK不断增加内存使用量

    我已经构建了一个在地图上显示标记的简单应用程序,我从服务器的JSON文件加载其x,y,标记是可点击的,所以一旦你在任何标记上它将你带到另一个UIViewController(我们将它命名为BViewController).我已经监视了内存使用情况,所以每次我从BViewController返回到MapViewController(里面的地图)时,它只是内存使用量的两倍我尝试将其设置为nill或从s

  4. ios – 未提示在应用程序中启用位置服务

    更新:这不是重复.我已经在info.plist中添加了所需的密钥,如我原始问题中所述,问题仍然存在.我已经尝试了各种组合的所有三个键.在任何人感到不安之前,我已阅读了许多AppleDev论坛帖子和堆栈溢出帖子,无法弄清楚为什么我的应用程序拒绝提示用户允许使用时授权.我已将以下密钥添加到我的Info.plist文件中,并附带一个String值:然后我写了(在Swift和Obj-C中)应该提示用户的代

  5. ios – 在UIViewController显示为3DTouch预览时检测UITouches

    是否有可能从UIViewController检测触摸并获取触摸的位置,UIViewController当前用作3DTouch的previewingContext视图控制器?

  6. ios – Google地图折线不完美呈现

    我正在使用最新的GoogleMapsAPIforiOS绘制折线.我正在逐点构造折线,但是当我缩小折线从地图中消失(不是字面上的术语)时,它不能正常渲染,当我放大时,它只会显示线条.这是放大时折线的显示方式这是缩小时的显示方式这里是我绘制折线的功能我有覆盖init:为RCpolyline是这样的东西和drawpolylineFromPoint:toPoint:这样做解决方法我发现这个故障,我正在制作

  7. ios – CLGeocoder错误. GEOErrorDomain代码= -3

    有没有关于apple的地理编码请求的文档?谢谢你提前.更新这是我的整个代码请求解决方法在搜索到答案后,它在Apples文档中!

  8. ios – Sprite Kit – 确定滑动精灵的滑动手势向量

    我有一个游戏,圆形物体从屏幕底部向上射击,我希望能够滑动它们以向我的滑动方向轻弹它们.我的问题是,我不知道如何计算滑动的矢量/方向,以便使圆形物体以适当的速度在正确的方向上被轻弹.我正在使用的静态矢量“(5,5)”需要通过滑动的滑动速度和方向来计算.此外,我需要确保一旦我第一次接触到对象,就不再发生这种情况,以避免双重击中对象.这是我目前正在做的事情:解决方法以下是如何检测滑动手势的示例:首先,定

  9. ios – 如何使用Swift使用Core Data更新/保存和保留非标准(可转换)属性?

    我已经构建了一个非常基本的示例来演示我尝试更新可转换类型并在应用程序重新启动之间保持更改的问题.我有一个Destination类型的实体……解决方法核心数据无法跟踪该对象的脏状态,因为它不了解其内部.而不是改变对象,创建一个副本,改变它,然后设置新对象.它可能会变异,然后重新设置相同的对象,不确定,没有测试它.您可以检查,只是改变地址,然后询问托管对象是否有更改,如果没有则则不会保存.

  10. iOS检测模拟位置

    我假设一个封闭的目标,攻击者必须是开发人员才能使这个漏洞利用起来,但是唉,它仍然存在解决方法问题:有没有办法检测到这种行为并阻止它?实际上有两个独立的问题:如何检测,以及如何预防?

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部