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

Posted wicnwicnwh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 x, 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", this, 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, NULL);
	pMenu->setPosition(CCPointZero);
	this->addChild(pMenu, 1);

	// 开始按钮
	pItem = CCMenuItemImage::create(RES_PATH"start.jpg", RES_PATH"start.jpg", this, 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, NULL);
	pMenu->setPosition(CCPointZero);
	this->addChild(pMenu, 1);

	// 难度按钮
	pItem = CCMenuItemImage::create(RES_PATH"difficulty.jpg", RES_PATH"difficulty.jpg", this, 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, NULL);
	pMenu->setPosition(CCPointZero);
	this->addChild(pMenu, 1);

	// 声音按钮
	m_pOpenVolice = CCMenuItemImage::create(RES_PATH"openVolice.png", RES_PATH"openVolice.png", this, 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, NULL);
	pMenu->setPosition(CCPointZero);
	this->addChild(pMenu, 1, 100);

	// 关闭声音按钮
	m_pCloseVolice = CCMenuItemImage::create(RES_PATH"closeVolice.png", RES_PATH"closeVolice.png", this, 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, 1, 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

以上是关于cocos2d-x游戏开发系列教程-中国象棋03-主界面的主要内容,如果未能解决你的问题,请参考以下文章

Cocos2d-x 3.0final 终结者系列教程13-贪食蛇游戏案例(全)

火云开发课堂 - 《使用Cocos2d-x 开发3D游戏》系列 第四节:3D公告板

Cocos2d-x 3.0final手机游戏开发视频教程2014 - 自学编程 -(陆续更新中)

通知!本人编著书籍《Cocos2d-x游戏开发 基础与实战》开始发售

Cocos2d-x 3.0final 终结者系列教程03-源代码文件夹说明

Cocos2d-x 3.0final 终结者系列教程02-开发环境的搭建