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

原文地址:https://www.cnblogs.com/wicnwicnwh/p/10309380.html

时间: 2024-10-13 15:42:09

cocos2d-x游戏开发系列教程-中国象棋03-主界面的相关文章

微信公众号开发系列教程一(调试环境部署)

原文:微信公众号开发系列教程一(调试环境部署) 目录 C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) 微信公众号火了好一阵子了,笔者算是比较早接触微信公众号开发的了,大概做了一年半了,从最开始的到处网上找demo到现在也开发一些公众号.园子里关于微信开发的教程已经数不胜数了,我也准备来凑凑热闹.一是梳理下这段时间开发的经验,二是希望能帮到想做微信开发的小伙伴们,希望大大神们吐槽的时候悠着点,

C#微信公众号开发系列教程二(新手接入指南)

http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可直接跳过,也欢迎大神吐槽. 目录 C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流程是这样的,用户发送消息到微信服务器,微

《Python3 bottle Web开发系列教程》

<Python3 bottle Web开发系列教程——前言> http://blog.91duofanli.com/opensource/%E3%80%8APython3+bottle+Web%E5%BC%80%E5%8F%91%E7%B3%BB%E5%88%97%E6%95%99%E7%A8%8B%E2%80%94%E2%80%94%E5%89%8D%E8%A8%80%E3%80%8B bottle web开发环境搭建 http://blog.91duofanli.com/opensourc

C#微信公众号开发系列教程三(消息体签名及加解密)

  C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南)    距离上一篇博文已经半个月了,本来打算每两天更新一次的,但可怜苦逼码农无日无夜的加班.第一篇博文发表后,博文视点的编辑就找到我,问我想不想出版这个系列,我当时瞬间就想到了王大锤的独白,想想真的是有点小激动,后面按照那边的要求,提交了申请书,也提交了目录,可惜文笔不行,再加上最近太忙,样稿一直没有给他,感觉挺愧疚了.真心希望能帮一下迷茫的

微信公众号开发系列教程一(调试环境部署续:vs远程调试)

原文:微信公众号开发系列教程一(调试环境部署续:vs远程调试) 目录 C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) 前几天决定写个微信公众平台开发系列,在发布第一篇博文后,收到了很多园友的反馈和建议,在这里感谢大家的支持,我会坚持写完这个系列,希望能帮助更多的小伙伴.特别要感谢下@ZIP,是他的一个提醒才有了这篇博文.也希望更多的小伙伴能把你的想法反馈给我. 上一篇中主要介绍的是使用花生壳

C#微信公众号开发系列教程五(接收事件推送与消息排重)

微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C#微信公众号开发系列教程四(接收普通消息) C#微信公众号开发系列教程五(接收事件推送与消息排重) 在上一篇的博文中讲到,微信的消息可以大体分为两种类型,一种是包括:文本,语音,图片等的普通消息,另一种就是本篇要将的事件类型.包括:关注/取消关注事件,扫描带参数二维码事件,上报地理位置事件,自定义菜

C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件)

原文:C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件) 微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C#微信公众号开发系列教程四(接收普通消息) C#微信公众号开发系列教程五(接收事件推送与消息排重) C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件) 第四,第五章已经讲了怎么处理用户发送的消息,本章就来讲讲怎么响应用户的

微信开发系列教程:(1)订阅号和服务号深入分析

微信开发系列教程,将以一个实际的微信平台项目为案例,深入浅出的讲解微信开发.应用各环节的实现方案和技术细节. 原创内容,欢迎转载,转载请注明出处. 首先在第1章节中,我们先理清什么是订阅号,什么又是服务号,以及两者的关键性区别. 订阅号和服务号统称为微信公众号. 订阅号强调媒体资讯属性,为会员提供信息订阅,适用于新闻传媒类企业.订阅号从某种意义上来讲,是拿来做内容的,如果你没有原创作品,对用户没有任何意义. 服务号强调服务和应用属性,旨在为会员提供服务并与之互动.支持所有微信高级接口,几乎所有的

编程之美笔记--第一章游戏之乐--1.2中国象棋将帅问题

后来一版作者又将最后一句改为:”要求在代码中只能使用一个字节存储变量“. 我的解法: package android.zlb.java; /** * * @author zhanglibin * */ public class TestXiangqi { public static void main(String[] args) { for(int i = 11; i < 100; i++) { if(i / 10 % 3 == 1 && (i % 10 == 1 || i % 1