在博客上,以实现创建的游戏场景。而一些button,因为button落实到事件作出详细答复,需要使用一些功能摆棋。为此我特意button上的背面的具体实施,

在摆棋前先理清一下摆棋的思路:

1、创建一个Stone类处理棋子信息

2、建立一个表保存棋子信息

3、创建棋子

4、初始化棋子

5、摆棋子

摆棋的效果:

玩家持红棋

玩家持黑棋

创建一个Stone类用于处理棋子的信息。设置Stone类由CCSprite派生而来

//棋子类
class Stone : public CCSprite
{
public: Stone(); //棋子的类型:将、士、相、车、马、炮、兵
enum TYPE {JIANG,SHI,XIANG,CHE,MA,PAO,BING}; //创建棋子
//第一个參数:棋子的类型
//第二个參数:棋子的颜色
static Stone* create(int id, bool red); //初始化棋子
bool init(int id, bool red); //摆棋子
void reset(bool red); //保存梅个棋子的初始位置
static struct InitPos
{
int _x;
int _y;
Stone::TYPE _type;
}_initPos[16]; CC_SYNTHESIZE(TYPE, _type, Type)
CC_SYNTHESIZE(int, _x, X)
CC_SYNTHESIZE(int, _y, Y)
CC_SYNTHESIZE(int, _id, ID)
CC_SYNTHESIZE(bool, _dead, Dead)
CC_SYNTHESIZE(bool, _red, Red)
/*//棋子的位置(坐标)
int x;
int y; int _id;//棋子的ID 0~31(一共同拥有32个棋子) bool dead;//推断棋子是否被吃了 bool _red;//推断棋子的颜色*/
};

建立一个表保存棋子的信息

//创建一张表
Stone::InitPos Stone::_initPos[16] =
{
//车的位置(0,0)
{0, 0, Stone::CHE}, //马的位置(1,0)
{1, 0, Stone::MA}, //相的位置(2,0)
{2, 0, Stone::XIANG}, //士的位置(3,0)
{3, 0, Stone::SHI}, //将的位置(4,0)
{4, 0, Stone::JIANG}, //士的位置(5,0)
{5, 0, Stone::SHI}, //相的位置(6,0)
{6, 0, Stone::XIANG}, //马的位置(7,0)
{7, 0, Stone::MA}, //车的位置(8,0)
{8, 0, Stone::CHE}, //炮的位置(1,2)
{1, 2, Stone::PAO}, //炮的位置(7,2)
{7, 2, Stone::PAO}, //兵的位置(0,3)
{0, 3, Stone::BING}, //兵的位置(2,3)
{2, 3, Stone::BING}, //兵的位置(4,3)
{4, 3, Stone::BING}, //兵的位置(6,3)
{6, 3, Stone::BING}, //兵的位置(8,3)
{8, 3, Stone::BING},
};

创建棋子

//创建棋子
//第一个參数:棋子的类型
//第二个參数:棋子的颜色
Stone* Stone::create(int id, bool red)
{
Stone* s = new Stone(); s->init(id, red); s->autorelease(); return s;
}

初始化棋子

/初始化棋子
//象棋的一次性初始化
bool Stone::init(int id, bool red)
{
_id = id;//获得棋子的id //当棋子的id小于16时,棋子是红色的
_red = _id < 16; //初始化红色的棋子
if(_id < 16)
{
_type = _initPos[_id]._type;
}
else//初始化黑色的棋子
{
//类型(车、马、炮)同样颜色不同的两个棋子的id相差16
_type = _initPos[_id-16]._type;
} const char* stonePic[14] = {
"rshuai.png", //(红色)帅
"rshi.png", //(红色)士
"rxiang.png", //(红色)相
"rche.png", //(红色)车
"rma.png", //(红色)马
"rpao.png", //(红色)炮
"rbing.png", //(红色)兵 "bjiang.png", //(黑色)将
"bshi.png", //(黑色)士
"bxiang.png", //(黑色)相
"bche.png", //(黑色)车
"bma.png", //(黑色)马
"bpao.png", //(黑色)炮
"bzu.png" //(黑色)卒
}; //计算图片的下标
//假设棋子是红色的 idx = _type
//假设棋子是黑色的 idx = 7 + _type
//两个棋子的颜色的下标相差 7
int idx = (_red ? 0 : 1) * 7 + _type; //创建精灵(创建棋子)
CCSprite::initWithFile(stonePic[idx]); //压缩棋子
setScale(.8f); //摆棋子(设置棋子的位置)
reset(red); return true;
}

摆放棋子

//摆放棋子
//參数:用于推断游戏玩家选择进入游戏场景时是否
//点了红色的棋子
void Stone::reset(bool red)
{
//刚摆棋子的时候棋子没被吃掉
this->setDead(false); if(red)//当玩家点红色的棋子进入游戏场景时
{//玩家的棋子的颜色为红色 if(_id < 16)//摆放红色的棋子
{
//设置棋子的x坐标
this->setX(_initPos[_id]._x); //设置棋子的y坐标
this->setY(_initPos[_id]._y);
}
else//摆放黑色的棋子
{
this->setX(8 - _initPos[_id-16]._x); //两个类型同样颜色不同的棋子的y坐标相差9
//如:红色的车和黑色的车的y坐标相差9
this->setY(9 - _initPos[_id-16]._y);
}
}
else//当玩家点黑色的棋子进入游戏场景时
{//玩家的棋子的颜色是黑色 if(_id < 16)//摆放黑色的棋子
{
this->setX(8 - _initPos[_id]._x);
this->setY(9 - _initPos[_id]._y);
}
else//摆放红色的棋子
{
//两个类型同样颜色不同的棋子的id相差16
//如:红色的车和黑色的车的id相差16
this->setX(_initPos[_id-16]._x);
this->setY(_initPos[_id-16]._y);
}
}
}

