cocos2d-x游戏开发系列教程-中国象棋04-摆棋
前情回顾
在之前的学习中,我们已经了解到,下棋主界面是由CCMainMenu类实现的,在它的init函数中,初始化了
主界面需要的各种数据,包括:创建控件,初始化32个棋子,初始化执行变量等等,在这个博文中,我们
主要来学习,32个棋子是如何被初始化并显示在界面上的。这个显示和initCoordinate以及
了解32个棋子显示在界面的目的,是为了让大家更好理解32个棋子的数据结构,这些数据结构在当棋子走动
时,需要改动,所以必须要理解。
initCoordinate
void CCMainMenu::initCoordinate()
{
/*std::string str = "../coordinate.txt";
std::ofstream f_output;
f_output.open(str.c_str(), std::ios::app);*/
float xSpan = 48.0f*0.667f;
float ySpan = 32.0f*0.6f;
float xStart = 1;
float yStart = xSpan;
for (int i = 0, x = 9; i < 10; ++i, --x)
{
for (int j = 0, y = 1; j < 9; ++j, ++y)
{
g_chess_coord[i][j] = ccp(xStart + xSpan*y, yStart*x + ySpan); // 计算象棋坐标点的坐标,把象棋坐标转化成view坐标
/*f_output<< "[" << i << "][" << j <<"]: (" << xStart + xSpan*y << ", " << yStart*x + ySpan << ")" << " ";
if(j == 4 || j == 8)
{
f_output<<std::endl;
}*/
}
/*f_output<<std::endl;*/
}
/*f_output.close();*/
}
这个函数功能是将象棋的坐标转化成屏幕坐标,并保存在g_chess_coord中。有了这些坐标,为后面的摆棋工作打下基础。
initListImage
initListImage函数,初始化了32个棋子的位置,代码的逻辑很简单,就是调用32次getListSprite,获得32个棋子精灵并保存在m_pChess中
然后调用initChessPosition去设置32个棋子的位置,代码在MainMenu.cpp中
void CCMainMenu::initListImage()
{
// red
m_pChess[1][0] = this->getListSprite(CHESS_RK);
this->addChild(m_pChess[1][0], 0); m_pChess[1][1] = this->getListSprite(CHESS_RA);
this->addChild(m_pChess[1][1], 0); m_pChess[1][2] = this->getListSprite(CHESS_RA);
this->addChild(m_pChess[1][2], 0); m_pChess[1][3] = this->getListSprite(CHESS_RB);
this->addChild(m_pChess[1][3], 0); m_pChess[1][4] = this->getListSprite(CHESS_RB);
this->addChild(m_pChess[1][4], 0); m_pChess[1][5] = this->getListSprite(CHESS_RN);
this->addChild(m_pChess[1][5], 0); m_pChess[1][6] = this->getListSprite(CHESS_RN);
this->addChild(m_pChess[1][6], 0); m_pChess[1][7] = this->getListSprite(CHESS_RR);
this->addChild(m_pChess[1][7], 0); m_pChess[1][8] = this->getListSprite(CHESS_RR);
this->addChild(m_pChess[1][8], 0); m_pChess[1][9] = this->getListSprite(CHESS_RC);
this->addChild(m_pChess[1][9], 0); m_pChess[1][10] = this->getListSprite(CHESS_RC);
this->addChild(m_pChess[1][10], 0); m_pChess[1][11] = this->getListSprite(CHESS_RP);
this->addChild(m_pChess[1][11], 0); m_pChess[1][12] = this->getListSprite(CHESS_RP);
this->addChild(m_pChess[1][12], 0); m_pChess[1][13] = this->getListSprite(CHESS_RP);
this->addChild(m_pChess[1][13], 0); m_pChess[1][14] = this->getListSprite(CHESS_RP);
this->addChild(m_pChess[1][14], 0); m_pChess[1][15] = this->getListSprite(CHESS_RP);
this->addChild(m_pChess[1][15], 0); //black
m_pChess[0][0] = this->getListSprite(CHESS_BK);
this->addChild(m_pChess[0][0], 0); m_pChess[0][1] = this->getListSprite(CHESS_BA);
this->addChild(m_pChess[0][1], 0); m_pChess[0][2] = this->getListSprite(CHESS_BA);
this->addChild(m_pChess[0][2], 0); m_pChess[0][3] = this->getListSprite(CHESS_BB);
this->addChild(m_pChess[0][3], 0); m_pChess[0][4] = this->getListSprite(CHESS_BB);
this->addChild(m_pChess[0][4], 0); m_pChess[0][5] = this->getListSprite(CHESS_BN);
this->addChild(m_pChess[0][5], 0); m_pChess[0][6] = this->getListSprite(CHESS_BN);
this->addChild(m_pChess[0][6], 0); m_pChess[0][7] = this->getListSprite(CHESS_BR);
this->addChild(m_pChess[0][7], 0); m_pChess[0][8] = this->getListSprite(CHESS_BR);
this->addChild(m_pChess[0][8], 0); m_pChess[0][9] = this->getListSprite(CHESS_BC);
this->addChild(m_pChess[0][9], 0); m_pChess[0][10] = this->getListSprite(CHESS_BC);
this->addChild(m_pChess[0][10], 0); m_pChess[0][11] = this->getListSprite(CHESS_BP);
this->addChild(m_pChess[0][11], 0); m_pChess[0][12] = this->getListSprite(CHESS_BP);
this->addChild(m_pChess[0][12], 0); m_pChess[0][13] = this->getListSprite(CHESS_BP);
this->addChild(m_pChess[0][13], 0); m_pChess[0][14] = this->getListSprite(CHESS_BP);
this->addChild(m_pChess[0][14], 0); m_pChess[0][15] = this->getListSprite(CHESS_BP);
this->addChild(m_pChess[0][15], 0); this->initChessPosition();
}
getListSprite
这个函数负责创建棋子精灵,根据不同的棋子类型,使用不同的图片创建精灵,在你们自己的环境中,尤其注意图片路径
图片路劲不对,那什么都不显示,所以如果有错,先考虑是不是图片路径不对了。
CCSprite* CCMainMenu::getListSprite(CHESS_TYPE nType)
{
CCSprite* pSprite;
switch(nType)
{
case CHESS_RK:
pSprite = CCSprite::create(RES_PATH"rk.png");
break;
case CHESS_RA:
pSprite = CCSprite::create(RES_PATH"ra.png");
break;
case CHESS_RB:
pSprite = CCSprite::create(RES_PATH"rb.png");
break;
case CHESS_RN:
pSprite = CCSprite::create(RES_PATH"rn.png");
break;
case CHESS_RR:
pSprite = CCSprite::create(RES_PATH"rr.png");
break;
case CHESS_RC:
pSprite = CCSprite::create(RES_PATH"rc.png");
break;
case CHESS_RP:
pSprite = CCSprite::create(RES_PATH"rp.png");
break;
case CHESS_BK:
pSprite = CCSprite::create(RES_PATH"bk.png");
break;
case CHESS_BA:
pSprite = CCSprite::create(RES_PATH"ba.png");
break;
case CHESS_BB:
pSprite = CCSprite::create(RES_PATH"bb.png");
break;
case CHESS_BN:
pSprite = CCSprite::create(RES_PATH"bn.png");
break;
case CHESS_BR:
pSprite = CCSprite::create(RES_PATH"br.png");
break;
case CHESS_BC:
pSprite = CCSprite::create(RES_PATH"bc.png");
break;
case CHESS_BP:
pSprite = CCSprite::create(RES_PATH"bp.png");
break;
} pSprite->setScaleX(0.5f);
pSprite->setScaleY(0.5f);
return pSprite;
}
initChessPosition
initListImage最后调用的是initChessPosition,为32个棋子指定位置。这里位置信息用到了g_chess_coord,这个坐标信息是之前函数
void CCMainMenu::initChessPosition()
{
m_pChess[1][0]->setPosition(g_chess_coord[9][4]);
m_pChess[1][1]->setPosition(g_chess_coord[9][3]);
m_pChess[1][2]->setPosition(g_chess_coord[9][5]);
m_pChess[1][3]->setPosition(g_chess_coord[9][2]);
m_pChess[1][4]->setPosition(g_chess_coord[9][6]);
m_pChess[1][5]->setPosition(g_chess_coord[9][1]);
m_pChess[1][6]->setPosition(g_chess_coord[9][7]);
m_pChess[1][7]->setPosition(g_chess_coord[9][0]);
m_pChess[1][8]->setPosition(g_chess_coord[9][8]);
m_pChess[1][9]->setPosition(g_chess_coord[7][1]);
m_pChess[1][10]->setPosition(g_chess_coord[7][7]);
m_pChess[1][11]->setPosition(g_chess_coord[6][0]);
m_pChess[1][12]->setPosition(g_chess_coord[6][2]);
m_pChess[1][13]->setPosition(g_chess_coord[6][4]);
m_pChess[1][14]->setPosition(g_chess_coord[6][6]);
m_pChess[1][15]->setPosition(g_chess_coord[6][8]);
//black
m_pChess[0][0]->setPosition(g_chess_coord[0][4]);
m_pChess[0][1]->setPosition(g_chess_coord[0][3]);
m_pChess[0][2]->setPosition(g_chess_coord[0][5]);
m_pChess[0][3]->setPosition(g_chess_coord[0][2]);
m_pChess[0][4]->setPosition(g_chess_coord[0][6]);
m_pChess[0][5]->setPosition(g_chess_coord[0][1]);
m_pChess[0][6]->setPosition(g_chess_coord[0][7]);
m_pChess[0][7]->setPosition(g_chess_coord[0][0]);
m_pChess[0][8]->setPosition(g_chess_coord[0][8]);
m_pChess[0][9]->setPosition(g_chess_coord[2][1]);
m_pChess[0][10]->setPosition(g_chess_coord[2][7]);
m_pChess[0][11]->setPosition(g_chess_coord[3][0]);
m_pChess[0][12]->setPosition(g_chess_coord[3][2]);
m_pChess[0][13]->setPosition(g_chess_coord[3][4]);
m_pChess[0][14]->setPosition(g_chess_coord[3][6]);
m_pChess[0][15]->setPosition(g_chess_coord[3][8]);
}
好,当程序完全执行完这些代码后,就完成了32个棋子的初始化。
下一遍博文我们讲讲述这个象棋是怎么走起来
cocos2d-x游戏开发系列教程-中国象棋04-摆棋的更多相关文章
- cocos2d-x游戏开发系列教程-中国象棋00-前言
象棋描述 在说代码之前,我们先让象棋效果登场,以方便大家对代码的理解 欢迎界面 中国象棋程序,运行起来的第一个界面是一个欢迎界面,该欢迎界面在停留一秒后进入游戏界面 游戏主界面 新局:所有棋子归位,状 ...
- cocos2d-x游戏开发系列教程-中国象棋02-main函数和欢迎页面
之前两个博客讲述了象棋的规格和工程文件之后,我们继续深入的从代码开始学习cocos2dx 首先从程序入口main函数开始 main函数 int APIENTRY _tWinMain(HINSTANCE ...
- cocos2d-x游戏开发系列教程-中国象棋01-工程文件概述
上一篇博文我们看到了象棋的效果图,这一张我们来看象棋代码的整体概述 让我们先对整个代码框架有个了解. 主目录: 主目录包含内容如上图: classes目录:业务代码 proj.win32:包括main ...
- cocos2d-x游戏开发系列教程-中国象棋03-主界面
前情回顾 上个博客说道我们象棋程序进入了欢迎界面,在欢迎界面下等待一秒进入主界面 进入主界面的关键代码如下: CCScene* pScene = CCMainMenu::scene(); 创建sce ...
- cocos2d-x游戏开发系列教程-中国象棋06-游戏规则
前情回顾 上一个博文我们提到象棋运动的函数dealWithChess,但是只是说该函数完成了棋子的选择和移动功能 其实在这个函数里,在移动棋子之前,是要对棋子的移动是否合法进行判断的,我们一起来看看如 ...
- cocos2d-x游戏开发系列教程-中国象棋05-开始游戏
前情回顾 通过CCMainMenu的init函数,已经把所有的按钮,棋子都摆放完毕了,但是这个时候,棋子是不能走动的,只有在开始游戏之后才能移动棋子. 点击
- HTML5游戏开发系列教程7(译)
原文地址:http://www.script-tutorials.com/html5-game-development-lesson-7/ 今天我们将完成我们第一个完整的游戏--打砖块.这次教程中,将 ...
- HTML5游戏开发系列教程6(译)
原文地址:http://www.script-tutorials.com/html5-game-development-lesson-6/ 这是我们最新一篇HTML5游戏开发系列文章.我们将继续使用c ...
- HTML5游戏开发系列教程5(译)
原文地址:http://www.script-tutorials.com/html5-game-development-lesson-5/ 最终我决定准备下一篇游戏开发系列的文章,我们将继续使用can ...
随机推荐
- 法方总经理用的笔记本电脑&一体机拆开图。
键盘上有三个字符,
- 加特殊符号星号斜杠反斜杠/* \ */ !important等让css实现兼容各个浏览器的技巧的代码
在编写css样式表的时候常常会碰到一写浏览器兼容的问题,象是不同内核的浏览器显示就不一定相同,不同版本的的浏览器也会产生上下兼容的问题,如何解决这些问题成了我们苦恼的问题,如果你对css hac ...
- linux分区工具fdisk的使用
fdisk是linux下的一块分区工具,使用简单方便,由于是对系统进行修改,需要root权限. 常用参数如下: fdisk -l : 列出所有的硬盘信息 直接传入设备名称可进入对该硬盘分区.例如,f ...
- XIV
http://publib.boulder.ibm.com/infocenter/ibmxiv/r2/index.jsp
- Qt下如何修改文件的时间(全平台修改)
提供一个全平台修改文件的时间的方法,希望大家喜欢 /* UTIME.C: This program uses _utime to set the * file-modification time to ...
- vim Ctags 和taglist安装和使用
Ctags是一个用于从程序源代码树产生索引文件(或tag文件),从而便于文本编辑器来实现快速定位的实用工具.在产生的tag文件中,每一个tag的入口指向了一个编程语言的对象.这个对象可以是变量定义.函 ...
- 啊上班的二号i将诶
http://www.huihui.cn/share/8112372 http://www.huihui.cn/share/8112363 http://www.huihui.cn/share/811 ...
- 宣布正式发布 Biz Talk Services、Azure Active Directory 和 Traffic Manager, 同时发布 Azure Active Directory 高级版预览
除经济优势之外,云计算还在可转化为竞争优势的应用程序开发方面提供了更大的灵活性.我们很高兴看到每天创建的新 Windows Azure 订阅超过 1000 个,更令人兴奋的是,有一半客户使用价值更高的 ...
- Uva 12569 Planning mobile robot on Tree (EASY Version)
基本思路就是Bfs: 本题的一个关键就是如何判段状态重复. 1.如果将状态用一个int型数组表示,即假设为int state[17],state[0]代表机器人的位置,从1到M从小到大表示障碍物的位置 ...
- poj 1084 Brainman(归并排序)
题目链接:http://poj.org/problem?id=1804 思路分析:序列的逆序数即为交换次数,所以求出该序列的逆序数即可. 根据分治法思想,序列分为两个大小相等的两部分,分别求子序列的逆 ...