微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

cocos2d-x游戏开发系列教程-中国象棋03-主界面

前情回顾

上个博客说道我们象棋程序进入了欢迎界面,在欢迎界面下等待一秒进入主界面

进入主界面的关键代码如下:

CCScene* pScene = CCMainMenu::scene();  创建scene

...

CCDirector::sharedDirector()->replaceScene(ps);  显示scene

 

最关键的是CCMainMenu::scene函数,说明后面要显示的scene类型是CCMainMenu类型的

所以接下来我们一起来看CCMainMenu是怎么回事

 

CCMainMenu

 

typedef struct {
	CCSprite* pSprite;
	float x; // coordinate
	float y;
}SPRITE_INFO;

typedef std::vector<SPRITE_INFO> VEC_SPRITE;
typedef VEC_SPRITE::iterator VEC_SPRITE_IT;

class CCMainMenu : public cclayer
{
public:
	static CCScene* scene();
	virtual bool init();
	CREATE_FUNC(CCMainMenu);
	virtual void cctouchesEnded(CCSet* ptouches,CCEvent* pEvent);

private:
	void setPos(CCSprite* pSprite,int x,int y);
	void setPosDigit(CCSprite* pSprite,int y);

	void menuCallBack(CCObject* pSender);
	void menuRegret(CCObject* pSender);
	void menuStart(CCObject* pSender);
	void menuHardChoose(CCObject* pSender);
	void menuSoundChoose(CCObject* pSender);

	void updateTime(float dt);
	void updateFocus(float dt);

	void initCoordinate();
	void initListimage();
	void initTimeShow();
	void initChessposition();
	
	CCSprite* getNumberSprite(int nNum);
	void setNumberSprite(int nChesstime);

	CCSprite* getListSprite(CHESS_TYPE nType);
	CHESS_TYPE getChesstype(int i,int j);
	void dealWithChess(float x,float y);
	CCSprite* getChessByCoord(float x,float y);
	bool getChessByCoord(float& x,float& y,short dt);
	void collectInfo(CCSprite* pSprite);
	bool judgeAction(int tx,int ty);
	void freeOne();
	void freeAll();
	bool judgeContinuous();
	void clean();
	bool judgeWin();
	//void print();

private:
	CCSprite*	m_pFocus;
	CCSprite*	m_pBKG;
	CCSprite*	m_pMinute[2];
	CCSprite*	m_pSecond[2];
	CCSprite*	m_pCurChess;
	CCSprite*   m_pTargetChess;
	CHESS_TYPE  m_enCurChesstype;
	CHESS_TYPE  m_enTarChesstype;
	CCSprite*	m_pChess[2][16];
	CcmenuItemImage* m_pOpenVolice;
	CcmenuItemImage* m_pCloseVolice;

	//std::ofstream f_output;
	//std::string str;

	float		m_fPositionX;
	float		m_fPositionY;
	int			m_nChesstime;
	CCSize		s;
	bool		m_bSelect;		 // has a chess be selected? if true,cannot be change
	bool		m_bVolice;
	bool		m_bCollectCorrect;
	int			ox,oy;			 // the original coordinate of the current chess
	int			m_nContinuous;   // the max numbers to attact opponent‘s boss
	int			m_nCur;			 // 0:red; 1:black
	int         m_nWin;			 // 0:red; 1:black
	enum GAME_STATUS
	{
		GAME_MENU,GAME_RUNNING,GAME_WIN,GAME_OVER,};
	GAME_STATUS m_enGameStatus;
	enum GAME_ROLE
	{
		ROLE_RED,ROLE_BLACK,};
	GAME_ROLE m_enCurRole;	
	VEC_SPRITE m_vecSprite;
};
oh,天,这个类太复杂了,对我们初学者来说,但是不要害怕,其他的我们先不管他是咋的,我们先来看基本的函数

 

一个是scene函数一个是init函数。scene函数是创建函数,而init函数时初始化调用函数

 

scene函数

 

CCScene* CCMainMenu::scene()
{
	CCScene* pScene = CCScene::create();
	CCMainMenu* pLayer = CCMainMenu::create();
	pScene->addChild(pLayer,3);
	return pScene;
}
scene函数和WelCome的scene函数类似,也是先创建一个scene,再创建一个CCMainMenu对象,然后把CCMainMenu对象加入到scene

 

最后返回scene

init函数

 