版权声明:本文博主原创文章。博客,未经同意不得转载。

Cocos2d-X中国象棋的发展《五岁以下儿童》摆棋的更多相关文章

  1. (五岁以下儿童)NS3样本演示:桥模块演示样品csma-bridge.cc凝视程序

    (五岁以下儿童)NS3:桥模块演示样品csma-bridge.cc凝视程序 1.Ns3 bridge模csma-bridge.cc演示示例程序的目光 // Network topology // // ...

  2. linux下一个Oracle11g RAC建立(五岁以下儿童)

    linux下一个Oracle11g RAC建立(五岁以下儿童) 四.建立主机之间的信任关系(node1.node2) 建立节点之间oracle .grid 用户之间的信任(通过ssh 建立公钥和私钥) ...

  3. python学习笔记(五岁以下儿童)深深浅浅的副本复印件,文件和文件夹

    python学习笔记(五岁以下儿童) 深拷贝-浅拷贝 浅拷贝就是对引用的拷贝(仅仅拷贝父对象) 深拷贝就是对对象的资源拷贝 普通的复制,仅仅是添加了一个指向同一个地址空间的"标签" ...

  4. PE文件结构(五岁以下儿童)基地搬迁

    PE文件结构(五岁以下儿童) 參考 书:<加密与解密> 视频:小甲鱼 解密系列 视频 基址重定位 链接器生成一个PE文件时,它会如果程序被装入时使用的默认ImageBase基地址(VC默认 ...

  5. cocos2D(五岁以下儿童)---- CCNode

    本将主要介绍下CCNode这个类.CCNode是全部节点的基类,当中包含我们经常使用的CCScene(场景).CCLayer(图层).CCSprite(精灵)等.它是一个不可以可视化显示的抽象类,仅仅 ...

  6. Log4j 2.0在具体解释发展先进的使用—SocketAppender远程输出(五岁以下儿童)

    Log4j2的Appenders充分考虑输出日志事件.包装和过滤可以被转发,它包含的主要输出到本地文件.输出到远程主机, 文件包.注射.而且,根据该日志文件的时间点.自己主动文件大小的储存条件. 例如 ...

  7. bluetooth发展(五岁以下儿童)------蓝牙功能测试(一个)

    newton板已出版.下面再组织我调试的一小方面,,蓝牙功能的实现和测试: 转载请注明出处:http://blog.csdn.net/wang_zheng_kai 以下是我写的newton开发板中bl ...

  8. ExtJs4得知(五岁以下儿童)主要的Ext分类

    Ext类是ExtJs最常见的.最基本的类,它是一个全局对象,它封装了全班.辛格尔顿和 Sencha 该方法提供了一种有用的库. 嵌套在该命名空间中一个较低的水平最用户界面组件. 但是提供了很多有用的功 ...

  9. Scrapy研究和探索(五岁以下儿童)——爬行自己主动多页(抢别人博客所有文章)

    首先.在教程(二)(http://blog.csdn.net/u012150179/article/details/32911511)中,研究的是爬取单个网页的方法.在教程(三)(http://blo ...

随机推荐

  1. MongoDbHelper 帮助类(上)

    在网上搜索mongodbHelper的帮助类时,出来的东西都大同小异,再此摘录一下. 这些代码也看了一遍,总是感觉重复的代码太多了,在后续的文章中又整合了一下,请看下篇,欢迎指正! using Sys ...

  2. 微信浏览器跳转外部浏览器 app下载

    这个是摘抄的,具体抄的哪里我忘记了,作为记录 2019年5月14日 现在这个好像也不好用了,微信又提示建议下载qq浏览器什么的,显示一个红色感叹号,让用户产生怀疑,很鄙视tx error_report ...

  3. 代码从windows下visual studio到andriod平台迁移的修改记录

    前言 前言也是迁言,从windows的visual studio 2012平台迁移到android平台上,需用修改挺多的代码和需用注意地方. 我们当然的平台当初就考虑了其他平台跨平台的应用问题,所以一 ...

  4. [PReact] Use Link State to Automatically Handle State Changes

    Storing and updating values inside a component’s local state (known as controlled components) is suc ...

  5. 【C++竞赛 A】xxx的项链

    时间限制:2s 内存限制:64MB 问题描述 xxx有一个长度为n的宝石链,宝石有m种不同的颜色.xxx想截取其中连续的一段做一个项链.为了让项链更漂亮,xxx希望项链中的宝石包含所有颜色. 输入描述 ...

  6. JAVA获取文件本身所在的磁盘位置

    我们在做java开发(纯java程序,或者java web开发)时,经常会遇到需要读取配置文件的需求,如果我们将文件所在位置的信息直接写到程序中,例如:e:\workspace\javagui\bin ...

  7. [Linux] Use find to search for filename patterns

    Learn how to use find to identify filenames matching specified patterns. We'll use find to identify ...

  8. Android JNI编程(四)——C语言多级指针、数组取值、从控制台输入数组

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:前面我们介绍了一级指针的相关概念和用发,今天我们就来说一说多级指针. 1 ...

  9. [React Native] Writing Platform-Specific Components for iOS and Android in React Native

    Learn to write components that render differently on iOS and Android, but present the same API. Firs ...

  10. android之ContentProvider和Uri具体解释

    一.使用ContentProvider(内容提供者)共享数据 在android中ContentProvider的作用是对外共享数据,就是说能够通过ContentProvider把应用中的数据共享给其它 ...