现在我们的小精灵已经可以很好的响应触摸操作.为了画面有更好的交互性,我们决定在小精灵移动的终点增加一个跳动的小箭头以指示小精灵的目的地.
首先我们要实现一个播放箭头动画的类,其中包括两个很重要的函数arrow_Play用于播放箭头动画.arrow_Stop用于终止箭头动画
#pragma once #include "cocos2d.h" class Arrow: public cocos2d::CCNode { protected: //箭头精灵 cocos2d::CCSprite *s_arrow; //箭头动画 cocos2d::CCAnimate *arrowAni; public: ~Arrow(); //覆盖初始化函数 bool init(); //播放箭头动画 void arrow_Play(cocos2d::CCPoint p); //停止箭头动画 void arrow_Stop(); //利用CREATE_FUNC宏进行内存自动回收 CREATE_FUNC(Arrow); };其次我们稍微修改一下Hero的move函数,增加两个参数:
void move(const cocos2d::CCPoint& position,CCObject *pTarget,SEL_CallFunc pMoveEnd);pMoveEnd表示当move函数当移动结束后要执行的动作.pTarget表示要执行该函数的对象.
由于我们并不想在move函数中执行pMoveEnd函数,所以我们把他们保存到Hero的成员变量中.
//通过计算获得英雄移动方向 void Hero::move(const cocos2d::CCPoint& position,CCObject *pTarget,SEL_CallFunc pMoveEnd) { obj = pTarget; moveEnd = pMoveEnd; . . . }我们想在人物到达终点,或遇到障碍物时执行pMoveEnd函数.所以我们就在Hero类中的stand与collisionStand两个函数中加入执行pMoveEnd函数.
//战立动作
void Hero::stand()
{
hState = STAND;
sprite->stopAllActions();
this->stopAllActions();
(obj->*moveEnd)();
}
collisionStand代码就不贴出来了,形式和stand一样,在函数的结尾处增加(obj->*moveEnd)();
void Scene1::hideArrow() { arrow->arrow_Stop(); }并在hero移动的函数move中传入该函数指针.
void Scene1::ccTouchEnded(CCTouch* pTouch,CCEvent* event) { hero->move(pTouch->getLocation(),this,callfunc_selector(Scene1::hideArrow)); arrow->arrow_Play(hero->moveObjPoint); }把Scene对象this也传入其中,表示当前的Scene对象执行hideArrow函数.
arrow->arrow_Play(hero->moveObjPoint)表示在hero移动的终点播放箭头动画.
这样就完成了
刚刚我们通过函数指针实现了类似委托的功能,下面来总结一下实现过程:
1.定义好传入执行对象与函数指针obj,moveEnd.
2.设置传入位置.void move(const cocos2d::CCPoint& position,CCObject *pTarget,SEL_CallFunc pMoveEnd);
3.设置在合适的地方执行函数指针位置(obj->*moveEnd)()
4.使用时传入要执行的函数指针与该指针对应的对象就可以了。
hero->move(pTouch->getLocation(),this,callfunc_selector(Scene1::hideArrow));