Cocos2d-x 基础示例-精灵移动2

先推荐一下红哥的精灵教程

http://blog.csdn.net/honghaier/article/details/8117903

红哥里面使用的ccTouchesMoved,回忆下我之前的教程,使用的是ccTouchesBegan,大家可以体验一下这两种方式的不同。

当我们的手指触碰到屏幕的一瞬间,调用的是ccTouchesBegan,之后手指如果在屏幕上滑动,手指会一直调用ccTouchesMoved,所以大家可以想象一下这两种方式不同。我的方式会无视之后手指的位置,精灵只会向第一个点击的地方移动。而红哥的方式则是无视第一点触碰的坐标,一直会跟着之后的手指位置移动,这就是 began(起始)和moved(滑动)的区别。

但实际上,我们在正常实现触碰+移动的时候,很少使用ccMove家族的成员,最重要的原因是他们非常死板,很不灵活,除了贝塞尔(CCBezier)同学比较受欢迎,其他的同学基本不能和ccTouch家族结合使用。所以接下来,我们会模拟两种比较实用的方式来实现飞机的移动。

1. 精灵以匀速向当前触摸点行动,当触摸取消时,精灵停止。

这种方式相对而言比较常见,让我们一起实现之。

第一步:让我们在ccTouchesMoved函数中添加一下代码:

CCSetIteratorit=pTouches->begin();

CCTouch* touch=(CCTouch*)(*it);

CCPointm_tBeginPos=touch->locationInView();

m_tBeginPos=CCDirector::sharedDirector()->convertToGL(m_tBeginPos);

等!!!

这里插播个话题,这段代码反复出现(ccTouch家族都用他),功能完全一样!如果大家发现这种倒霉代码,最好考虑把他变成一个更可爱的子函数。

我们在helloworld头文件中加入函数声明:

// 触摸相关

CCPoint convertToGL(CCSet *pTouches);

并且一定要保证这位同学跟ccTouches那三兄弟在一起,这才是良好的编程习惯!!不然等代码量上去了,有你哭的那天。

之后的实现如下

CCPoint HelloWorld::convertToGL(cocos2d::CCSet *pTouches)

{

if (!pTouches) {

CCSetIteratorit=pTouches->begin();

CCTouch* touch=(CCTouch*)(*it);

CCPointm_tBeginPos=touch->locationInView();

m_tBeginPos=CCDirector::sharedDirector()->convertToGL(m_tBeginPos);

return m_tBeginPos;

}

assert(!"pTouches is Null!!!!!");

}

部分同学对这里面的if (!pTouches)和assert(!"pTouches is Null!!!!!"),这是本人编写子函数的一个习惯,这样如果传进来的pTouches参数为空,编译时会直接捕捉到这个错误,而不会继续下传。当然以我们现在这个规模的程序来说,确实是有点杀鸡牛刀了,但我还是推荐大家以后编写子函数的时候使用这种方式

   这样这段代码就封装好了,以后我们编写哪个ccTouch的时候,可以直接使用我们convertToGL了!(这个函数的中文意思是“转换成GL”)

于是我们的ccTouchesMoved函数变成了这样

void HelloWorld::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent)

{

CCPoint m_CurrentPos=convertToGL(pTouches);

}

我们现在获取了当前坐标,该让player向目标移动了!

第一:先定义飞机向那儿移动的速度。

在头文件中增加

private:

float playerSpd=1;

定义playerSpd为速度,初始值为1。

第二:找出当前帧移动的单位向量

这里普及一下基础的几何知识,一个从点A和点B的向量AB,它是B点的坐标对应减掉A点的坐标。例如A点坐标是(a1,a2),B点坐标是(b1,b2),那么AB向量为(b1-a1,b2-a2).

但是我们单求“向量”是不对的,我们应该求的是“单位向量”。这个单位向量非常神奇,A点坐标加上(单位向量乘以两点间距离)之后,得出的结果是B点坐标。而速度则是每帧移动的距离,则(单位向量*速度)就可以计算出每帧的点坐标值啦!大家可以理解这个“单位向量”为“方向”。

为了实现这一步,我们可以定义一个子函数来实现上述过程,问题就在于这个子函数应该定义在什么地方。