bool CCMainMenu::init()
{
	// 调用父类init函数
	if (!cclayer::init())
	{
		return false;
	}
	// 获取窗口大小,这个窗口大小将来用来计算控件位置等
	s = CCDirector::sharedDirector()->getWinSize();

	// 创建背景图片,并设置
	m_pBKG = CCSprite::create(RES_PATH"background.png");
	CCRect r = m_pBKG->getTextureRect();
	m_pBKG->setAnchorPoint(CCPointZero);
	m_pBKG->setPosition(ccp(0,0));
	m_pBKG->setScaleX(s.width/r.size.width*0.667f);
	m_pBKG->setScaleY(s.height/r.size.height);
	this->addChild(m_pBKG,-2);
	
	// 创建焦点图片精灵,这个焦点是指棋子被选中
	m_pFocus = CCSprite::create(RES_PATH"selected.png");
	r = m_pFocus->getTextureRect();
	m_pFocus->setScaleX(0.667f);
	m_pFocus->setScaleY(0.6f);
	m_pFocus->setVisible(false);
	this->addChild(m_pFocus,1);

	m_fPositionX = s.width - r.size.width*0.667f;
	m_fPositionY = s.height - r.size.height*0.6f;

	// 新局按钮
	CcmenuItemImage* pItem = CcmenuItemImage::create(RES_PATH"new.jpg",RES_PATH"new.jpg",this,menu_selector(CCMainMenu::menuCallBack));
	pItem->setPosition(ccp(m_fPositionX - s.width/6,m_fPositionY - s.height/8));
	pItem->setAnchorPoint(CCPointZero);
	pItem->setScaleX(0.667f);
	pItem->setScaleY(0.6f);
	
	Ccmenu* pMenu = Ccmenu::create(pItem,NULL);
	pMenu->setPosition(CCPointZero);
	this->addChild(pMenu,1);

	// 悔棋按钮
	pItem = CcmenuItemImage::create(RES_PATH"regret.jpg",RES_PATH"regret.jpg",menu_selector(CCMainMenu::menuRegret));
	pItem->setPosition(ccp(m_fPositionX - s.width/6,m_fPositionY - s.height/8*2));
	pItem->setAnchorPoint(CCPointZero);
	pItem->setScaleX(0.667f);
	pItem->setScaleY(0.6f);

	pMenu = Ccmenu::create(pItem,1);

	// 开始按钮
	pItem = CcmenuItemImage::create(RES_PATH"start.jpg",RES_PATH"start.jpg",menu_selector(CCMainMenu::menuStart));
	pItem->setPosition(ccp(m_fPositionX - s.width/6,m_fPositionY - s.height/8*3));
	pItem->setAnchorPoint(CCPointZero);
	pItem->setScaleX(0.667f);
	pItem->setScaleY(0.6f);

// pMenu = Ccmenu::create(pItem,NULL); xueguoliang
	pMenu = Ccmenu::create(pItem,1);

	// 难度按钮
	pItem = CcmenuItemImage::create(RES_PATH"difficulty.jpg",RES_PATH"difficulty.jpg",menu_selector(CCMainMenu::menuHardChoose));
	pItem->setPosition(ccp(m_fPositionX - s.width/6,m_fPositionY - s.height/8*4));
	pItem->setAnchorPoint(CCPointZero);
	pItem->setScaleX(0.667f);
	pItem->setScaleY(0.6f);

	pMenu = Ccmenu::create(pItem,1);

	// 声音按钮
	m_pOpenVolice = CcmenuItemImage::create(RES_PATH"openVolice.png",RES_PATH"openVolice.png",menu_selector(CCMainMenu::menuSoundChoose));
	CCSize r2 = m_pOpenVolice->getContentSize();
	m_pOpenVolice->setPosition(ccp(m_fPositionX - s.width/6 + r.size.width/2 - r2.width/6,m_fPositionY - s.height/8*5));
	m_pOpenVolice->setAnchorPoint(CCPointZero);
	m_pOpenVolice->setScaleX(0.667f);
	m_pOpenVolice->setScaleY(0.6f);
	pMenu = Ccmenu::create(m_pOpenVolice,1,100);

	// 关闭声音按钮
	m_pCloseVolice = CcmenuItemImage::create(RES_PATH"closeVolice.png",RES_PATH"closeVolice.png",menu_selector(CCMainMenu::menuSoundChoose));
	m_pCloseVolice->setPosition(ccp(m_fPositionX - s.width/6 + r.size.width/2 - r2.width/6,m_fPositionY - s.height/8*5));
	m_pCloseVolice->setAnchorPoint(CCPointZero);
	m_pCloseVolice->setScaleX(0.667f);
	m_pCloseVolice->setScaleY(0.6f);
	pMenu = Ccmenu::create(m_pCloseVolice,NULL);
	pMenu->setPosition(CCPointZero);
	m_pCloseVolice->setVisible(false);
	this->addChild(pMenu,101);

	// 坐标信息
	this->initCoordinate();
	// 初始化时间
	this->initTimeShow();
	// 初始化图片
	this->initListimage();
	
	this->setTouchEnabled(true);

	this->schedule(schedule_selector(CCMainMenu::updateTime),1.0f);

	// 这个相当于做一个双buffer,移动一个buffer,显示一个buffer
	for (int i = 0; i < 10; ++i)
	{
		for (int j = 0; j < 9; ++j)
		{
			g_cur_map[i][j] = g_chess_map[i][j];
		}
	}

	// 一些游戏中用到的状态变量,需要的时候我们再详细描述
	m_enGameStatus		= GAME_MENU;
	m_enCurRole			= ROLE_RED;
	m_bVolice			= true;
	m_pCurChess			= NULL;
	m_bSelect			= false;
	m_bCollectCorrect	= true;
	m_pTargetChess		= NULL;
	m_nContinuous		= 3;
	m_nCur				= 0;
	m_enCurChesstype	= CHESS_NONE;
	m_enTarChesstype    = CHESS_NONE;
	m_nWin				= -1;
	m_vecSprite.reserve(10);	
	return true;
}
init函数执行完之后,程序就显示出主界面如下:

 

分享图片分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽!还带黄段子!希望你也加入到我们人工智能的队伍中来!

https://blog.csdn.net/jiangjunshow

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