HeroLayer类主要是处理hero的一些相关东西,以及调用bulletLayer的一些方法,因为子弹是附属于hero的~~
HeroLayer 类的成员如下:
1 class HeroLayer : public CCLayer 2 { 3 public: 4 5 static HeroLayer* create(); 6 virtual bool init(); 7 8 virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);//触摸事件 9 void moveHero(CCPoint toPoint);//移动hero 10 11 void heroBomb(float dt);//hero爆炸处理 12 void newLifeInit(float dt);//hero爆炸后初始化新的开始 13 14 15 CC_SYNTHESIZE(CCSprite*, m_Hero, Hero); 16 CC_SYNTHESIZE(bool, m_IsHeroLive, IsHeroLive); 17 CC_SYNTHESIZE(BulletLayer*, m_Bullets, Bullets); 18 CC_SYNTHESIZE(int, m_HeroLifes, HeroLifes); 19 20 private: 21 22 cocos2d::CCSize designResolutionSize; 23 24 };
重点一:touchesMoveed 移动hero
这里主要是设计到坐标转换问题,cocos2dx里有几种坐标系:UI坐标系、GL坐标系、本地坐标系和世界坐标系:
UI坐标系:以屏幕的左上角为原点,X坐标向左为正,Y坐标向下为正,一些touch事件获取到的坐标就是以这个坐标系为标准的。
GL坐标系:也就是openGL坐标系,以屏幕的左下角为原点,X坐标向左为正,Y坐标向上为正,cocos2dx引擎底层是openGL,也用这个坐标系,一些控件的添加或设置是以这个坐标系为准的。
本地坐标系:子节点的左下角相对于父节点左下角的坐标,也就是以父节点的左下角为坐标原点,X坐标向左为正,Y坐标向上为正。boundingBox 方法获取到的节点的rect的坐标就是这个坐标。
cocos2dx提供了一些方法来实现不同坐标系的转换,其实cocos2dx也提供了直接从触摸点的参数里获取GL坐标。
ccTouchesMoveed方法实现如下:
1 void HeroLayer::ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent) 2 { 3 /* 4 * 坐标系统 5 * cocos2dx坐标系统(opengl坐标系统):以左下角为原点 6 * UI坐标系统(绘图坐标系统、纹理坐标系统):以左上角为原点 7 */ 8 9 //hero是否还活着 10 if(this->m_IsHeroLive) 11 { 12 /* 13 * 触摸事件获取坐标的几个方法 14 * 15 * getLocation:获取触摸时第一点的cocos2dx 坐标 16 * getPreviousLocation 获取触摸时最后一点 cocos2dx 坐标 17 * getLocationInView 获取触摸时第一点的UI坐标 18 * getPreviousLocationInView 获取触摸时的最后一点 UI坐标 19 */ 20 21 CCTouch *touches = (CCTouch*)pTouches->anyObject(); 22 23 CCPoint beginPoint = touches->getLocation();//获取触摸坐标(cocos2dx坐标系统的) 24 25 CCRect planeRect = this->m_Hero->boundingBox();//获取飞机当前位置形状位置 26 27 //允许稍微加大一点触摸位置,游戏实际需要 28 //planeRect.origin.x -= 15; 29 //planeRect.origin.y -= 15; 30 //planeRect.size.width += 30; 31 //planeRect.size.height += 30; 32 33 if(planeRect.containsPoint(beginPoint)) 34 { 35 CCPoint endPoint = touches->getPreviousLocation();//获取触摸的前一个位置 36 HeroLayer::moveHero(endPoint); //移动飞机 37 } 38 } 39 }