其实可以思考一下,我们什么时候会用到这个子函数?所有存在CCPoint的情况下!

所以这个子函数最好定义在CCPoint类的类内。

另外一方面,为了能够让过程和数学过程更像,我们需要重载CCPoint的减号“-”,让这个函数支持两个CCPoint类做减法。

So,在CCPoint类的实现中中添加如下两个函数体(声明我就不写了,懒,大家自己加到头文件里吧)

CCPoint& CCPoint::operator- (const CCPoint& other)

{

this->x= this->x-other.x;

this->y= this->y-other.y;

return *this;

}

另外增加计算单位向量的函数

CCPoint CCPoint::computeUnitVector()

{

CCPoint p1=*this;

assert(sqrt((p1.x)*(p1.x)+(p1.y)*(p1.y)));

p1.x=p1.x/sqrt((p1.x)*(p1.x)+(p1.y)*(p1.y));

p1.y=p1.y/sqrt((p1.x)*(p1.x)+(p1.y)*(p1.y));

return p1;

}上面这个函数直接计算出某向量的单位向量了.

现在CCPoint类已经不单纯是一个“点”了,它现在还可以表示一个“向量”和“单位向量”,所以我们还需要用到让CCPoint类能够乘以一个speed。

在CCPoint头文件中加入定义,并在在CCPoint实现文件中,加入如下代码:

CCPoint& CCPoint::operator*(const float& speed)

{

this->x=this->x*speed;

this->y=this->y*speed;

return *this;

}

另一方面,还需要重载CCPoint的+号函数,能让两个CCPoint相加,得出一个新坐标,具体实现如下

CCPoint& CCPoint::operator+(const CCPoint &other)

{

this->x= this->x+other.x;

this->y= this->y+other.y;

return *this;

}

OK,让我们回到CCTouchesMoved中;加入如下代码

void HelloWorld::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent)

{

CCPoint m_CurrentPos=convertToGL(pTouches);

//获得当前坐标

CCPoint playerCurPos=player->getPosition();

//如果距离不为0,则向那个方位移动一个速度

if (ccpDistance(playerCurPos,m_CurrentPos)!=0)

{

CCPointm_vector=m_CurrentPos-playerCurPos;

//将m_vector转换为单位向量

m_vector=m_vector.computeUnitVector();

//每次调用ccTouchesMoved的时候,都向单位方向移动一个速度值

player->setPosition(playerCurPos+m_vector*playerSpd);

}

}

现在,当玩家在屏幕上滑动时,飞机就会向触摸的地方移动了。但有一个非常残酷的事实… 现在只有滑动的时候,才会调用CCTouchesMoved - -,CCTouchesMoved对对触摸进行了判断,所以现在这架飞机变成了非常奇异的家伙,你滑动手指,才会向你移动,你不滑动手指,他坚决不动.

很遗憾~苹果在底层做了判断,毕竟,如果手一直按住都响应的话,那设备将及其费电- -,所以我们只能换另外一种方式了~

可以仔细思考一下我们需求的流程,如下:

点击屏幕,则屏幕向该点以一定速度移动。

如果中途发生滑动,则修改该点坐标

如果触摸停止,则此动作停止

所以我们可以采用另外一种方式来实现此功能

ccTouchesBegan用来初始化点坐标,并激活飞机的一个动作,此动作不停得向触摸点移动

ccTouchesMoved用来改变此点的坐标

ccTouchesEnded终结此动作。

我们如果需要实现此功能,则需要以上三个函数协同工作,才能共同达成目标,下一讲将会讲述如何实现此功能。

