仍然一样 直接在代码 资源 下一个 上传 你可以看到自己NFServerChangeLayer.h
/************************************************************************/
/*服务器切换层 */
/************************************************************************/
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);
//button回调:返回
void OnBtnCallBack(CCObject * pObj);
//button回调:向左滑动
void OnBtnLeftMove(CCObject * pObj);
//button回调:向右滑动
void OnBtnRightMove(CCObject * pObj);
};
#endif.cpp文件#include "NFServerChangeLayer.h"
#include "NFServerChangeScrollLayer.h"
CNFServerChangeLayer * CNFServerChangeLayer::CreateLayer(int nCurrentServerID,int nServerTotalNum)
{
CNFServerChangeLayer *pRet = new CNFServerChangeLayer();
if (pRet && pRet->InitLayer(nCurrentServerID,nServerTotalNum))
{
pRet->autorelease();
return pRet;
}
CCLog("Fun CNFServerChangeLayer::CreateLayer Error!");
delete pRet;
pRet = NULL;
return NULL;
}
bool CNFServerChangeLayer::InitLayer(int nCurrentServerID,int nServerTotalNum)
{
do
{
//初始化父类
CC_BREAK_IF(CCLayer::init()==false);
m_nCurrentServerID = nCurrentServerID;
/************************************************************************/
/*背景图片 */
/************************************************************************/
//创建背景
CCSprite * pBg = CCSprite::create("ui/serverselect_bg.png");
CC_BREAK_IF(pBg==NULL);
pBg->setPosition(SCREEN_CENTER);
pBg->setScaleX( (float)CCDirector::sharedDirector()->getWinSize().width/(float)pBg->getContentSize().width );
addChild(pBg,enZOrderBack);
//创建上次登录图片
CCSprite * pBg1 = CCSprite::create("ui/serverselect_title_1.png");
CC_BREAK_IF(pBg1==NULL);
pBg1->setPosition(ccp(150+_NF_SCREEN_WIDTH_DIS_,420));
addChild(pBg1,enZOrderBack);
//创建全服务器图片
CCSprite * pBg2 = CCSprite::create("ui/serverselect_title_2.png");
CC_BREAK_IF(pBg2==NULL);
pBg2->setPosition(ccp(160+_NF_SCREEN_WIDTH_DIS_,300));
addChild(pBg2,enZOrderBack);
/************************************************************************/
/*创建button */
/************************************************************************/
CCMenu * pMenu = CCMenu::create();
CC_BREAK_IF(pMenu==NULL);
pMenu->setPosition(CCPointZero);
addChild(pMenu,enZOrderFront);
//创建返回button
//CCMenuItemSprite * pBtnBack = CCMenuItemSprite::create(
//CCSprite::create("ui/serverselect_btn_back_n.png"),
//CCSprite::create("ui/serverselect_btn_back_p.png"),
//this,
//menu_selector(CNFServerChangeLayer::OnBtnCallBack));
//CC_BREAK_IF(pBtnBack==NULL);
//pBtnBack->setPosition(ccp(SCREEN_WIDTH - 30,SCREEN_HEIGHT-30));
//pMenu->addChild(pBtnBack,enZOrderFront);
//创建当前服务器button
CCMenuItemSprite * pBtnCurrentServer = CCMenuItemSprite::create(
CCSprite::create("ui/btn_enter_n.png"),
CCSprite::create("ui/btn_enter_p.png"),
this,
menu_selector(CNFServerChangeLayer::OnBtnCallBack));
CC_BREAK_IF(pBtnCurrentServer==NULL);
pBtnCurrentServer->setPosition(ccp(190+_NF_SCREEN_WIDTH_DIS_,380));
pMenu->addChild(pBtnCurrentServer,enZOrderFront);
//创建左側button
CCMenuItemSprite * pBtnLeft = CCMenuItemSprite::create(
CCSprite::create("ui/serverselect_btn_back_n.png"),
CCSprite::create("ui/serverselect_btn_back_p.png"),
this,
menu_selector(CNFServerChangeLayer::OnBtnLeftMove));
CC_BREAK_IF(pBtnLeft==NULL);
pBtnLeft->setPosition(ccp(50+_NF_SCREEN_WIDTH_DIS_,150));
pMenu->addChild(pBtnLeft,enZOrderFront);
//创建右側button
CCMenuItemSprite * pBtnRight = CCMenuItemSprite::create(
CCSprite::create("ui/serverselect_btn_back_n.png"),
CCSprite::create("ui/serverselect_btn_back_p.png"),
this,
menu_selector(CNFServerChangeLayer::OnBtnRightMove));
CC_BREAK_IF(pBtnRight==NULL);
pBtnRight->setPosition(ccp(SCREEN_WIDTH-_NF_SCREEN_WIDTH_DIS_-50,150));
pMenu->addChild(pBtnRight,enZOrderFront);
/************************************************************************/
/*创建label */
/************************************************************************/
CCDictionary *pDicLang = CCDictionary::createWithContentsOfFile("ui_xml/serverselect_xml.xml");
CC_BREAK_IF(pDicLang==NULL);
//服务器名称label
CCString *pStrServerName = dynamic_cast(pDicLang->objectForKey("server_name"));
char szName[NAME_LEN] = {0};
sprintf(szName,pStrServerName->m_sString.c_str(),nCurrentServerID);
CCLabelTTF * pLabelServerName = CCLabelTTF::create(szName,"Arial",20);
CC_BREAK_IF(pLabelServerName==NULL);
pLabelServerName->setPosition(pBtnCurrentServer->getPosition());
addChild(pLabelServerName,enZOrderFront);
/************************************************************************/
/*创建滑动层 */
/************************************************************************/
//创建滑动层
CNFServerChangeScrollLayer * pLayer = CNFServerChangeScrollLayer::CreateLayer(nServerTotalNum);//Item数组。x轴起始位置
CC_BREAK_IF(pLayer==NULL);
pLayer->SetMsg(this);
addChild(pLayer,enZOrderFront,enTagScrollLayer);
return true;
} while (false);
CCLog("Fun CNFServerChangeLayer::init Error!");
return false;
}
//button回调:返回
void CNFServerChangeLayer::OnBtnCallBack( CCObject * pObj )
{
//发消息:更改服务器
tagServerSelect Info;
Info.nServerID = m_nCurrentServerID;
SendMsg(enMsg_ServerSelect,&Info,sizeof(Info));
//移除自身
removeFromParentAndCleanup(true);
}
//button回调:向左滑动
void CNFServerChangeLayer::OnBtnLeftMove( CCObject * pObj )
{
do
{
//滑动层
CNFServerChangeScrollLayer * pLayer = dynamic_cast(getChildByTag(enTagScrollLayer));
CC_BREAK_IF(pLayer==NULL);
pLayer->SetRightMove();
return ;
} while (false);
CCLog("Fun CNFServerChangeLayer::OnBtnLeftMove Error!");
}
//button回调:向右滑动
void CNFServerChangeLayer::OnBtnRightMove( CCObject * pObj )
{
do
{
//滑动层
CNFServerChangeScrollLayer * pLayer = dynamic_cast(getChildByTag(enTagScrollLayer));
CC_BREAK_IF(pLayer==NULL);
pLayer->SetLeftMove();
return ;
} while (false);
CCLog("Fun CNFServerChangeLayer::OnBtnRightMove Error!");
}
//消息接收
void CNFServerChangeLayer::RecMsg( int nMsgID,void* pInfo,int nSize )
{
switch (nMsgID)
{
case enMsg_ServerSelect:
{
tagServerSelect * pCmd = (tagServerSelect *)pInfo;
//发消息:更改服务器
tagServerSelect Info;
Info.nServerID = pCmd->nServerID;
SendMsg(enMsg_ServerSelect,&Info,sizeof(Info));
//移除自身
removeFromParentAndCleanup(true);
}break;
}
}
NFServerChangeScrollLayer.h 文件/************************************************************************/
/*服务器选择界面,滑动层 */
/************************************************************************/
class CNFServerChangeScrollLayer : public CCLayerColor ,public CMsgSender
{
protected:
// 标签
enum
{
enTagMenu = 1,
enTagBtn = 100,
};
floatm_fTouchPassPosX;//上一次计算触摸时。手指滑过的位置
floatm_fTouchBeginPosX;//用户触摸最初始的位置
boolm_bTouching;//是否取消了触摸(保证不会反复调用TouchEnd)
boolm_bIsTouchBtn;//是否触摸到button
floatm_fPageWidth;//每一页的宽度
floatm_fEndLayerPos;//结束边界的位置
floatm_fStartNodePosX;//初始节点x轴位置
CCRectm_DisPlayRect;//显示区域
public:
static CNFServerChangeScrollLayer* CreateLayer(int nItemNum);
//向左滑
void SetLeftMove();
//向右滑
void SetRightMove();
protected:
bool InitLayer(int nItemNum);
//设置裁剪区域
void visit();
//触摸函数
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
//button回调
void OnBtnCallBack(CCObject * pObj);
virtual void onExit();
};
#endif#include "NFServerChangeScrollLayer.h"
#define _ONE_PAGE_SERVER_NUM_12//每一页所拥有的服务器的个数
#define _X_START_POS_78//x轴初始坐标
#define _PAGE_WIDTH_564//页面宽度
#define _PAGE_HEIGHT_285//页面高度
/************************************************************************/
/*滑动层 */
/************************************************************************/
CNFServerChangeScrollLayer* CNFServerChangeScrollLayer::CreateLayer(int nItemNum)
{
CNFServerChangeScrollLayer *pRet = new CNFServerChangeScrollLayer();
if (pRet && pRet->InitLayer(nItemNum))
{
pRet->autorelease();
return pRet;
}
CC_SAFE_DELETE(pRet);
return NULL;
}
bool CNFServerChangeScrollLayer::InitLayer(int nItemNum)
{
do
{
//初始化父类
CC_BREAK_IF(CCLayerColor::initWithColor(ccc4(0,0,0,0))==false);
//独占触屏注冊值小于-128才干屏蔽Menu(Menu默认是-128)
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, -129, true);
//初始x轴坐标
m_fStartNodePosX = _X_START_POS_ + _NF_SCREEN_WIDTH_DIS_;
;//页面数量
int nPageNum = nItemNum%_ONE_PAGE_SERVER_NUM_ > 0 ?
nItemNum/_ONE_PAGE_SERVER_NUM_+1 : nItemNum/_ONE_PAGE_SERVER_NUM_;
//每一页宽度
m_fPageWidth = _PAGE_WIDTH_;
//页面高度
floatfPageHeight = _PAGE_HEIGHT_;
//x轴最小坐标
m_fEndLayerPos = m_fPageWidth*(1-nPageNum);
//x。y轴之间的间隔
float fItemDisX = 11;
float fItemDisY = 20;
/************************************************************************/
/*创建button */
/************************************************************************/
CCDictionary *pDicLang = CCDictionary::createWithContentsOfFile("ui_xml/serverselect_xml.xml");
CC_BREAK_IF(pDicLang==NULL);
CCMenu * pMenu = CCMenu::create();
CC_BREAK_IF(pMenu==NULL);
pMenu->setPosition(CCPointZero);
addChild(pMenu,enZOrderFront,enTagMenu);
//创建数组
CCObject *pObj = NULL;
for (int k=1;k<=nItemNum;k++)
{
int i = k%_ONE_PAGE_SERVER_NUM_ > 0 ? k%_ONE_PAGE_SERVER_NUM_ : _ONE_PAGE_SERVER_NUM_;//页面内ITem的ID:1~12
int j = k%_ONE_PAGE_SERVER_NUM_ > 0 ? k/_ONE_PAGE_SERVER_NUM_+1 : k/_ONE_PAGE_SERVER_NUM_;//当前页面ID
int nCrossNum = i%3 == 0 ? 3 : i%3;//横排
int nVerticalNum = i%3 > 0 ? i/3+1 : i/3;//竖排
//创建button
CCMenuItemSprite * pBtn = CCMenuItemSprite::create(
CCSprite::create("ui/btn_enter_n.png"),
CCSprite::create("ui/btn_enter_p.png"),
this,
menu_selector(CNFServerChangeScrollLayer::OnBtnCallBack));
CC_BREAK_IF(pBtn==NULL);
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 ));
pMenu->addChild(pBtn,enZOrderFront,enTagBtn+k);
//服务器名称label
CCString *pStrServerName = dynamic_cast(pDicLang->objectForKey("server_name"));
char szName[NAME_LEN] = {0};
sprintf(szName,pStrServerName->m_sString.c_str(),k);
CCLabelTTF * pLabelServerName = CCLabelTTF::create(szName,"Arial",20);
CC_BREAK_IF(pLabelServerName==NULL);
pLabelServerName->setPosition(pBtn->getPosition());
addChild(pLabelServerName,enZOrderFront);
}
//显示区域
m_DisPlayRect = CCRectMake(m_fStartNodePosX ,10 ,m_fPageWidth,fPageHeight);
m_bTouching = false;
m_bIsTouchBtn = false;
return true;
} while (false);
CCLog("Fun CQXPVEItemScrollLayer::initWithNodes Error!");
return false;
}
//触摸:開始
bool CNFServerChangeScrollLayer::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
CCPoint ptTouchPoint =pTouch->getLocation();
//设置初始触摸点
m_fTouchPassPosX = ptTouchPoint.x;
m_fTouchBeginPosX = ptTouchPoint.x;
//推断是否触摸到裁切区域内
if(m_DisPlayRect.containsPoint(ptTouchPoint))
{
m_bTouching = true;
//推断是否触摸到button
CCMenu *pMenu = dynamic_cast(getChildByTag(enTagMenu));
if(pMenu!=NULL)
{
CCArray *pChildren = pMenu->getChildren();
if(pChildren!=NULL)
{
CCObject *pItem=NULL;
CCARRAY_FOREACH(pChildren,pItem)
{
CCMenuItemSprite *pBtn= dynamic_cast(pItem);
if(pBtn!=NULL)
{
CCPoint local = pBtn->convertToNodeSpace(pTouch->getLocation());
CCRect r = pBtn->rect();
r.origin = CCPointZero;
if (r.containsPoint(local))
{
pMenu->ccTouchBegan(pTouch,pEvent);
m_bIsTouchBtn=true;
}
}
}
}
}
return true;
}
return false;
}
//触摸:移动
void CNFServerChangeScrollLayer::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
{
if(m_bTouching==false)return;
CCPoint ptTouchPoint =pTouch->getLocation();
CCPoint pNewPos=getPosition();
//移动层
pNewPos.x+=ptTouchPoint.x-m_fTouchPassPosX;
this->setPosition(pNewPos);
//重置初始点
m_fTouchPassPosX=ptTouchPoint.x;
//若触摸到button
if (m_bIsTouchBtn==true)
{
CCMenu *pMenu = dynamic_cast(getChildByTag(enTagMenu));
if (pMenu!=NULL)
{
pMenu->ccTouchCancelled(pTouch,pEvent);
m_bIsTouchBtn = false;
}
}
}
//触摸:结束
void CNFServerChangeScrollLayer::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
if(m_bTouching==false)return;
m_bTouching = false;
CCPoint ptTouchPoint =pTouch->getLocation();
CCPoint ptMyPos = getPosition();
//推断移到哪一页
float fDisX = ptTouchPoint.x - m_fTouchBeginPosX;
//判定滑动
if ( _NF_ABS(fDisX)>= 20)
{
//向左滑动
if (fDisX < 0)
{
//若未过界
if (getPositionX() > m_fEndLayerPos)
{
int fLen = (int)getPositionX()%(int)m_fPageWidth;
ptMyPos.x = (int)( getPositionX() - fLen - m_fPageWidth);
CCAction *pMoveTo=CCMoveTo::create(0.3f,ptMyPos);
runAction(pMoveTo);
}
}
//向右滑
if (fDisX > 0)
{
//若未过界
if (getPositionX() < 0)
{
int fLen = (int)getPositionX()%(int)m_fPageWidth;
ptMyPos.x = (int)( getPositionX() - fLen);
CCAction *pMoveTo=CCMoveTo::create(0.3f,ptMyPos);
runAction(pMoveTo);
}
}
}
//推断是否越界
if (getPositionX()>0)
{
ptMyPos.x = 0;
CCAction *pMoveTo=CCMoveTo::create(0.3f,ptMyPos);
runAction(pMoveTo);
}
else if (getPositionX()
{
ptMyPos.x = m_fEndLayerPos<0?m_fEndLayerPos:0;
CCAction *pMoveTo=CCMoveTo::create(0.3f,ptMyPos);
runAction(pMoveTo);
}
//滑动层,当前坐标
CCPoint LayerPos;
LayerPos.x = getPositionX();
LayerPos.y = getPositionY();
//若触摸到button
if (m_bIsTouchBtn==true)
{
CCMenu *pMenu = dynamic_cast(getChildByTag(enTagMenu));
if (pMenu!=NULL)
{
pMenu->ccTouchEnded(pTouch,pEvent);
}
m_bIsTouchBtn = false;
}
}
void CNFServerChangeScrollLayer::ccTouchCancelled( CCTouch *pTouch, CCEvent *pEvent )
{
m_bTouching = false;
}
//裁切
void CNFServerChangeScrollLayer::visit()
{
kmGLPushMatrix();
if (m_pGrid && m_pGrid->isActive())
{
m_pGrid->beforeDraw();
this->transformAncestors();
}
this->transform();
glEnable(GL_SCISSOR_TEST);
CCSize size=CCEGLView::sharedOpenGLView()->getFrameSize();
float fScaleX=size.width/SCREEN_WIDTH;
float fScaleY=size.height/SCREEN_HEIGHT;
glScissor(m_DisPlayRect.origin.x*fScaleX,m_DisPlayRect.origin.y*fScaleY,m_DisPlayRect.size.width*fScaleX,m_DisPlayRect.size.height*fScaleY);
if (m_pChildren)
{
for (unsigned int i=0;idata->num;i++)
{
CCNode* pNode=(CCNode*)m_pChildren->data->arr[i];
if (pNode->getZOrder()<0)
{
pNode->visit();
}
else
{
break;
}
}
draw();
for (unsigned int i=0;idata->num;i++)
{
CCNode* pNode=(CCNode*)m_pChildren->data->arr[i];
pNode->visit();
}
}
else
{
draw();
}
glDisable(GL_SCISSOR_TEST);
if (m_pGrid &&m_pGrid->isActive())
{
m_pGrid->afterDraw(this);
}
kmGLPopMatrix();
}
//button回调
void CNFServerChangeScrollLayer::OnBtnCallBack( CCObject * pObj )
{
do
{
int nTag = (dynamic_cast(pObj))->getTag();
//发消息:更改服务器
tagServerSelect Info;
Info.nServerID = nTag-100;
//发消息,切换服务器
SendMsg(enMsg_ServerSelect,&Info,sizeof(Info));
//移除自身
removeFromParentAndCleanup(true);
return ;
} while (false);
CCLog("Fun CNFServerSelectScrollLayer::OnBtnCallBack Error!");
}
void CNFServerChangeScrollLayer::onExit()
{
//取消独占
CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
CCLayer::onExit();
}
void CNFServerChangeScrollLayer::SetLeftMove()
{
//若当前未触摸
if (m_bTouching==false)
{
//若未过界
if (getPositionX() > m_fEndLayerPos)
{
CCPoint ptMyPos;
ptMyPos.x = (int)( getPositionX() - m_fPageWidth);
CCAction *pMoveTo=CCMoveTo::create(0.3f,ptMyPos);
runAction(pMoveTo);
}
}
}
void CNFServerChangeScrollLayer::SetRightMove()
{
//若当前未触摸
if (m_bTouching==false)
{
//若未过界
if (getPositionX() < 0)
{
CCPoint ptMyPos;
ptMyPos.x = (int)( getPositionX() + m_fPageWidth);
CCAction *pMoveTo=CCMoveTo::create(0.3f,ptMyPos);
runAction(pMoveTo);
}
}
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。