首页 > 代码库 > 分析Cocos2d-x横版ACT手游源代码 2、服务器场景
分析Cocos2d-x横版ACT手游源代码 2、服务器场景
还是一样 直接上代码 源代码 下一篇 上传 大家可以自己看
NFServerChangeLayer.h
</pre><pre name="code" class="cpp">/************************************************************************/ /* 服务器切换层 */ /************************************************************************/ class CNFServerChangeLayer : public CCLayer , public CMsgReceiver ,public CMsgSender { protected: //标签 enum { enTagScrollLayer = 1, }; int m_nCurrentServerID; public: static CNFServerChangeLayer * CreateLayer(int nCurrentServerID,int nServerTotalNum); //当前服务器ID,服务器总数量 //消息接收 virtual void RecMsg(int nMsgID,void* pInfo,int nSize); protected: virtual bool InitLayer(int nCurrentServerID,int nServerTotalNum); //按钮回调:返回 void OnBtnCallBack(CCObject * pObj); //按钮回调:向左滑动 void OnBtnLeftMove(CCObject * pObj); //按钮回调:向右滑动 void OnBtnRightMove(CCObject * pObj); }; #endif
<span style="white-space:pre"> </span>.cpp文件
#include "NFServerChangeLayer.h" #include "NFServerChangeScrollLayer.h" CNFServerChangeLayer * CNFServerChangeLayer::CreateLayer(int nCurrentServerID,int nServerTotalNum) { <span style="white-space:pre"> </span>CNFServerChangeLayer *pRet = new CNFServerChangeLayer(); <span style="white-space:pre"> </span>if (pRet && pRet->InitLayer(nCurrentServerID,nServerTotalNum)) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>pRet->autorelease(); <span style="white-space:pre"> </span>return pRet; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>CCLog("Fun CNFServerChangeLayer::CreateLayer Error!"); <span style="white-space:pre"> </span>delete pRet; <span style="white-space:pre"> </span>pRet = NULL; <span style="white-space:pre"> </span>return NULL; } bool CNFServerChangeLayer::InitLayer(int nCurrentServerID,int nServerTotalNum) { <span style="white-space:pre"> </span>do <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>//初始化父类 <span style="white-space:pre"> </span>CC_BREAK_IF(CCLayer::init()==false); <span style="white-space:pre"> </span>m_nCurrentServerID = nCurrentServerID; <span style="white-space:pre"> </span>/************************************************************************/ <span style="white-space:pre"> </span>/*<span style="white-space:pre"> </span>背景图片 */ <span style="white-space:pre"> </span>/************************************************************************/ <span style="white-space:pre"> </span>//创建背景 <span style="white-space:pre"> </span>CCSprite * pBg = CCSprite::create("ui/serverselect_bg.png"); <span style="white-space:pre"> </span>CC_BREAK_IF(pBg==NULL); <span style="white-space:pre"> </span>pBg->setPosition(SCREEN_CENTER); <span style="white-space:pre"> </span>pBg->setScaleX( (float)CCDirector::sharedDirector()->getWinSize().width/(float)pBg->getContentSize().width ); <span style="white-space:pre"> </span>addChild(pBg,enZOrderBack); <span style="white-space:pre"> </span>//创建上次登录图片 <span style="white-space:pre"> </span>CCSprite * pBg1 = CCSprite::create("ui/serverselect_title_1.png"); <span style="white-space:pre"> </span>CC_BREAK_IF(pBg1==NULL); <span style="white-space:pre"> </span>pBg1->setPosition(ccp(150+_NF_SCREEN_WIDTH_DIS_,420)); <span style="white-space:pre"> </span>addChild(pBg1,enZOrderBack); <span style="white-space:pre"> </span>//创建全服务器图片 <span style="white-space:pre"> </span>CCSprite * pBg2 = CCSprite::create("ui/serverselect_title_2.png"); <span style="white-space:pre"> </span>CC_BREAK_IF(pBg2==NULL); <span style="white-space:pre"> </span>pBg2->setPosition(ccp(160+_NF_SCREEN_WIDTH_DIS_,300)); <span style="white-space:pre"> </span>addChild(pBg2,enZOrderBack); <span style="white-space:pre"> </span>/************************************************************************/ <span style="white-space:pre"> </span>/*<span style="white-space:pre"> </span>创建按钮 */ <span style="white-space:pre"> </span>/************************************************************************/ <span style="white-space:pre"> </span>CCMenu * pMenu = CCMenu::create(); <span style="white-space:pre"> </span>CC_BREAK_IF(pMenu==NULL); <span style="white-space:pre"> </span>pMenu->setPosition(CCPointZero); <span style="white-space:pre"> </span>addChild(pMenu,enZOrderFront); <span style="white-space:pre"> </span>//创建返回按钮 <span style="white-space:pre"> </span>//CCMenuItemSprite * pBtnBack = CCMenuItemSprite::create( <span style="white-space:pre"> </span>//<span style="white-space:pre"> </span>CCSprite::create("ui/serverselect_btn_back_n.png"), <span style="white-space:pre"> </span>//<span style="white-space:pre"> </span>CCSprite::create("ui/serverselect_btn_back_p.png"), <span style="white-space:pre"> </span>//<span style="white-space:pre"> </span>this, <span style="white-space:pre"> </span>//<span style="white-space:pre"> </span>menu_selector(CNFServerChangeLayer::OnBtnCallBack)); <span style="white-space:pre"> </span>//CC_BREAK_IF(pBtnBack==NULL); <span style="white-space:pre"> </span>//pBtnBack->setPosition(ccp(SCREEN_WIDTH - 30,SCREEN_HEIGHT-30)); <span style="white-space:pre"> </span>//pMenu->addChild(pBtnBack,enZOrderFront); <span style="white-space:pre"> </span>//创建当前服务器按钮 <span style="white-space:pre"> </span>CCMenuItemSprite * pBtnCurrentServer = CCMenuItemSprite::create( <span style="white-space:pre"> </span>CCSprite::create("ui/btn_enter_n.png"), <span style="white-space:pre"> </span>CCSprite::create("ui/btn_enter_p.png"), <span style="white-space:pre"> </span>this, <span style="white-space:pre"> </span>menu_selector(CNFServerChangeLayer::OnBtnCallBack)); <span style="white-space:pre"> </span>CC_BREAK_IF(pBtnCurrentServer==NULL); <span style="white-space:pre"> </span>pBtnCurrentServer->setPosition(ccp(190+_NF_SCREEN_WIDTH_DIS_,380)); <span style="white-space:pre"> </span>pMenu->addChild(pBtnCurrentServer,enZOrderFront); <span style="white-space:pre"> </span>//创建左侧按钮 <span style="white-space:pre"> </span>CCMenuItemSprite * pBtnLeft = CCMenuItemSprite::create( <span style="white-space:pre"> </span>CCSprite::create("ui/serverselect_btn_back_n.png"), <span style="white-space:pre"> </span>CCSprite::create("ui/serverselect_btn_back_p.png"), <span style="white-space:pre"> </span>this, <span style="white-space:pre"> </span>menu_selector(CNFServerChangeLayer::OnBtnLeftMove)); <span style="white-space:pre"> </span>CC_BREAK_IF(pBtnLeft==NULL); <span style="white-space:pre"> </span>pBtnLeft->setPosition(ccp(50+_NF_SCREEN_WIDTH_DIS_,150)); <span style="white-space:pre"> </span>pMenu->addChild(pBtnLeft,enZOrderFront); <span style="white-space:pre"> </span>//创建右侧按钮 <span style="white-space:pre"> </span>CCMenuItemSprite * pBtnRight = CCMenuItemSprite::create( <span style="white-space:pre"> </span>CCSprite::create("ui/serverselect_btn_back_n.png"), <span style="white-space:pre"> </span>CCSprite::create("ui/serverselect_btn_back_p.png"), <span style="white-space:pre"> </span>this, <span style="white-space:pre"> </span>menu_selector(CNFServerChangeLayer::OnBtnRightMove)); <span style="white-space:pre"> </span>CC_BREAK_IF(pBtnRight==NULL); <span style="white-space:pre"> </span>pBtnRight->setPosition(ccp(SCREEN_WIDTH-_NF_SCREEN_WIDTH_DIS_-50,150)); <span style="white-space:pre"> </span>pMenu->addChild(pBtnRight,enZOrderFront); <span style="white-space:pre"> </span>/************************************************************************/ <span style="white-space:pre"> </span>/*<span style="white-space:pre"> </span>创建label */ <span style="white-space:pre"> </span>/************************************************************************/ <span style="white-space:pre"> </span>CCDictionary *pDicLang = CCDictionary::createWithContentsOfFile("ui_xml/serverselect_xml.xml"); <span style="white-space:pre"> </span>CC_BREAK_IF(pDicLang==NULL); <span style="white-space:pre"> </span>//服务器名称label <span style="white-space:pre"> </span>CCString *pStrServerName = dynamic_cast<CCString*>(pDicLang->objectForKey("server_name")); <span style="white-space:pre"> </span>char szName[NAME_LEN] = {0}; <span style="white-space:pre"> </span>sprintf(szName,pStrServerName->m_sString.c_str(),nCurrentServerID); <span style="white-space:pre"> </span>CCLabelTTF * pLabelServerName = CCLabelTTF::create(szName,"Arial",20); <span style="white-space:pre"> </span>CC_BREAK_IF(pLabelServerName==NULL); <span style="white-space:pre"> </span>pLabelServerName->setPosition(pBtnCurrentServer->getPosition()); <span style="white-space:pre"> </span>addChild(pLabelServerName,enZOrderFront); <span style="white-space:pre"> </span>/************************************************************************/ <span style="white-space:pre"> </span>/*<span style="white-space:pre"> </span>创建滑动层 */ <span style="white-space:pre"> </span>/************************************************************************/ <span style="white-space:pre"> </span>//创建滑动层 <span style="white-space:pre"> </span>CNFServerChangeScrollLayer * pLayer = CNFServerChangeScrollLayer::CreateLayer(nServerTotalNum);<span style="white-space:pre"> </span>//Item数组,x轴起始位置 <span style="white-space:pre"> </span>CC_BREAK_IF(pLayer==NULL); <span style="white-space:pre"> </span>pLayer->SetMsg(this); <span style="white-space:pre"> </span>addChild(pLayer,enZOrderFront,enTagScrollLayer); <span style="white-space:pre"> </span>return true; <span style="white-space:pre"> </span>} while (false); <span style="white-space:pre"> </span>CCLog("Fun CNFServerChangeLayer::init Error!"); <span style="white-space:pre"> </span>return false; } //按钮回调:返回 void CNFServerChangeLayer::OnBtnCallBack( CCObject * pObj ) { <span style="white-space:pre"> </span>//发消息:更改服务器 <span style="white-space:pre"> </span>tagServerSelect Info; <span style="white-space:pre"> </span>Info.nServerID = m_nCurrentServerID; <span style="white-space:pre"> </span>SendMsg(enMsg_ServerSelect,&Info,sizeof(Info)); <span style="white-space:pre"> </span>//移除自身 <span style="white-space:pre"> </span>removeFromParentAndCleanup(true); } //按钮回调:向左滑动 void CNFServerChangeLayer::OnBtnLeftMove( CCObject * pObj ) { <span style="white-space:pre"> </span>do <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>//滑动层 <span style="white-space:pre"> </span>CNFServerChangeScrollLayer * pLayer = dynamic_cast<CNFServerChangeScrollLayer *>(getChildByTag(enTagScrollLayer)); <span style="white-space:pre"> </span>CC_BREAK_IF(pLayer==NULL); <span style="white-space:pre"> </span>pLayer->SetRightMove(); <span style="white-space:pre"> </span>return ; <span style="white-space:pre"> </span>} while (false); <span style="white-space:pre"> </span>CCLog("Fun CNFServerChangeLayer::OnBtnLeftMove Error!"); } //按钮回调:向右滑动 void CNFServerChangeLayer::OnBtnRightMove( CCObject * pObj ) { <span style="white-space:pre"> </span>do <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>//滑动层 <span style="white-space:pre"> </span>CNFServerChangeScrollLayer * pLayer = dynamic_cast<CNFServerChangeScrollLayer *>(getChildByTag(enTagScrollLayer)); <span style="white-space:pre"> </span>CC_BREAK_IF(pLayer==NULL); <span style="white-space:pre"> </span>pLayer->SetLeftMove(); <span style="white-space:pre"> </span>return ; <span style="white-space:pre"> </span>} while (false); <span style="white-space:pre"> </span>CCLog("Fun CNFServerChangeLayer::OnBtnRightMove Error!"); } //消息接收 void CNFServerChangeLayer::RecMsg( int nMsgID,void* pInfo,int nSize ) { <span style="white-space:pre"> </span>switch (nMsgID) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>case enMsg_ServerSelect: <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>tagServerSelect * pCmd = (tagServerSelect *)pInfo; <span style="white-space:pre"> </span>//发消息:更改服务器 <span style="white-space:pre"> </span>tagServerSelect Info; <span style="white-space:pre"> </span>Info.nServerID = pCmd->nServerID; <span style="white-space:pre"> </span>SendMsg(enMsg_ServerSelect,&Info,sizeof(Info)); <span style="white-space:pre"> </span>//移除自身 <span style="white-space:pre"> </span>removeFromParentAndCleanup(true); <span style="white-space:pre"> </span>}break; <span style="white-space:pre"> </span>} } NFServerChangeScrollLayer.h 文件
/************************************************************************/ /*<span style="white-space:pre"> </span>服务器选择界面,滑动层 */ /************************************************************************/ class CNFServerChangeScrollLayer : public CCLayerColor ,public CMsgSender { protected: <span style="white-space:pre"> </span>// 标签 <span style="white-space:pre"> </span>enum <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>enTagMenu = 1, <span style="white-space:pre"> </span>enTagBtn = 100, <span style="white-space:pre"> </span>}; <span style="white-space:pre"> </span>float<span style="white-space:pre"> </span>m_fTouchPassPosX;<span style="white-space:pre"> </span>//上一次计算触摸时,手指滑过的位置 <span style="white-space:pre"> </span>float<span style="white-space:pre"> </span>m_fTouchBeginPosX;<span style="white-space:pre"> </span>//用户触摸最初始的位置 <span style="white-space:pre"> </span>bool<span style="white-space:pre"> </span>m_bTouching;<span style="white-space:pre"> </span>//是否取消了触摸(保证不会重复调用TouchEnd) <span style="white-space:pre"> </span>bool<span style="white-space:pre"> </span>m_bIsTouchBtn;<span style="white-space:pre"> </span>//是否触摸到按钮 <span style="white-space:pre"> </span>float<span style="white-space:pre"> </span>m_fPageWidth;<span style="white-space:pre"> </span>//每一页的宽度 <span style="white-space:pre"> </span>float<span style="white-space:pre"> </span>m_fEndLayerPos;<span style="white-space:pre"> </span>//结束边界的位置 <span style="white-space:pre"> </span>float<span style="white-space:pre"> </span>m_fStartNodePosX;<span style="white-space:pre"> </span>//初始节点x轴位置 <span style="white-space:pre"> </span>CCRect<span style="white-space:pre"> </span>m_DisPlayRect;<span style="white-space:pre"> </span>//显示区域 public: <span style="white-space:pre"> </span>static CNFServerChangeScrollLayer* CreateLayer(int nItemNum); <span style="white-space:pre"> </span>//向左滑 <span style="white-space:pre"> </span>void SetLeftMove(); <span style="white-space:pre"> </span>//向右滑 <span style="white-space:pre"> </span>void SetRightMove(); protected: <span style="white-space:pre"> </span>bool InitLayer(int nItemNum); <span style="white-space:pre"> </span>//设置裁剪区域 <span style="white-space:pre"> </span>void visit(); <span style="white-space:pre"> </span>//触摸函数 <span style="white-space:pre"> </span>virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); <span style="white-space:pre"> </span>virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); <span style="white-space:pre"> </span>virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); <span style="white-space:pre"> </span>virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent); <span style="white-space:pre"> </span>//按钮回调 <span style="white-space:pre"> </span>void OnBtnCallBack(CCObject * pObj); <span style="white-space:pre"> </span>virtual void onExit(); }; #endif
#include "NFServerChangeScrollLayer.h" #define _ONE_PAGE_SERVER_NUM_<span style="white-space:pre"> </span>12<span style="white-space:pre"> </span>//每一页所拥有的服务器的个数 #define _X_START_POS_<span style="white-space:pre"> </span>78<span style="white-space:pre"> </span>//x轴初始坐标 #define _PAGE_WIDTH_<span style="white-space:pre"> </span>564<span style="white-space:pre"> </span>//页面宽度 #define _PAGE_HEIGHT_<span style="white-space:pre"> </span>285<span style="white-space:pre"> </span>//页面高度 /************************************************************************/ /*<span style="white-space:pre"> </span>滑动层 */ /************************************************************************/ CNFServerChangeScrollLayer* CNFServerChangeScrollLayer::CreateLayer(int nItemNum) {<span style="white-space:pre"> </span> <span style="white-space:pre"> </span>CNFServerChangeScrollLayer *pRet = new CNFServerChangeScrollLayer(); <span style="white-space:pre"> </span>if (pRet && pRet->InitLayer(nItemNum)) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>pRet->autorelease(); <span style="white-space:pre"> </span>return pRet; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>CC_SAFE_DELETE(pRet); <span style="white-space:pre"> </span>return NULL; } bool CNFServerChangeScrollLayer::InitLayer(int nItemNum) {<span style="white-space:pre"> </span> <span style="white-space:pre"> </span>do <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>//初始化父类 <span style="white-space:pre"> </span>CC_BREAK_IF(CCLayerColor::initWithColor(ccc4(0,0,0,0))==false); <span style="white-space:pre"> </span>//独占触屏注册值小于-128才能屏蔽Menu(Menu默认是-128) <span style="white-space:pre"> </span>CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, -129, true); <span style="white-space:pre"> </span>//初始x轴坐标 <span style="white-space:pre"> </span>m_fStartNodePosX = _X_START_POS_ + _NF_SCREEN_WIDTH_DIS_; ;<span style="white-space:pre"> </span>//页面数量 <span style="white-space:pre"> </span>int nPageNum = nItemNum%_ONE_PAGE_SERVER_NUM_ > 0 ? nItemNum/_ONE_PAGE_SERVER_NUM_+1 : nItemNum/_ONE_PAGE_SERVER_NUM_; <span style="white-space:pre"> </span>//每一页宽度 <span style="white-space:pre"> </span>m_fPageWidth = _PAGE_WIDTH_; <span style="white-space:pre"> </span>//页面高度 <span style="white-space:pre"> </span>float<span style="white-space:pre"> </span>fPageHeight = _PAGE_HEIGHT_; <span style="white-space:pre"> </span>//x轴最小坐标 <span style="white-space:pre"> </span>m_fEndLayerPos = m_fPageWidth*(1-nPageNum); <span style="white-space:pre"> </span>//x,y轴之间的间隔 <span style="white-space:pre"> </span>float fItemDisX = 11; <span style="white-space:pre"> </span>float fItemDisY = 20; <span style="white-space:pre"> </span>/************************************************************************/ <span style="white-space:pre"> </span>/*<span style="white-space:pre"> </span>创建按钮 */ <span style="white-space:pre"> </span>/************************************************************************/ <span style="white-space:pre"> </span>CCDictionary *pDicLang = CCDictionary::createWithContentsOfFile("ui_xml/serverselect_xml.xml"); <span style="white-space:pre"> </span>CC_BREAK_IF(pDicLang==NULL); <span style="white-space:pre"> </span>CCMenu * pMenu = CCMenu::create(); <span style="white-space:pre"> </span>CC_BREAK_IF(pMenu==NULL); <span style="white-space:pre"> </span>pMenu->setPosition(CCPointZero); <span style="white-space:pre"> </span>addChild(pMenu,enZOrderFront,enTagMenu); <span style="white-space:pre"> </span>//创建数组 <span style="white-space:pre"> </span>CCObject *pObj = NULL; <span style="white-space:pre"> </span>for (int k=1;k<=nItemNum;k++) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>int i = k%_ONE_PAGE_SERVER_NUM_ > 0 ? k%_ONE_PAGE_SERVER_NUM_ : _ONE_PAGE_SERVER_NUM_;<span style="white-space:pre"> </span>//页面内ITem的ID:1~12 <span style="white-space:pre"> </span>int j = k%_ONE_PAGE_SERVER_NUM_ > 0 ? k/_ONE_PAGE_SERVER_NUM_+1 : k/_ONE_PAGE_SERVER_NUM_;<span style="white-space:pre"> </span>//当前页面ID <span style="white-space:pre"> </span>int nCrossNum = i%3 == 0 ? 3 : i%3;<span style="white-space:pre"> </span>//横排 <span style="white-space:pre"> </span>int nVerticalNum = i%3 > 0 ? i/3+1 : i/3;<span style="white-space:pre"> </span>//竖排 <span style="white-space:pre"> </span>//创建按钮 <span style="white-space:pre"> </span>CCMenuItemSprite * pBtn = CCMenuItemSprite::create( <span style="white-space:pre"> </span>CCSprite::create("ui/btn_enter_n.png"), <span style="white-space:pre"> </span>CCSprite::create("ui/btn_enter_p.png"), <span style="white-space:pre"> </span>this, <span style="white-space:pre"> </span>menu_selector(CNFServerChangeScrollLayer::OnBtnCallBack)); <span style="white-space:pre"> </span>CC_BREAK_IF(pBtn==NULL); <span style="white-space:pre"> </span>pBtn->setPosition(ccp( fItemDisX+ (nCrossNum-1)*(pBtn->getContentSize().width+fItemDisX) + m_fStartNodePosX + pBtn->getContentSize().width*0.5f + (j-1)*m_fPageWidth , fPageHeight-nVerticalNum*(pBtn->getContentSize().height+fItemDisY) + fItemDisY )); <span style="white-space:pre"> </span>pMenu->addChild(pBtn,enZOrderFront,enTagBtn+k); <span style="white-space:pre"> </span>//服务器名称label <span style="white-space:pre"> </span>CCString *pStrServerName = dynamic_cast<CCString*>(pDicLang->objectForKey("server_name")); <span style="white-space:pre"> </span>char szName[NAME_LEN] = {0}; <span style="white-space:pre"> </span>sprintf(szName,pStrServerName->m_sString.c_str(),k); <span style="white-space:pre"> </span>CCLabelTTF * pLabelServerName = CCLabelTTF::create(szName,"Arial",20); <span style="white-space:pre"> </span>CC_BREAK_IF(pLabelServerName==NULL); <span style="white-space:pre"> </span>pLabelServerName->setPosition(pBtn->getPosition()); <span style="white-space:pre"> </span>addChild(pLabelServerName,enZOrderFront); <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>//显示区域 <span style="white-space:pre"> </span>m_DisPlayRect = CCRectMake(m_fStartNodePosX ,10 ,m_fPageWidth,fPageHeight); <span style="white-space:pre"> </span>m_bTouching = false; <span style="white-space:pre"> </span>m_bIsTouchBtn = false; <span style="white-space:pre"> </span>return true; <span style="white-space:pre"> </span>} while (false); <span style="white-space:pre"> </span>CCLog("Fun CQXPVEItemScrollLayer::initWithNodes Error!"); <span style="white-space:pre"> </span>return false; } //触摸:开始 bool CNFServerChangeScrollLayer::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) { <span style="white-space:pre"> </span>CCPoint ptTouchPoint =pTouch->getLocation(); <span style="white-space:pre"> </span>//设置初始触摸点 <span style="white-space:pre"> </span>m_fTouchPassPosX = ptTouchPoint.x; <span style="white-space:pre"> </span>m_fTouchBeginPosX = ptTouchPoint.x; <span style="white-space:pre"> </span>//判断是否触摸到裁切区域内 <span style="white-space:pre"> </span>if(m_DisPlayRect.containsPoint(ptTouchPoint)) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>m_bTouching = true; <span style="white-space:pre"> </span>//判断是否触摸到按钮 <span style="white-space:pre"> </span>CCMenu *pMenu = dynamic_cast<CCMenu*>(getChildByTag(enTagMenu)); <span style="white-space:pre"> </span>if(pMenu!=NULL) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>CCArray *pChildren = pMenu->getChildren(); <span style="white-space:pre"> </span>if(pChildren!=NULL) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>CCObject *pItem=NULL; <span style="white-space:pre"> </span>CCARRAY_FOREACH(pChildren,pItem) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>CCMenuItemSprite *pBtn= dynamic_cast<CCMenuItemSprite*>(pItem); <span style="white-space:pre"> </span>if(pBtn!=NULL) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>CCPoint local = pBtn->convertToNodeSpace(pTouch->getLocation()); <span style="white-space:pre"> </span>CCRect r = pBtn->rect(); <span style="white-space:pre"> </span>r.origin = CCPointZero; <span style="white-space:pre"> </span>if (r.containsPoint(local)) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>pMenu->ccTouchBegan(pTouch,pEvent); <span style="white-space:pre"> </span>m_bIsTouchBtn=true; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>return true;<span style="white-space:pre"> </span> <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>return false; } //触摸:移动 void CNFServerChangeScrollLayer::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) {<span style="white-space:pre"> </span> <span style="white-space:pre"> </span>if(m_bTouching==false)return; <span style="white-space:pre"> </span>CCPoint ptTouchPoint =pTouch->getLocation(); <span style="white-space:pre"> </span>CCPoint pNewPos=getPosition(); <span style="white-space:pre"> </span>//移动层 <span style="white-space:pre"> </span>pNewPos.x+=ptTouchPoint.x-m_fTouchPassPosX; <span style="white-space:pre"> </span>this->setPosition(pNewPos); <span style="white-space:pre"> </span>//重置初始点 <span style="white-space:pre"> </span>m_fTouchPassPosX=ptTouchPoint.x; <span style="white-space:pre"> </span>//若触摸到按钮 <span style="white-space:pre"> </span>if (m_bIsTouchBtn==true) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>CCMenu *pMenu = dynamic_cast<CCMenu*>(getChildByTag(enTagMenu)); <span style="white-space:pre"> </span>if (pMenu!=NULL) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>pMenu->ccTouchCancelled(pTouch,pEvent); <span style="white-space:pre"> </span>m_bIsTouchBtn = false; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} } //触摸:结束 void CNFServerChangeScrollLayer::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) { <span style="white-space:pre"> </span>if(m_bTouching==false)return; <span style="white-space:pre"> </span>m_bTouching = false; <span style="white-space:pre"> </span>CCPoint ptTouchPoint =pTouch->getLocation(); <span style="white-space:pre"> </span>CCPoint ptMyPos = getPosition(); <span style="white-space:pre"> </span>//判断移到哪一页 <span style="white-space:pre"> </span>float fDisX = ptTouchPoint.x - m_fTouchBeginPosX; <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>//判定滑动 <span style="white-space:pre"> </span>if ( _NF_ABS(fDisX)>= 20) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>//向左滑动 <span style="white-space:pre"> </span>if (fDisX < 0) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>//若未过界 <span style="white-space:pre"> </span>if (getPositionX() > m_fEndLayerPos) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>int fLen = (int)getPositionX()%(int)m_fPageWidth; <span style="white-space:pre"> </span>ptMyPos.x = (int)( getPositionX() - fLen - m_fPageWidth); <span style="white-space:pre"> </span>CCAction *pMoveTo=CCMoveTo::create(0.3f,ptMyPos); <span style="white-space:pre"> </span>runAction(pMoveTo); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>//向右滑 <span style="white-space:pre"> </span>if (fDisX > 0) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>//若未过界 <span style="white-space:pre"> </span>if (getPositionX() < 0) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>int fLen = (int)getPositionX()%(int)m_fPageWidth; <span style="white-space:pre"> </span>ptMyPos.x = (int)( getPositionX() - fLen); <span style="white-space:pre"> </span>CCAction *pMoveTo=CCMoveTo::create(0.3f,ptMyPos); <span style="white-space:pre"> </span>runAction(pMoveTo); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>//判断是否越界 <span style="white-space:pre"> </span>if (getPositionX()>0) <span style="white-space:pre"> </span>{<span style="white-space:pre"> </span> <span style="white-space:pre"> </span>ptMyPos.x = 0; <span style="white-space:pre"> </span>CCAction *pMoveTo=CCMoveTo::create(0.3f,ptMyPos); <span style="white-space:pre"> </span>runAction(pMoveTo); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>else if (getPositionX()<m_fEndLayerPos) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>ptMyPos.x = m_fEndLayerPos<0?m_fEndLayerPos:0; <span style="white-space:pre"> </span>CCAction *pMoveTo=CCMoveTo::create(0.3f,ptMyPos); <span style="white-space:pre"> </span>runAction(pMoveTo); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>//滑动层,当前坐标 <span style="white-space:pre"> </span>CCPoint LayerPos; <span style="white-space:pre"> </span>LayerPos.x = getPositionX(); <span style="white-space:pre"> </span>LayerPos.y = getPositionY(); <span style="white-space:pre"> </span>//若触摸到按钮 <span style="white-space:pre"> </span>if (m_bIsTouchBtn==true) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>CCMenu *pMenu = dynamic_cast<CCMenu*>(getChildByTag(enTagMenu)); <span style="white-space:pre"> </span>if (pMenu!=NULL) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>pMenu->ccTouchEnded(pTouch,pEvent); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>m_bIsTouchBtn = false; <span style="white-space:pre"> </span>} } void CNFServerChangeScrollLayer::ccTouchCancelled( CCTouch *pTouch, CCEvent *pEvent ) { <span style="white-space:pre"> </span>m_bTouching = false; } //裁切 void CNFServerChangeScrollLayer::visit() { <span style="white-space:pre"> </span>kmGLPushMatrix(); <span style="white-space:pre"> </span>if (m_pGrid && m_pGrid->isActive()) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>m_pGrid->beforeDraw(); <span style="white-space:pre"> </span>this->transformAncestors(); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>this->transform(); <span style="white-space:pre"> </span>glEnable(GL_SCISSOR_TEST); <span style="white-space:pre"> </span>CCSize size=CCEGLView::sharedOpenGLView()->getFrameSize(); <span style="white-space:pre"> </span>float fScaleX=size.width/SCREEN_WIDTH; <span style="white-space:pre"> </span>float fScaleY=size.height/SCREEN_HEIGHT; <span style="white-space:pre"> </span>glScissor(m_DisPlayRect.origin.x*fScaleX,m_DisPlayRect.origin.y*fScaleY,m_DisPlayRect.size.width*fScaleX,m_DisPlayRect.size.height*fScaleY); <span style="white-space:pre"> </span>if (m_pChildren) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>for (unsigned int i=0;i<m_pChildren->data->num;i++) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>CCNode* pNode=(CCNode*)m_pChildren->data->arr[i]; <span style="white-space:pre"> </span>if (pNode->getZOrder()<0) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>pNode->visit(); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>else <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>break; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>draw(); <span style="white-space:pre"> </span>for (unsigned int i=0;i<m_pChildren->data->num;i++) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>CCNode* pNode=(CCNode*)m_pChildren->data->arr[i]; <span style="white-space:pre"> </span>pNode->visit(); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>else <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>draw(); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>glDisable(GL_SCISSOR_TEST); <span style="white-space:pre"> </span>if (m_pGrid &&m_pGrid->isActive()) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>m_pGrid->afterDraw(this); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>kmGLPopMatrix(); } //按钮回调 void CNFServerChangeScrollLayer::OnBtnCallBack( CCObject * pObj ) { <span style="white-space:pre"> </span>do <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>int nTag = (dynamic_cast<CCMenuItemSprite *>(pObj))->getTag(); <span style="white-space:pre"> </span>//发消息:更改服务器 <span style="white-space:pre"> </span>tagServerSelect Info; <span style="white-space:pre"> </span>Info.nServerID = nTag-100; <span style="white-space:pre"> </span>//发消息,切换服务器 <span style="white-space:pre"> </span>SendMsg(enMsg_ServerSelect,&Info,sizeof(Info)); <span style="white-space:pre"> </span>//移除自身 <span style="white-space:pre"> </span>removeFromParentAndCleanup(true); <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>return ; <span style="white-space:pre"> </span>} while (false); <span style="white-space:pre"> </span>CCLog("Fun CNFServerSelectScrollLayer::OnBtnCallBack Error!"); } void CNFServerChangeScrollLayer::onExit() { <span style="white-space:pre"> </span>//取消独占 <span style="white-space:pre"> </span>CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this); <span style="white-space:pre"> </span>CCLayer::onExit(); } void CNFServerChangeScrollLayer::SetLeftMove() { <span style="white-space:pre"> </span>//若当前未触摸 <span style="white-space:pre"> </span>if (m_bTouching==false) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>//若未过界 <span style="white-space:pre"> </span>if (getPositionX() > m_fEndLayerPos) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>CCPoint ptMyPos; <span style="white-space:pre"> </span>ptMyPos.x = (int)( getPositionX() - m_fPageWidth); <span style="white-space:pre"> </span>CCAction *pMoveTo=CCMoveTo::create(0.3f,ptMyPos); <span style="white-space:pre"> </span>runAction(pMoveTo); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} } void CNFServerChangeScrollLayer::SetRightMove() { <span style="white-space:pre"> </span>//若当前未触摸 <span style="white-space:pre"> </span>if (m_bTouching==false) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>//若未过界 <span style="white-space:pre"> </span>if (getPositionX() < 0) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>CCPoint ptMyPos; <span style="white-space:pre"> </span>ptMyPos.x = (int)( getPositionX() + m_fPageWidth); <span style="white-space:pre"> </span>CCAction *pMoveTo=CCMoveTo::create(0.3f,ptMyPos); <span style="white-space:pre"> </span>runAction(pMoveTo); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} }
分析Cocos2d-x横版ACT手游源代码 2、服务器场景
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。