Cocos2d-x 基础示例-精灵移动2相关推荐

  1. Python面向对象基础示例_创建对象

    Python面向对象基础示例_创建对象 python是面向对象的语言,你可以很轻松的创建一个类和对象.本书代码源自<<Python 3 Object-Oriented Programmin ...

  2. Membership三步曲之入门篇 - Membership基础示例

    Membership 三步曲之入门篇 - Membership基础示例 Membership三步曲之入门篇 -  Membership基础示例 Membership三步曲之进阶篇 -  深入剖析Pro ...

  3. 运维之DNS服务器Bind9配置解析和基础示例及附带命令

    0x03 Bind 配置解析 实例1.DNS主从区域传输介绍与配置 实例2.DNS区域传输限制 实例3.DNS部分二级域名解析 示例1.采用Bind建立一个A记录DNS服务器 示例2.采用Bind建立 ...

  4. Mybatis3基础示例

    Mybatis3基础示例 一.搭建流程 总体项目结构: 1.Maven依赖 2.配置文件 Mybatis-config.xml 3.封装MybatisUtils工具类 4.其他 二.CURD 1.接口 ...

  5. 1. awk基础,awk介绍,awk基本语法,直接使用action,打印列,初识列和行,\$0、\$NF、NF,基础示例,begin模式,end模式

    文章目录 前言 awk介绍 awk基本语法 直接使用action 打印列 初识列和行 \$0.\$NF.NF 基础示例 初识模式(begin end) 总结 友情链接 前言 本小节是awk基础入门课程 ...

  6. php app接口开发,「PHP开发APP接口实战005」基础示例接口的实现一

    前一章,我们对接口参数基本定义做了一个简要说明.里面提到了几个示例接口,接下来,我们就来讲解这个几点个示例接口的具体实现. 「PHP开发APP接口实战004」基础响应参数说明 前言 由于我们的接口返回 ...

  7. GSAP动画库入门基础示例:心爱的小摩托

    大家好,在我们谈论网页动画时,我们第一时间会想到用jQuery的animate()方法或者CSS3的animation和transition.今天的这篇文章,我将给大家推荐另一个可选方案,一款专业的W ...

  8. .NET基础示例系列之六:委托及事件

    委托是一个类. 定义委托时,实是定义一个用户自定义的类,它能代表具有相同参数列表和返回类型的任何方法,方法可以是静态方法或成员方法.示例: public partial class Form1 : F ...

  9. 菜单工具栏wxPython菜单与工具栏基础示例

    这两天一直在学习菜单工具栏之类的问题,上午正好有机会和大家讨论一下. 1.基本的api介绍 Package wx :: Class Menu Type Menu Method Summary Menu ...

最新文章

  1. 理解linux tr命令
  2. 钢铁飞龙每个人的机器人_让人震撼的特斯拉超级工厂全自动生产线
  3. Spring8:一些常用的Spring Bean扩展接口
  4. nyoj 61(双线程dp)
  5. linux postfix 搭建,linux 下搭建postfix服务器
  6. [js高手之路] html5 canvas系列教程 - 线条样式(lineWidth,lineCap,lineJoin,setLineDash)
  7. 收集到的非常好的第三方控件
  8. leetcode 1002. 查找常用字符
  9. 登录页面(通过数据库查询密码是否正确)
  10. 的input最大长度_LeetCode 84 | 单调栈解决最大矩形问题
  11. [翻译]在SQL Server中使用CLR调用.NET方法
  12. greenplum客户端工具_GreenPlum数据加载工具gpload | 信春哥,系统稳,闭眼上线不回滚!...
  13. 简易中控紫猫插件版(2)基本思路介绍
  14. html图片轮播效果加链接,HTML首页怎么加图片轮播?
  15. 计算机大作业的范本,计算机应用基础大作业.doc
  16. 论文阅读:Efficient Image Dehazing with Boundary Constraint and Contextual Regularization
  17. html表格宽度设置没效果,html表格宽度设置失效
  18. 淘宝知网查重怎么样?
  19. 切面条/猜字母/大衍数列/奇怪的分式
  20. 阿里云化身“智能云管”,助力中国联通首次实现大规模平台自主运维

热门文章

  1. 计算机网络之浅谈移动互联网(3G-4G-5G与WEB1.0-2.0-3.0)
  2. 小米Pro安装驱动+CUDA+CuDNN
  3. Steam注册到交易
  4. 用Word2003也能给文档加上稿纸(转)
  5. 黑社会交易用计算机,遭遇网络黑社会亲们都是怎么处理的
  6. 工程流体力学笔记暂记25 (管内流动的流态与损失-雷诺数)
  7. 【DP】洛谷公开赛 CYJian的水题大赛 T1 八百标兵奔北坡
  8. gis 联合 融合_三大院齐聚郑州,共同探索BIM+GIS和大数据应用的无限可能
  9. Android 唯一识别码
  10. Python中单引号和双引号的区别