Cocos2d-x 精灵的移动
上一篇我们已经将飞机放到了屏幕上,接下来,我们得让它动起来。
第一问题:控制问题
iOS设备有两种输入方式,一种是重力感应,另外一种是触摸屏幕(你要非跟我说Home键也算一种输入方式的话..那就是三种)。
Cocos2d-x中的CCLayer类的最重要功能,就是接收这两种输入方式。鉴于模拟器无法复现重力感应,所以这篇文章主要介绍触摸的功能。
这次的主要目标是:点击屏幕上一个点,飞机向那个点飞去。
OK,开始
第一步,我们先要开启Helloworld里中的触摸感应功能;将下列代码添加到helloworld的init函数中
//打开触摸感应
this->setTouchEnabled(true);
好吧,我们先搞清楚这句话是咋来的。this代表的是当前helloword这个对象,而setTouchEnabled则是继承自CCLayer的一个函数(鼠标邮件查看定义,这是基本功),还记得我们的helloworld类命后面那段巨大个儿的代码么?
classHelloWorld : publiccocos2d::CCLayer
对,就素它。
它表示helloworld继承于CCLayer类,所以可以使用CCLayer类的函数,OK,接下来直接去CCLayer类中找到这跟触摸相关的函数,将其定义复制到helloworld类的头文件中去:
// 触摸相关
virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesCancelled(CCSet *pTouches,CCEvent *pEvent);
稍微讲解下这几个函数的作用
ccTouchesBegan接受的是你点击屏幕的那一下的信息
ccTouchesMoved接受的是手指在屏幕上滑动/停留的信息
ccTouchesEnded 接受手指离开屏幕的那下下~
ccTouchesCancelled很罕见的情况才会用到这厮,例如,突然来电话啦~没电啦..不过话说通常的游戏也不会在那时候进行处理。
还要注意的一个问题,上面几个函数都是有单数形式的,即Touch后面没有es复数词缀,支持的是单点触摸,但由于单点触摸在CCLayer中需要自己去注册,老夫的懒虫劲又上来了,所以
好的,让我们先实现一下,点击某点之后,召唤飞机到你点的那个坐标上去。
我们先采用ccTouchesBegan函数,在helloworld的ccTouchesBegan函数体中写上以下代码:
CCSetIteratorit=pTouches->begin();
CCTouch* touch=(CCTouch*)(*it);
CCPointm_tBeginPos=touch->locationInView();
m_tBeginPos=CCDirector::sharedDirector()->convertToGL(m_tBeginPos);
CCLog("Positionis %f and %f",m_tBeginPos.x,m_tBeginPos.y);
OK,有点迷茫了是吧?
前三句是获取了触碰点在iOS设备屏幕上的坐标,第四句呢?
要知道一点,iOS设备和openGL的坐标系有所区别,所以我们呼唤出万能的CCDirector类来帮忙,转化为openGL坐标系。
最后的一句话调用了一个CCLog,是一个比较常用的调试办法,在命令行输出信息,这样就更能方便你查看后台究竟发生了什么。当然了,在发布前一定要注意把这些话给删掉,后台大量的输出信息,是及其影像效率的。
接下来呢,是让飞机移动到这个坐标上。
我们在下面继续添加:
CCAction* moveto=CCMoveTo::actionWithDuration(2, m_tBeginPos);
player->runAction(moveto);
这两句是声明了一个moveto的动作,要注意的是actionWithDuration的两个参数,前面的是时间,后面的是CCPoint的位置。
第二句则更简单,使用player精灵调用了runAction。
现在运行模拟器,点击后,你会发现飞机精灵在两秒钟之内移动到了你点击的位置。
大家多玩几次,就会发现这种方式非常死板,无论距离何如,飞机总是在2秒内慢慢飘向触摸位置,而且实际上这种方式在连续点击的时候,效率非常低,实用性也不高,也可能是老夫是新手的缘故,实在找不出使用这种方式的理由。所以下一节,我们会采用一种更好的方式,更现实的方式来实现这个功能。